mirror of
https://github.com/loro-dev/loro.git
synced 2025-02-11 14:53:12 +00:00
perf: reclaim list tracker mem after applying
This commit is contained in:
parent
313b1cc8c0
commit
1255e32101
1 changed files with 22 additions and 12 deletions
|
@ -37,7 +37,7 @@ pub struct ListContainer {
|
|||
id: ContainerID,
|
||||
state: RleTree<SliceRange, CumulateTreeTrait<SliceRange, 8, HeapMode>>,
|
||||
raw_data: pool::Pool,
|
||||
tracker: Tracker,
|
||||
tracker: Option<Tracker>,
|
||||
}
|
||||
|
||||
impl ListContainer {
|
||||
|
@ -45,7 +45,7 @@ impl ListContainer {
|
|||
Self {
|
||||
id,
|
||||
raw_data: pool::Pool::default(),
|
||||
tracker: Tracker::new(Default::default(), 0),
|
||||
tracker: None,
|
||||
state: Default::default(),
|
||||
}
|
||||
}
|
||||
|
@ -241,7 +241,7 @@ impl ListContainer {
|
|||
}
|
||||
|
||||
pub fn check(&mut self) {
|
||||
self.tracker.check();
|
||||
self.tracker.as_mut().map(|x| x.check());
|
||||
}
|
||||
|
||||
#[cfg(feature = "test_utils")]
|
||||
|
@ -384,22 +384,28 @@ impl Container for ListContainer {
|
|||
}
|
||||
|
||||
fn tracker_init(&mut self, vv: &crate::VersionVector) {
|
||||
if (!vv.is_empty() || self.tracker.start_vv().is_empty())
|
||||
&& self.tracker.all_vv() >= vv
|
||||
&& vv >= self.tracker.start_vv()
|
||||
{
|
||||
self.tracker.checkout(vv);
|
||||
} else {
|
||||
self.tracker = Tracker::new(vv.clone(), Counter::MAX / 2);
|
||||
match &mut self.tracker {
|
||||
Some(tracker) => {
|
||||
if (!vv.is_empty() || tracker.start_vv().is_empty())
|
||||
&& tracker.all_vv() >= vv
|
||||
&& vv >= tracker.start_vv()
|
||||
{
|
||||
} else {
|
||||
self.tracker = Some(Tracker::new(vv.clone(), Counter::MAX / 2));
|
||||
}
|
||||
}
|
||||
None => {
|
||||
self.tracker = Some(Tracker::new(vv.clone(), Counter::MAX / 2));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn tracker_checkout(&mut self, vv: &crate::VersionVector) {
|
||||
self.tracker.checkout(vv)
|
||||
self.tracker.as_mut().unwrap().checkout(vv)
|
||||
}
|
||||
|
||||
fn track_apply(&mut self, _: &mut Hierarchy, rich_op: &RichOp, _: &mut ImportContext) {
|
||||
self.tracker.track_apply(rich_op);
|
||||
self.tracker.as_mut().unwrap().track_apply(rich_op);
|
||||
}
|
||||
|
||||
fn apply_tracked_effects_from(
|
||||
|
@ -411,6 +417,8 @@ impl Container for ListContainer {
|
|||
let mut diff = vec![];
|
||||
for effect in self
|
||||
.tracker
|
||||
.as_mut()
|
||||
.unwrap()
|
||||
.iter_effects(&import_context.old_vv, &import_context.spans)
|
||||
{
|
||||
match effect {
|
||||
|
@ -459,6 +467,8 @@ impl Container for ListContainer {
|
|||
if should_notify {
|
||||
import_context.push_diff_vec(&self.id, diff);
|
||||
}
|
||||
|
||||
self.tracker = None;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue