diff --git a/tokio/src/runtime/handle.rs b/tokio/src/runtime/handle.rs index 91974252610..8a9a0defffe 100644 --- a/tokio/src/runtime/handle.rs +++ b/tokio/src/runtime/handle.rs @@ -1,4 +1,4 @@ -use crate::runtime::scheduler; +use crate::runtime::{scheduler, RuntimeFlavor}; /// Handle to the runtime. /// @@ -277,6 +277,32 @@ impl Handle { let future = crate::util::trace::task(future, "task", _name, id.as_u64()); self.inner.spawn(future, id) } + + /// Returns the flavor of the current `Runtime`. + /// + /// ``` + /// use tokio::runtime::{Handle, RuntimeFlavor}; + /// + /// #[tokio::main(flavor = "current_thread")] + /// async fn main() { + /// assert_eq!(RuntimeFlavor::CurrentThread, Handle::current().runtime_flavor()); + /// } + /// ``` + /// + /// ``` + /// use tokio::runtime::{Handle, RuntimeFlavor}; + /// + /// #[tokio::main(flavor = "multi_thread", worker_threads = 4)] + /// async fn main() { + /// assert_eq!(RuntimeFlavor::MultiThread, Handle::current().runtime_flavor()); + /// } + /// ``` + pub fn runtime_flavor(&self) -> RuntimeFlavor { + match self.inner { + scheduler::Handle::CurrentThread(_) => RuntimeFlavor::CurrentThread, + scheduler::Handle::MultiThread(_) => RuntimeFlavor::MultiThread, + } + } } cfg_metrics! { diff --git a/tokio/src/runtime/mod.rs b/tokio/src/runtime/mod.rs index b69d696cdef..b368864b1e3 100644 --- a/tokio/src/runtime/mod.rs +++ b/tokio/src/runtime/mod.rs @@ -312,6 +312,16 @@ cfg_rt! { blocking_pool: BlockingPool, } + /// The flavor of the `Runtime`; the return type for [`Handle::runtime_flavor`]. + #[derive(Debug, PartialEq, Eq)] + #[non_exhaustive] + pub enum RuntimeFlavor { + /// The flavor that executes all tasks on the current thread. + CurrentThread, + /// The flavor that executes tasks across multiple threads. + MultiThread, + } + /// The runtime scheduler is either a multi-thread or a current-thread executor. #[derive(Debug)] enum Scheduler {