tokio/runtime/scheduler/multi_thread/
mod.rs1mod counters;
4use counters::Counters;
5
6mod handle;
7pub(crate) use handle::Handle;
8
9mod overflow;
10pub(crate) use overflow::Overflow;
11
12mod idle;
13use self::idle::Idle;
14
15mod stats;
16pub(crate) use stats::Stats;
17
18mod park;
19pub(crate) use park::{Parker, Unparker};
20
21pub(crate) mod queue;
22
23mod worker;
24pub(crate) use worker::{Context, Launch, Shared};
25
26cfg_taskdump! {
27 mod trace;
28 use trace::TraceStatus;
29}
30
31cfg_not_taskdump! {
32 mod trace_mock;
33 use trace_mock::TraceStatus;
34}
35
36pub(crate) use worker::block_in_place;
37
38use crate::loom::sync::Arc;
39use crate::runtime::{
40 blocking,
41 driver::{self, Driver},
42 scheduler, Config, TimerFlavor,
43};
44use crate::util::RngSeedGenerator;
45
46use std::fmt;
47use std::future::Future;
48
49pub(crate) struct MultiThread;
51
52impl MultiThread {
55 #[allow(clippy::too_many_arguments)]
56 pub(crate) fn new(
57 size: usize,
58 driver: Driver,
59 driver_handle: driver::Handle,
60 blocking_spawner: blocking::Spawner,
61 seed_generator: RngSeedGenerator,
62 config: Config,
63 timer_flavor: TimerFlavor,
64 name: Option<String>,
65 ) -> (MultiThread, Arc<Handle>, Launch) {
66 let parker = Parker::new(driver);
67 let (handle, launch) = worker::create(
68 size,
69 parker,
70 driver_handle,
71 blocking_spawner,
72 seed_generator,
73 config,
74 timer_flavor,
75 name,
76 );
77
78 (MultiThread, handle, launch)
79 }
80
81 pub(crate) fn block_on<F>(&self, handle: &scheduler::Handle, future: F) -> F::Output
86 where
87 F: Future,
88 {
89 crate::runtime::context::enter_runtime(handle, true, |blocking| {
90 blocking.block_on(future).expect("failed to park thread")
91 })
92 }
93
94 pub(crate) fn shutdown(&mut self, handle: &scheduler::Handle) {
95 match handle {
96 scheduler::Handle::MultiThread(handle) => handle.shutdown(),
97 _ => panic!("expected MultiThread scheduler"),
98 }
99 }
100}
101
102impl fmt::Debug for MultiThread {
103 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
104 fmt.debug_struct("MultiThread").finish()
105 }
106}