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