Merge branch 'master' into master
This commit is contained in:
@@ -359,7 +359,7 @@ When plugging in the USB key, you should see a similar line by using the `ioreg`
|
||||
tool:
|
||||
|
||||
```shell
|
||||
$ ioreg -P USB
|
||||
$ ioreg -p IOUSB
|
||||
+-o Root <class IORegistryEntry, id 0x100000100, retain 21>
|
||||
...
|
||||
+-o AppleUSBXHCI Root Hub Simulation@14000000 <class AppleUSBRootHubDevice, id 0x100000a00, registered, matched, active, busy 0 (0 ms), retain 9>
|
||||
|
||||
46
patches/tock/04-fix-dynamic-deferred-call.patch
Normal file
46
patches/tock/04-fix-dynamic-deferred-call.patch
Normal file
@@ -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()),
|
||||
+ );
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user