From e8fbc7acd68c493efb18f3d451bed1effdb43d9e Mon Sep 17 00:00:00 2001 From: Abutalib Aghayev Date: Thu, 27 Oct 2022 15:55:51 -0400 Subject: [PATCH] rt: add a method to determine the flavor of the runtime. --- tokio/src/runtime/handle.rs | 30 +++++++++++++++++++++++++++++- tokio/src/runtime/mod.rs | 12 ++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/tokio/src/runtime/handle.rs b/tokio/src/runtime/handle.rs index 91974252610..4b00f25de11 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,34 @@ 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`. + /// + /// # Examples + /// + /// ``` + /// 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..da4d0fed911 100644 --- a/tokio/src/runtime/mod.rs +++ b/tokio/src/runtime/mod.rs @@ -312,6 +312,18 @@ cfg_rt! { blocking_pool: BlockingPool, } + /// The flavor of a `Runtime`. + /// + /// This is the return type for [`Handle::runtime_flavor`](crate::runtime::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 {