Skip to content

Commit 0054cf0

Browse files
authored
perf: lock-free hashing for string interns (#3091)
1 parent 8490729 commit 0054cf0

File tree

23 files changed

+204
-131
lines changed

23 files changed

+204
-131
lines changed

Cargo.lock

Lines changed: 13 additions & 13 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

yazi-actor/src/mgr/cd.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,13 +78,13 @@ impl Cd {
7878
Ok(s) => {
7979
let Ok(url) = UrlBuf::try_from(s).map(expand_url) else { return };
8080

81-
let Ok(file) = File::new(url.clone()).await else { return };
81+
let Ok(file) = File::new(&url).await else { return };
8282
if file.is_dir() {
8383
return MgrProxy::cd(&url);
8484
}
8585

8686
if let Some(p) = url.parent_url() {
87-
FilesOp::Upserting(p, [(url.urn_owned(), file)].into()).emit();
87+
FilesOp::Upserting(p.into(), [(url.urn_owned(), file)].into()).emit();
8888
}
8989
MgrProxy::reveal(&url);
9090
}

yazi-actor/src/mgr/create.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,16 +48,16 @@ impl Create {
4848
provider::create_dir_all(&new).await?;
4949
} else if let Some(real) = realname(&new).await {
5050
ok_or_not_found(provider::remove_file(&new).await)?;
51-
FilesOp::Deleting(parent.clone(), [UrnBuf::from(real)].into()).emit();
51+
FilesOp::Deleting(parent.to_owned(), [UrnBuf::from(real)].into()).emit();
5252
provider::create(&new).await?;
5353
} else {
5454
provider::create_dir_all(&parent).await.ok();
5555
ok_or_not_found(provider::remove_file(&new).await)?;
5656
provider::create(&new).await?;
5757
}
5858

59-
if let Ok(f) = File::new(new.clone()).await {
60-
FilesOp::Upserting(parent, [(f.urn_owned(), f)].into()).emit();
59+
if let Ok(f) = File::new(&new).await {
60+
FilesOp::Upserting(parent.into(), [(f.urn_owned(), f)].into()).emit();
6161
MgrProxy::reveal(&new)
6262
}
6363
Ok(())

yazi-actor/src/mgr/open.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ impl Actor for Open {
5555
tokio::spawn(async move {
5656
let mut files = Vec::with_capacity(todo.len());
5757
for i in todo {
58-
if let Ok(f) = File::new(targets[i].0.clone()).await {
58+
if let Ok(f) = File::new(&targets[i].0).await {
5959
files.push(f);
6060
}
6161
}

yazi-actor/src/mgr/rename.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,15 +69,15 @@ impl Rename {
6969

7070
if let Some(o) = overwritten {
7171
ok_or_not_found(provider::rename(&p_new.join(&o), &new).await)?;
72-
FilesOp::Deleting(p_new.clone(), [UrnBuf::from(o)].into()).emit();
72+
FilesOp::Deleting(p_new.to_owned(), [UrnBuf::from(o)].into()).emit();
7373
}
7474

75-
let file = File::new(new.clone()).await?;
75+
let file = File::new(&new).await?;
7676
if p_new == p_old {
77-
FilesOp::Upserting(p_old, [(n_old, file)].into()).emit();
77+
FilesOp::Upserting(p_old.into(), [(n_old, file)].into()).emit();
7878
} else {
79-
FilesOp::Deleting(p_old, [n_old].into()).emit();
80-
FilesOp::Upserting(p_new, [(n_new, file)].into()).emit();
79+
FilesOp::Deleting(p_old.into(), [n_old].into()).emit();
80+
FilesOp::Upserting(p_new.into(), [(n_new, file)].into()).emit();
8181
}
8282

8383
MgrProxy::reveal(&new);

yazi-actor/src/mgr/reveal.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ impl Actor for Reveal {
2626
// If the child is not hovered, which means it doesn't exist,
2727
// create a dummy file
2828
if !opt.no_dummy && tab.hovered().is_none_or(|f| &child != f.urn()) {
29-
let op = FilesOp::Creating(parent, vec![File::from_dummy(opt.target, None)]);
29+
let op = FilesOp::Creating(parent.into(), vec![File::from_dummy(opt.target, None)]);
3030
tab.current.update_pub(tab.id, op);
3131
}
3232

yazi-boot/src/boot.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ impl Boot {
3232
};
3333

3434
if provider::metadata(&entry).await.is_ok_and(|m| m.is_file()) {
35-
(parent, child)
35+
(parent.into(), child)
3636
} else {
3737
(entry, UrnBuf::default())
3838
}

yazi-core/src/mgr/linked.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,15 @@ impl DerefMut for Linked {
1717
}
1818

1919
impl Linked {
20-
pub fn from_dir<'a, 'b>(&'a self, url: &'b UrlBuf) -> Box<dyn Iterator<Item = &'a UrlBuf> + 'b>
20+
pub fn from_dir<'a, 'b, T>(&'a self, url: T) -> Box<dyn Iterator<Item = &'a UrlBuf> + 'b>
2121
where
2222
'a: 'b,
23+
T: Into<Url<'b>>,
2324
{
25+
let url = url.into();
2426
if url.scheme.is_virtual() {
2527
Box::new(iter::empty())
26-
} else if let Some(to) = self.get(url) {
28+
} else if let Some(to) = self.get(&url) {
2729
Box::new(self.iter().filter(move |(k, v)| *v == to && *k != url).map(|(k, _)| k))
2830
} else {
2931
Box::new(self.iter().filter(move |(_, v)| *v == url).map(|(k, _)| k))
@@ -34,7 +36,7 @@ impl Linked {
3436
if url.scheme.is_virtual() {
3537
vec![]
3638
} else if let Some((parent, urn)) = url.pair() {
37-
self.from_dir(&parent).map(|u| u.join(&urn)).collect()
39+
self.from_dir(parent).map(|u| u.join(&urn)).collect()
3840
} else {
3941
vec![]
4042
}

yazi-core/src/mgr/watcher.rs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,12 @@ impl Watcher {
6868
if !watched.contains(&p) && !LINKED.read().from_dir(&p).any(|u| watched.contains(u)) {
6969
continue;
7070
}
71-
out_tx.send(u).ok();
72-
if !parents.contains(&p) {
73-
out_tx.send(p.clone()).ok();
71+
if parents.contains(&p) {
72+
out_tx.send(u).ok();
73+
} else {
74+
let p = p.to_owned();
75+
out_tx.send(u).ok();
76+
out_tx.send(p.to_owned()).ok();
7477
parents.insert(p);
7578
}
7679
}
@@ -134,8 +137,8 @@ impl Watcher {
134137

135138
for u in urls {
136139
let Some((parent, urn)) = u.pair() else { continue };
137-
let Ok(file) = File::new(u).await else {
138-
ops.push(FilesOp::Deleting(parent, [urn].into()));
140+
let Ok(file) = File::new(&u).await else {
141+
ops.push(FilesOp::Deleting(parent.into(), [urn].into()));
139142
continue;
140143
};
141144

@@ -144,11 +147,11 @@ impl Watcher {
144147
|| realname_unchecked(u, &mut cached).await.is_ok_and(|s| urn.as_urn() == s);
145148

146149
if !eq {
147-
ops.push(FilesOp::Deleting(parent, [urn].into()));
150+
ops.push(FilesOp::Deleting(parent.into(), [urn].into()));
148151
continue;
149152
}
150153

151-
ops.push(FilesOp::Upserting(parent, [(urn, file)].into()));
154+
ops.push(FilesOp::Upserting(parent.into(), [(urn, file)].into()));
152155
}
153156

154157
FilesOp::mutate(ops);

yazi-core/src/tab/selected.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ impl Selected {
7272
self.inner.extend(urls.iter().enumerate().map(|(i, u)| (u.into(), now + i as u64)));
7373

7474
for u in parents {
75-
*self.parents.entry(UrlBufCov(u)).or_insert(0) += self.inner.len() - len;
75+
*self.parents.entry_ref(&UrlCov::new(u)).or_default() += self.inner.len() - len;
7676
}
7777
urls.len()
7878
}

0 commit comments

Comments
 (0)