use crate::future::Future; use crate::loom::sync::Arc; use crate::runtime::scheduler::multi_thread::worker; use crate::runtime::{ blocking, driver, task::{self, JoinHandle}, TaskHooks, TaskMeta, }; use crate::util::RngSeedGenerator; use std::fmt; mod metrics; cfg_taskdump! { mod taskdump; } /// Handle to the multi thread scheduler pub(crate) struct Handle { /// Task spawner pub(super) shared: worker::Shared, /// Resource driver handles pub(crate) driver: driver::Handle, /// Blocking pool spawner pub(crate) blocking_spawner: blocking::Spawner, /// Current random number generator seed pub(crate) seed_generator: RngSeedGenerator, /// User-supplied hooks to invoke for things pub(crate) task_hooks: TaskHooks, } impl Handle { /// Spawns a future onto the thread pool pub(crate) fn spawn(me: &Arc, future: F, id: task::Id) -> JoinHandle where F: crate::future::Future + Send + 'static, F::Output: Send + 'static, { Self::bind_new_task(me, future, id) } pub(crate) fn shutdown(&self) { self.close(); } pub(super) fn bind_new_task(me: &Arc, future: T, id: task::Id) -> JoinHandle where T: Future + Send + 'static, T::Output: Send + 'static, { let (handle, notified) = me.shared.owned.bind(future, me.clone(), id); me.task_hooks.spawn(&TaskMeta { id, _phantom: Default::default(), }); me.schedule_option_task_without_yield(notified); handle } } cfg_unstable! { use std::num::NonZeroU64; impl Handle { pub(crate) fn owned_id(&self) -> NonZeroU64 { self.shared.owned.id } } } impl fmt::Debug for Handle { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { fmt.debug_struct("multi_thread::Handle { ... }").finish() } }