//! Per-scheme worker pool registration glue. //! //! Registers a per-scheme worker thread against a `SchemePool` //! and exposes a `register_all` helper that wires the standard //! netstack scheme set. This is the dispatch layer that //! `corec12_integration::run_corec12_main_loop` uses to feed //! per-scheme work to the pool. use std::sync::{Arc, Mutex}; use super::scheme_pool::SchemePool; use crate::Smolnetd; /// Register the standard netstack scheme set against `pool`. /// The smolnetd state is shared via `Arc>` so the /// worker threads can take the lock briefly to call each /// per-scheme event method. pub fn register_all(pool: &mut SchemePool, smolnetd: Arc>) { let entries: &[(&str, fn(&mut Smolnetd) -> crate::error::Result<()>)] = &[ ("ip", |s| s.on_ip_scheme_event()), ("udp", |s| s.on_udp_scheme_event()), ("tcp", |s| s.on_tcp_scheme_event()), ("icmp", |s| s.on_icmp_scheme_event()), ]; for (name, method) in entries.iter().copied() { let s = smolnetd.clone(); let name_static: &'static str = name; pool.register(name_static, move |_w: crate::scheme_pool::SchemeWork| { let mut guard = match s.lock() { Ok(g) => g, Err(_poisoned) => return, }; if let Err(e) = method(&mut *guard) { log::warn!("netstack: scheme {name_static} handler failed: {e:?}"); } }); } }