Skip to content

Commit 4c90a89

Browse files
add FxDashMap/FxDashSet (#261)
1 parent 6b07eec commit 4c90a89

File tree

7 files changed

+31
-26
lines changed

7 files changed

+31
-26
lines changed

Cargo.lock

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

crates/djls-bench/src/db.rs

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,38 @@
1-
use std::collections::HashMap;
21
use std::io;
32
use std::sync::Arc;
4-
use std::sync::Mutex;
53

64
use camino::Utf8Path;
75
use camino::Utf8PathBuf;
86
use djls_source::Db as SourceDb;
97
use djls_source::File;
8+
use djls_source::FxDashMap;
109
use djls_templates::Db as TemplateDb;
1110
use salsa::Setter;
1211

1312
#[salsa::db]
1413
#[derive(Clone)]
1514
pub struct Db {
16-
sources: Arc<Mutex<HashMap<Utf8PathBuf, String>>>,
15+
sources: Arc<FxDashMap<Utf8PathBuf, String>>,
1716
storage: salsa::Storage<Self>,
1817
}
1918

2019
impl Db {
2120
#[must_use]
2221
pub fn new() -> Self {
2322
Self {
24-
sources: Arc::new(Mutex::new(HashMap::new())),
23+
sources: Arc::new(FxDashMap::default()),
2524
storage: salsa::Storage::default(),
2625
}
2726
}
2827

29-
/// ## Panics
30-
///
31-
/// If sources mutex is poisoned.
3228
pub fn file_with_contents(&mut self, path: Utf8PathBuf, contents: &str) -> File {
33-
self.sources
34-
.lock()
35-
.expect("sources lock poisoned")
36-
.insert(path.clone(), contents.to_string());
29+
self.sources.insert(path.clone(), contents.to_string());
3730
File::new(self, path, 0)
3831
}
3932

40-
/// ## Panics
41-
///
42-
/// If sources mutex is poisoned.
4333
pub fn set_file_contents(&mut self, file: File, contents: &str, revision: u64) {
4434
let path = file.path(self);
45-
self.sources
46-
.lock()
47-
.expect("sources lock poisoned")
48-
.insert(path.clone(), contents.to_string());
35+
self.sources.insert(path.clone(), contents.to_string());
4936
file.set_revision(self).to(revision);
5037
}
5138
}
@@ -62,8 +49,11 @@ impl salsa::Database for Db {}
6249
#[salsa::db]
6350
impl SourceDb for Db {
6451
fn read_file_source(&self, path: &Utf8Path) -> io::Result<String> {
65-
let sources = self.sources.lock().expect("sources lock poisoned");
66-
Ok(sources.get(path).cloned().unwrap_or_default())
52+
Ok(self
53+
.sources
54+
.get(path)
55+
.map(|entry| entry.value().clone())
56+
.unwrap_or_default())
6757
}
6858
}
6959

crates/djls-source/Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ edition = "2021"
55

66
[dependencies]
77
camino = { workspace = true }
8+
dashmap = { workspace = true }
9+
rustc-hash = { workspace = true }
810
salsa = { workspace = true }
911
serde = { workspace = true }
1012
thiserror = { workspace = true }
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
use std::hash::BuildHasherDefault;
2+
3+
use dashmap::DashMap;
4+
use dashmap::DashSet;
5+
use rustc_hash::FxHasher;
6+
7+
pub type FxDashMap<K, V> = DashMap<K, V, BuildHasherDefault<FxHasher>>;
8+
pub type FxDashSet<K> = DashSet<K, BuildHasherDefault<FxHasher>>;

crates/djls-source/src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1+
mod collections;
12
mod db;
23
mod file;
34
mod line;
45
mod position;
56
mod protocol;
67

8+
pub use collections::FxDashMap;
9+
pub use collections::FxDashSet;
710
pub use db::Db;
811
pub use file::File;
912
pub use file::FileKind;

crates/djls-workspace/src/buffers.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
/// [`WorkspaceFileSystem`]: crate::fs::WorkspaceFileSystem
99
use std::sync::Arc;
1010

11-
use dashmap::DashMap;
11+
use djls_source::FxDashMap;
1212
use url::Url;
1313

1414
use crate::document::TextDocument;
@@ -35,14 +35,14 @@ use crate::document::TextDocument;
3535
/// [`WorkspaceFileSystem`]: crate::fs::WorkspaceFileSystem
3636
#[derive(Clone, Debug)]
3737
pub struct Buffers {
38-
inner: Arc<DashMap<Url, TextDocument>>,
38+
inner: Arc<FxDashMap<Url, TextDocument>>,
3939
}
4040

4141
impl Buffers {
4242
#[must_use]
4343
pub fn new() -> Self {
4444
Self {
45-
inner: Arc::new(DashMap::new()),
45+
inner: Arc::new(FxDashMap::default()),
4646
}
4747
}
4848

crates/djls-workspace/src/workspace.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ use std::sync::Arc;
88

99
use camino::Utf8Path;
1010
use camino::Utf8PathBuf;
11-
use dashmap::DashMap;
1211
use djls_source::File;
12+
use djls_source::FxDashMap;
1313
use djls_source::PositionEncoding;
1414
use tower_lsp_server::lsp_types::TextDocumentContentChangeEvent;
1515
use url::Url;
@@ -54,7 +54,7 @@ pub struct Workspace {
5454
/// Thread-safe shared buffer storage for open documents
5555
buffers: Buffers,
5656
/// Registry mapping file paths to Salsa [`File`] handles
57-
files: Arc<DashMap<Utf8PathBuf, File>>,
57+
files: Arc<FxDashMap<Utf8PathBuf, File>>,
5858
/// File system abstraction that checks buffers first, then disk
5959
file_system: Arc<WorkspaceFileSystem>,
6060
}
@@ -64,7 +64,7 @@ impl Workspace {
6464
#[must_use]
6565
pub fn new() -> Self {
6666
let buffers = Buffers::new();
67-
let files = Arc::new(DashMap::new());
67+
let files = Arc::new(FxDashMap::default());
6868
let file_system = Arc::new(WorkspaceFileSystem::new(
6969
buffers.clone(),
7070
Arc::new(OsFileSystem),

0 commit comments

Comments
 (0)