chiark / gitweb /
Replace a Mutex which was being an open-coded Lazy
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 11 Apr 2022 08:50:47 +0000 (09:50 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 11 Apr 2022 08:50:47 +0000 (09:50 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/shapelib.rs

index 1e896da1930f55db6b672fb63dab2ac4dafcbe35..c635733d548270e480c8a1f02f0f174511ddf2e5 100644 (file)
@@ -71,7 +71,7 @@ struct OccData_Internal {
   outline: Outline,
   desc: Html,
   xform: FaceTransform,
-  svgd: parking_lot::Mutex<Option<Arc<Html>>>,
+  svgd: lazy_init::Lazy<Result<Arc<Html>,SpecError>>,
 }
 
 #[derive(Error,Debug)]
@@ -574,23 +574,13 @@ impl Contents {
       },
       OccData::Internal(occ) => {
         let occ_name = occ.item_name.clone();
-        let svgd = {
-          let mut svgd = occ.svgd.lock();
-          let svgd = &mut *svgd;
-          let svgd = match svgd {
-            Some(svgd) => svgd.clone(),
-            None => {
-              let occ_data = self.load_svg(
-                occ.item_name.unnest::<GoodItemName>().unnest(),
-                /* original: */ lib_name, name.as_str()
-              )?;
-              let occ_data = Arc::new(occ_data);
-              *svgd = Some(occ_data.clone());
-              occ_data
-            },
-          };
-          svgd
-        };
+        let svgd = occ.svgd.get_or_create(||{
+          let occ_data = self.load_svg(
+            occ.item_name.unnest::<GoodItemName>().unnest(),
+            /* original: */ lib_name, name.as_str()
+          )?;
+          Ok(Arc::new(occ_data))
+        }).clone()?;
         let it = Arc::new(ItemOccultable {
           svgd,
           xform: occ.xform.clone(),