chiark / gitweb /
shapelib: Use parking_lot, not rental
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 27 Nov 2020 23:53:18 +0000 (23:53 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 27 Nov 2020 23:53:47 +0000 (23:53 +0000)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/global.rs
src/shapelib.rs

index 76f452bd58b829254fb121b191c92863d08ed417..727ca8724818299ed360673efb4d0bf0f6f5a07c 100644 (file)
@@ -192,8 +192,6 @@ pub struct Global {
 
   // per-game lock:
   // <- InstanceContainer ->
-  pub shapelibs : RwLock<shapelib::Registry>,
-
   // inner locks which the game needs:
   dirty   : Mutex<VecDeque<InstanceRef>>,
   pub config: RwLock<Arc<ServerConfig>>,
index 3cd0e66e0f5008c07a3cb3c75cc5107b15ba7a25..76cc801401e0bd0b4657fa5e617a0d96f1f9171e 100644 (file)
@@ -4,6 +4,8 @@
 
 pub use crate::imports::*;
 
+use parking_lot::{RwLock, const_rwlock, RwLockReadGuard, MappedRwLockReadGuard};
+
 // Naming convention:
 //  *Data, *List   from toml etc. (processed if need be)
 //  *Defn          raw read from library toml file (where different from Info)
@@ -191,14 +193,19 @@ impl Piece for Item {
   
 }
 
+static SHAPELIBS : RwLock<Option<Registry>> = const_rwlock(None);
+
 #[throws(SpecError)]
 pub fn libs_lookup(libname: &str)
-                   -> RentRef<RwLockReadGuard<'static, Registry>,
-                              Contents> {
-  let libs = GLOBAL.shapelibs.read().unwrap();
-  RentRef::try_new(libs,|libs| Ok::<_,SpecError>({
-    libs.get(libname).ok_or(SE::LibraryNotFound)?
-  })).map_err(|e|e.0)?
+                   -> MappedRwLockReadGuard<'static, Contents> {
+  let libs = SHAPELIBS.read();
+  RwLockReadGuard::try_map( libs, |libs: &Option<Registry>| -> Option<_> {
+    (|| Some({
+      libs.as_ref()?.get(libname)?
+    }))()
+  })
+    .map_err(|_| SE::LibraryNotFound)
+    ?
 }
 
 impl ItemSpec {
@@ -398,7 +405,9 @@ pub struct Explicit1 {
 pub fn load1(l: &Explicit1) {
   let data = load_catalogue(&l.name, &l.dirname, &l.catalogue)?;
   let count = data.items.len();
-  GLOBAL.shapelibs.write().unwrap().insert(l.name.clone(), data);
+  SHAPELIBS.write()
+    .get_or_insert_with(default)
+    .insert(l.name.clone(), data);
   info!("loaded {} shapes in library {:?} from {:?} and {:?}",
         count, &l.name, &l.catalogue, &l.dirname);
 }