Skip to content

Commit b200f7a

Browse files
Modernize hashmaps in cache
* lazy_static is no longer needed on modern rust * use rwlock
1 parent a0059f0 commit b200f7a

File tree

1 file changed

+16
-12
lines changed

1 file changed

+16
-12
lines changed

josh-core/src/cache.rs

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,22 @@
11
use super::*;
22
use std::collections::HashMap;
3+
use std::sync::{LazyLock, RwLock};
34

45
const CACHE_VERSION: u64 = 24;
56

67
lazy_static! {
78
static ref DB: std::sync::Mutex<Option<sled::Db>> = std::sync::Mutex::new(None);
8-
static ref REF_CACHE: std::sync::Mutex<HashMap<git2::Oid, HashMap<git2::Oid, git2::Oid>>> =
9-
std::sync::Mutex::new(HashMap::new());
10-
static ref POPULATE_MAP: std::sync::Mutex<HashMap<(git2::Oid, git2::Oid), git2::Oid>> =
11-
std::sync::Mutex::new(HashMap::new());
12-
static ref GLOB_MAP: std::sync::Mutex<HashMap<(git2::Oid, git2::Oid), git2::Oid>> =
13-
std::sync::Mutex::new(HashMap::new());
149
}
1510

11+
static REF_CACHE: LazyLock<RwLock<HashMap<git2::Oid, HashMap<git2::Oid, git2::Oid>>>> =
12+
LazyLock::new(Default::default);
13+
14+
static POPULATE_MAP: LazyLock<RwLock<HashMap<(git2::Oid, git2::Oid), git2::Oid>>> =
15+
LazyLock::new(Default::default);
16+
17+
static GLOB_MAP: LazyLock<RwLock<HashMap<(git2::Oid, git2::Oid), git2::Oid>>> =
18+
LazyLock::new(Default::default);
19+
1620
pub fn load(path: &std::path::Path) -> JoshResult<()> {
1721
*DB.lock()? = Some(
1822
sled::Config::default()
@@ -272,32 +276,32 @@ impl Transaction {
272276
}
273277

274278
pub fn insert_populate(&self, tree: (git2::Oid, git2::Oid), result: git2::Oid) {
275-
POPULATE_MAP.lock().unwrap().entry(tree).or_insert(result);
279+
POPULATE_MAP.write().unwrap().entry(tree).or_insert(result);
276280
}
277281

278282
pub fn get_populate(&self, tree: (git2::Oid, git2::Oid)) -> Option<git2::Oid> {
279-
return POPULATE_MAP.lock().unwrap().get(&tree).cloned();
283+
POPULATE_MAP.read().unwrap().get(&tree).cloned()
280284
}
281285

282286
pub fn insert_glob(&self, tree: (git2::Oid, git2::Oid), result: git2::Oid) {
283-
GLOB_MAP.lock().unwrap().entry(tree).or_insert(result);
287+
GLOB_MAP.write().unwrap().entry(tree).or_insert(result);
284288
}
285289

286290
pub fn get_glob(&self, tree: (git2::Oid, git2::Oid)) -> Option<git2::Oid> {
287-
return GLOB_MAP.lock().unwrap().get(&tree).cloned();
291+
GLOB_MAP.read().unwrap().get(&tree).cloned()
288292
}
289293

290294
pub fn insert_ref(&self, filter: filter::Filter, from: git2::Oid, to: git2::Oid) {
291295
REF_CACHE
292-
.lock()
296+
.write()
293297
.unwrap()
294298
.entry(filter.id())
295299
.or_default()
296300
.insert(from, to);
297301
}
298302

299303
pub fn get_ref(&self, filter: filter::Filter, from: git2::Oid) -> Option<git2::Oid> {
300-
if let Some(m) = REF_CACHE.lock().unwrap().get(&filter.id()) {
304+
if let Some(m) = REF_CACHE.read().unwrap().get(&filter.id()) {
301305
if let Some(oid) = m.get(&from) {
302306
if self.repo.odb().unwrap().exists(*oid) {
303307
return Some(*oid);

0 commit comments

Comments
 (0)