Skip to content

Commit bbd6db3

Browse files
Optimize file table creation, fixes ogham#484 as a side-effect
1 parent 89c861f commit bbd6db3

File tree

1 file changed

+6
-3
lines changed

1 file changed

+6
-3
lines changed

src/output/details.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161
6262

6363
use std::io::{Write, Error as IOError, Result as IOResult};
64+
use std::mem::MaybeUninit;
6465
use std::path::PathBuf;
6566
use std::vec::IntoIter as VecIntoIter;
6667

@@ -192,13 +193,13 @@ impl<'a> Render<'a> {
192193
use std::sync::{Arc, Mutex};
193194
use fs::feature::xattr;
194195

195-
let mut file_eggs = Vec::new();
196+
let mut file_eggs = (0..src.len()).map(|_| MaybeUninit::uninit()).collect::<Vec<_>>();
196197

197198
pool.scoped(|scoped| {
198199
let file_eggs = Arc::new(Mutex::new(&mut file_eggs));
199200
let table = table.as_ref();
200201

201-
for file in src {
202+
for (idx, file) in src.iter().enumerate() {
202203
let file_eggs = Arc::clone(&file_eggs);
203204

204205
scoped.execute(move || {
@@ -265,11 +266,13 @@ impl<'a> Render<'a> {
265266
} else { None };
266267

267268
let egg = Egg { table_row, xattrs, errors, dir, file, icon };
268-
file_eggs.lock().unwrap().push(egg);
269+
unsafe { std::ptr::write(file_eggs.lock().unwrap()[idx].as_mut_ptr(), egg) }
269270
});
270271
}
271272
});
272273

274+
// this is safe because all entries have been initialized above
275+
let mut file_eggs = unsafe { std::mem::transmute::<_, Vec<Egg>>(file_eggs) };
273276
self.filter.sort_files(&mut file_eggs);
274277

275278
for (tree_params, egg) in depth.iterate_over(file_eggs.into_iter()) {

0 commit comments

Comments
 (0)