diff --git a/local/recipes/system/driver-manager/source/src/main.rs b/local/recipes/system/driver-manager/source/src/main.rs index 2d035074b8..ee622ba994 100644 --- a/local/recipes/system/driver-manager/source/src/main.rs +++ b/local/recipes/system/driver-manager/source/src/main.rs @@ -384,8 +384,6 @@ fn main() { &shared_blacklist, )); - let scheme_for_events = Arc::clone(&scheme); - match manager.lock() { Ok(mut mgr) => { mgr.register_bus(Box::new(PciBus::new())); @@ -420,11 +418,18 @@ fn main() { // overrides), then to None (severity-only). The listener then // maps the action through `RecoveryAction::Fatal` -> escalation // log marker (in main callback) before calling dispatch_recovery. - let scheme_for_events_aer = Arc::clone(&scheme); + // + // Each closure captures its own `Arc` clone of `scheme`. Cloning + // once is not enough — the closures are mutually exclusive + // (each runs on its own thread) and `move` semantics require + // independent ownership for each. + let scheme_for_snapshot = Arc::clone(&scheme); + let scheme_for_consult = Arc::clone(&scheme); + let scheme_for_dispatch = Arc::clone(&scheme); let _events_thread = unified_events::spawn_unified_listener( std::path::PathBuf::from("/scheme/pci/aer"), std::path::PathBuf::from("/scheme/pci/pciehp"), - move || scheme_for_events_aer.bound_device_pairs(), + move || scheme_for_snapshot.bound_device_pairs(), move |bdf, severity| { // 1) Sidecar IPC: ask the spawned driver daemon if it // opted in to error-reporting. @@ -440,7 +445,7 @@ fn main() { } // 2) In-process DriverConfig::on_error: drivers may // override the severity-default via the trait method. - let pairs = scheme_for_events.bound_device_pairs(); + let pairs = scheme_for_consult.bound_device_pairs(); let driver_name = match pairs.iter().find(|(addr, _)| addr == bdf) { Some((_, name)) => name.clone(), None => return None, @@ -498,7 +503,7 @@ fn main() { if let Some(action_str) = scheme::DriverManagerScheme::recovery_action_str(*action) { - scheme_for_events.dispatch_recovery(&event.device, action_str); + scheme_for_dispatch.dispatch_recovery(&event.device, action_str); } } unified_events::UnifiedEvent::Pciehp(e) => {