From 2dbb27f62d6fd9035406644f658ec3459849a4b5 Mon Sep 17 00:00:00 2001 From: Zixuan Chen Date: Wed, 26 Oct 2022 13:16:00 +0800 Subject: [PATCH] chore: use weak ref --- .gitignore | 1 + crates/loro-core/src/log_store.rs | 10 ++++++---- crates/loro-core/src/loro.rs | 2 +- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 06ed9fd6..b0bae779 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ /target *.log +*.ipynb flamegraph.svg target diff --git a/crates/loro-core/src/log_store.rs b/crates/loro-core/src/log_store.rs index fd53f824..64820d3a 100644 --- a/crates/loro-core/src/log_store.rs +++ b/crates/loro-core/src/log_store.rs @@ -62,7 +62,7 @@ pub struct LogStore { pub(crate) this_client_id: ClientID, frontier: SmallVec<[ID; 2]>, /// CRDT container manager - pub(crate) container: Arc>, + pub(crate) container: Weak>, to_self: Weak>, _pin: PhantomPinned, } @@ -71,7 +71,7 @@ impl LogStore { pub fn new( mut cfg: Configure, client_id: Option, - container: Arc>, + container: Weak>, ) -> Arc> { let this_client_id = client_id.unwrap_or_else(|| cfg.rand.next_u64()); Arc::new_cyclic(|x| { @@ -155,7 +155,8 @@ impl LogStore { } fn change_to_export_format(&self, change: &mut Change) { - let container_manager = self.container.read().unwrap(); + let upgraded = self.container.upgrade().unwrap(); + let container_manager = upgraded.read().unwrap(); for op in change.ops.vec_mut().iter_mut() { let container = container_manager.get(&op.container).unwrap(); container.to_export(op); @@ -262,7 +263,8 @@ impl LogStore { } // TODO: find a way to remove this clone? we don't need change in apply method actually - let mut container_manager = self.container.write().unwrap(); + let upgraded = self.container.upgrade().unwrap(); + let mut container_manager = upgraded.write().unwrap(); #[cfg(feature = "slice")] self.change_to_imported_format(&mut container_manager, &mut change); let v = self diff --git a/crates/loro-core/src/loro.rs b/crates/loro-core/src/loro.rs index d6496deb..61e8d722 100644 --- a/crates/loro-core/src/loro.rs +++ b/crates/loro-core/src/loro.rs @@ -36,7 +36,7 @@ impl LoroCore { store: NonNull::dangling(), })); Self { - log_store: LogStore::new(cfg, client_id, container.clone()), + log_store: LogStore::new(cfg, client_id, Arc::downgrade(&container)), container, } }