| @@ -1,6 +1,9 @@ |
| 1 | 1 | use crate::{data, index::traverse}; |
| 2 | | −use git_features::{interrupt::is_triggered, parallel, progress::Progress}; |
| 3 | | −use std::time::Instant; |
| 2 | +use git_features::{parallel, progress::Progress}; |
| 3 | +use std::{ |
| 4 | + sync::atomic::{AtomicBool, Ordering}, |
| 5 | + time::Instant, |
| 6 | +}; |
| 4 | 7 | |
| 5 | 8 | fn add_decode_result(lhs: &mut data::decode_entry::Outcome, rhs: data::decode_entry::Outcome) { |
| 6 | 9 | lhs.num_deltas += rhs.num_deltas; |
| @@ -24,6 +27,7 @@ pub struct Reducer<'a, P, E> { · 17 unmodified lines |
| 24 | 27 | then: Instant, |
| 25 | 28 | entries_seen: usize, |
| 26 | 29 | stats: traverse::Outcome, |
| 30 | + should_interrupt: &'a AtomicBool, |
| 27 | 31 | _error: std::marker::PhantomData<E>, |
| 28 | 32 | } |
| 29 | 33 | |
| @@ -35,6 +39,7 @@ where · 5 unmodified lines |
| 35 | 39 | progress: &'a parking_lot::Mutex<P>, |
| 36 | 40 | pack_data_len_in_bytes: usize, |
| 37 | 41 | check: traverse::SafetyCheck, |
| 42 | + should_interrupt: &'a AtomicBool, |
| 38 | 43 | ) -> Self { |
| 39 | 44 | let stats = traverse::Outcome { |
| 40 | 45 | pack_size: pack_data_len_in_bytes as u64, |
| @@ -45,6 +50,7 @@ where · 4 unmodified lines |
| 45 | 50 | check, |
| 46 | 51 | then: Instant::now(), |
| 47 | 52 | entries_seen: 0, |
| 53 | + should_interrupt, |
| 48 | 54 | stats, |
| 49 | 55 | _error: Default::default(), |
| 50 | 56 | } |
| @@ -93,7 +99,7 @@ where · 42 unmodified lines |
| 93 | 99 | add_decode_result(&mut self.stats.average, chunk_total); |
| 94 | 100 | self.progress.lock().set(self.entries_seen); |
| 95 | 101 | |
| 96 | | − if is_triggered() { |
| 102 | + if self.should_interrupt.load(Ordering::SeqCst) { |
| 97 | 103 | return Err(Self::Error::Interrupted); |
| 98 | 104 | } |
| 99 | 105 | Ok(()) |