From 1e83dc8512f1f77154779a030b668dec28ca9c22 Mon Sep 17 00:00:00 2001 From: Adoo Date: Thu, 30 Nov 2023 10:30:37 +0800 Subject: [PATCH] =?UTF-8?q?fix(core):=20=F0=9F=90=9B=20split=20state=20not?= =?UTF-8?q?=20notify=20data,=20but=20notify=20framework?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/state.rs | 23 +++++++++++++---------- core/src/state/splitted_state.rs | 11 ++++++++++- macros/src/pipe_macro.rs | 2 +- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/core/src/state.rs b/core/src/state.rs index 4911eff5c..62aef7ee7 100644 --- a/core/src/state.rs +++ b/core/src/state.rs @@ -526,28 +526,31 @@ mod tests { let track_split = Sc::new(Cell::new(0)); let c_origin = track_origin.clone(); - origin.modifies().subscribe(move |_| { - c_origin.set(c_origin.get() + 1); + origin.modifies().subscribe(move |s| { + c_origin.set(c_origin.get() + s.bits()); }); let c_split = track_split.clone(); - split.modifies().subscribe(move |_| { - c_split.set(c_split.get() + 1); + split.modifies().subscribe(move |s| { + c_split.set(c_split.get() + s.bits()); }); - *split.write() = 1; + *split.write() = 0; Timer::wake_timeout_futures(); AppCtx::run_until_stalled(); - assert_eq!(track_origin.get(), 0); - assert_eq!(track_split.get(), 1); + assert_eq!(track_origin.get(), ModifyScope::DATA.bits()); + assert_eq!(track_split.get(), ModifyScope::BOTH.bits()); - origin.write().b = 1; + origin.write().b = 0; Timer::wake_timeout_futures(); AppCtx::run_until_stalled(); - assert_eq!(track_origin.get(), 1); + assert_eq!( + track_origin.get(), + ModifyScope::DATA.bits() + ModifyScope::BOTH.bits() + ); // splitted downstream will not be notified. - assert_eq!(track_split.get(), 1); + assert_eq!(track_split.get(), ModifyScope::BOTH.bits()); } #[test] diff --git a/core/src/state/splitted_state.rs b/core/src/state/splitted_state.rs index d3b43f4e0..585970cda 100644 --- a/core/src/state/splitted_state.rs +++ b/core/src/state/splitted_state.rs @@ -183,6 +183,15 @@ where self.create_at > self.origin.time_stamp(), "A splitted writer is invalid because its origin state is modified after it created." ); + + let modify_scope = orig.modify_scope; + + // the origin mark as a silent write, because split writer not effect the origin + // state in ribir framework level. But keep notify in the data level. + assert!(!orig.modified); + orig.modify_scope.remove(ModifyScope::FRAMEWORK); + orig.modified = true; + let value = orig .value .take() @@ -191,7 +200,7 @@ where WriteRef { value, modified: false, - modify_scope: orig.modify_scope, + modify_scope, control: self, } } diff --git a/macros/src/pipe_macro.rs b/macros/src/pipe_macro.rs index 18cb41193..42ea535db 100644 --- a/macros/src/pipe_macro.rs +++ b/macros/src/pipe_macro.rs @@ -49,7 +49,7 @@ impl ToTokens for PipeMacro { #refs let _ctx_handle_ಠ_ಠ = ctx!().handle(); MapPipe::new( - ModifiesPipe::new(#upstream.box_it()), + ModifiesPipe::new(#upstream.filter(|s| s.contains(ModifyScope::FRAMEWORK)).box_it()), move |_: ModifyScope| { _ctx_handle_ಠ_ಠ .with_ctx(|ctx!(): &BuildCtx<'_>| { #(#expr)* })