@@ -56,31 +56,20 @@ where
5656 ) ;
5757 let ( chunk_size, thread_limit, _) =
5858 parallel:: optimize_chunk_size_and_thread_limit ( chunk_size, Some ( counts. len ( ) ) , thread_limit, None ) ;
59- let chunks = util:: ChunkRanges :: new ( chunk_size, counts. len ( ) ) ;
6059 {
6160 let progress = Arc :: new ( parking_lot:: Mutex :: new ( progress. add_child ( "resolving" ) ) ) ;
6261 progress. lock ( ) . init ( None , git_features:: progress:: count ( "counts" ) ) ;
6362 let enough_counts_present = counts. len ( ) > 4_000 ;
6463 let start = std:: time:: Instant :: now ( ) ;
6564 parallel:: in_parallel_if (
6665 || enough_counts_present,
67- chunks . clone ( ) ,
66+ counts . chunks_mut ( chunk_size ) ,
6867 thread_limit,
6968 |_n| Vec :: < u8 > :: new ( ) ,
7069 {
7170 let progress = Arc :: clone ( & progress) ;
72- let counts = & counts;
7371 let db = db. clone ( ) ;
74- move |chunk_range, buf| {
75- let chunk = {
76- let c = & counts[ chunk_range] ;
77- let mut_ptr = c. as_ptr ( ) as * mut output:: Count ;
78- // SAFETY: We know that 'chunks' is only non-overlapping slices, and this function owns `counts`.
79- #[ allow( unsafe_code) ]
80- unsafe {
81- std:: slice:: from_raw_parts_mut ( mut_ptr, c. len ( ) )
82- }
83- } ;
72+ move |chunk, buf| {
8473 let chunk_size = chunk. len ( ) ;
8574 for count in chunk {
8675 use crate :: data:: output:: count:: PackLocation :: * ;
@@ -135,8 +124,10 @@ where
135124 index
136125 }
137126 } ;
127+
138128 let counts = Arc :: new ( counts) ;
139129 let progress = Arc :: new ( parking_lot:: Mutex :: new ( progress) ) ;
130+ let chunks = util:: ChunkRanges :: new ( chunk_size, counts. len ( ) ) ;
140131
141132 parallel:: reduce:: Stepwise :: new (
142133 chunks. enumerate ( ) ,
0 commit comments