perf: reclaim list tracker mem after applying

This commit is contained in:
Zixuan Chen 2022-12-12 13:48:49 +08:00
parent 313b1cc8c0
commit 1255e32101

View file

@ -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;
}
}