summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar cel 🌸 <cel@bunny.garden>2025-06-10 19:16:53 +0100
committerLibravatar cel 🌸 <cel@bunny.garden>2025-06-10 19:16:53 +0100
commitba82a162009ebf72fa67bc43f54b8f4d17563316 (patch)
tree27d851d8d9d5db3270561ae772d8d5d4838503f6
parent9eb7b5e24305c93e9a4c5055f86de1f308bbba8b (diff)
downloadmacaw-web-ba82a162009ebf72fa67bc43f54b8f4d17563316.tar.gz
macaw-web-ba82a162009ebf72fa67bc43f54b8f4d17563316.tar.bz2
macaw-web-ba82a162009ebf72fa67bc43f54b8f4d17563316.zip
feat: state storage RAII
-rw-r--r--src/state_store.rs41
1 files changed, 19 insertions, 22 deletions
diff --git a/src/state_store.rs b/src/state_store.rs
index 7e6e6a1..d45001f 100644
--- a/src/state_store.rs
+++ b/src/state_store.rs
@@ -112,8 +112,9 @@ where
V: Send + Sync + 'static,
{
pub fn store(&self, key: K, value: V) -> StateListener<K, V> {
- let store = self.inner.try_get_value().unwrap();
- let mut store = store.store.write().unwrap();
+ let arc_store = self.inner.try_get_value().unwrap();
+ let store = arc_store.store.clone();
+ let mut store = store.write().unwrap();
debug!("store state: {:?}", store);
if let Some((v, count)) = store.get_mut(&key) {
debug!("updating old value already in store");
@@ -123,7 +124,7 @@ where
value: v.clone(),
cleaner: StateCleaner {
key,
- state_store: self.clone(),
+ state_store: arc_store,
},
}
} else {
@@ -134,15 +135,16 @@ where
value: v.into(),
cleaner: StateCleaner {
key,
- state_store: self.clone(),
+ state_store: arc_store,
},
}
}
}
pub fn get_listener(&self, key: K) -> Option<StateListener<K, V>> {
- let store = self.inner.try_get_value().unwrap();
- let mut store = store.store.write().unwrap();
+ let arc_store = self.inner.try_get_value().unwrap();
+ let store = arc_store.store.clone();
+ let mut store = store.write().unwrap();
debug!("store state: {:?}", store);
if let Some((v, count)) = store.get_mut(&key) {
*count += 1;
@@ -150,7 +152,7 @@ where
value: v.clone(),
cleaner: StateCleaner {
key,
- state_store: self.clone(),
+ state_store: arc_store,
},
})
} else {
@@ -180,17 +182,6 @@ where
}
}
- fn remove(&self, key: &K) {
- // let store = self.inner.try_get_value().unwrap();
- // let mut store = store.store.write().unwrap();
- // if let Some((_v, count)) = store.get_mut(key) {
- // *count -= 1;
- // if *count == 0 {
- // store.remove(key);
- // debug!("dropped item from store");
- // }
- // }
- }
}
#[derive(Clone)]
@@ -234,7 +225,7 @@ where
V: Send + Sync + 'static,
{
key: K,
- state_store: StateStore<K, V>,
+ state_store: ArcStateStore<K, V>,
}
impl<K, V> Clone for StateCleaner<K, V>
@@ -244,8 +235,7 @@ where
{
fn clone(&self) -> Self {
{
- let store = self.state_store.inner.try_get_value().unwrap();
- let mut store = store.store.write().unwrap();
+ let mut store = self.state_store.store.write().unwrap();
if let Some((_v, count)) = store.get_mut(&self.key) {
*count += 1;
}
@@ -261,6 +251,13 @@ impl<K: Eq + std::hash::Hash + Send + Sync + 'static, V: Send + Sync + 'static>
for StateCleaner<K, V>
{
fn drop(&mut self) {
- self.state_store.remove(&self.key);
+ let mut store = self.state_store.store.write().unwrap();
+ if let Some((_v, count)) = store.get_mut(&self.key) {
+ *count -= 1;
+ if *count == 0 {
+ store.remove(&self.key);
+ debug!("dropped item from store");
+ }
+ }
}
}