@@ -56,31 +56,20 @@ where
56
56
) ;
57
57
let ( chunk_size, thread_limit, _) =
58
58
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 ( ) ) ;
60
59
{
61
60
let progress = Arc :: new ( parking_lot:: Mutex :: new ( progress. add_child ( "resolving" ) ) ) ;
62
61
progress. lock ( ) . init ( None , git_features:: progress:: count ( "counts" ) ) ;
63
62
let enough_counts_present = counts. len ( ) > 4_000 ;
64
63
let start = std:: time:: Instant :: now ( ) ;
65
64
parallel:: in_parallel_if (
66
65
|| enough_counts_present,
67
- chunks . clone ( ) ,
66
+ counts . chunks_mut ( chunk_size ) ,
68
67
thread_limit,
69
68
|_n| Vec :: < u8 > :: new ( ) ,
70
69
{
71
70
let progress = Arc :: clone ( & progress) ;
72
- let counts = & counts;
73
71
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| {
84
73
let chunk_size = chunk. len ( ) ;
85
74
for count in chunk {
86
75
use crate :: data:: output:: count:: PackLocation :: * ;
@@ -135,8 +124,10 @@ where
135
124
index
136
125
}
137
126
} ;
127
+
138
128
let counts = Arc :: new ( counts) ;
139
129
let progress = Arc :: new ( parking_lot:: Mutex :: new ( progress) ) ;
130
+ let chunks = util:: ChunkRanges :: new ( chunk_size, counts. len ( ) ) ;
140
131
141
132
parallel:: reduce:: Stepwise :: new (
142
133
chunks. enumerate ( ) ,
0 commit comments