From f2936cb45c1647dbc13194c75bb1abab914858f1 Mon Sep 17 00:00:00 2001 From: Guillaume Endignoux <guillaumee@google.com> Date: Fri, 28 Feb 2020 15:12:16 +0100 Subject: [PATCH] Import bugfix from https://github.com/tock/tock/pull/1636 as a patch. --- .../tock/04-fix-dynamic-deferred-call.patch | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 patches/tock/04-fix-dynamic-deferred-call.patch diff --git a/patches/tock/04-fix-dynamic-deferred-call.patch b/patches/tock/04-fix-dynamic-deferred-call.patch new file mode 100644 index 0000000..4e29004 --- /dev/null +++ b/patches/tock/04-fix-dynamic-deferred-call.patch @@ -0,0 +1,46 @@ +diff --git a/kernel/src/common/dynamic_deferred_call.rs b/kernel/src/common/dynamic_deferred_call.rs +index 53f5143d..ca349972 100644 +--- a/kernel/src/common/dynamic_deferred_call.rs ++++ b/kernel/src/common/dynamic_deferred_call.rs +@@ -226,23 +226,25 @@ impl DynamicDeferredCall { + /// `call_global_instance_while`. + pub(self) fn call_while<F: Fn() -> bool>(&self, f: F) { + if self.call_pending.get() { +- // Reset call_pending here, as it may be set again in the deferred calls +- self.call_pending.set(false); ++ for (i, client_state) in self.client_states.iter().enumerate() { ++ if !f() { ++ break; ++ } ++ if client_state.scheduled.get() { ++ client_state.client.map(|client| { ++ client_state.scheduled.set(false); ++ client.call(DeferredCallHandle(i)); ++ }); ++ } ++ } + +- self.client_states +- .iter() +- .enumerate() +- .filter(|(_i, client_state)| client_state.scheduled.get()) +- .filter_map(|(i, client_state)| { +- client_state +- .client +- .map(|c| (i, &client_state.scheduled, *c)) +- }) +- .take_while(|_| f()) +- .for_each(|(i, call_reqd, client)| { +- call_reqd.set(false); +- client.call(DeferredCallHandle(i)); +- }); ++ // Recompute call_pending here, as some deferred calls may have been skipped due to the ++ // `f` predicate becoming false. ++ self.call_pending.set( ++ self.client_states ++ .iter() ++ .any(|client_state| client_state.scheduled.get()), ++ ); + } + } + } -- GitLab