//! Thread local runtime context use crate::runtime::Handle; use std::cell::RefCell; thread_local! { static CONTEXT: RefCell> = RefCell::new(None) } pub(crate) fn current() -> Option { CONTEXT.with(|ctx| ctx.borrow().clone()) } cfg_io_driver! { pub(crate) fn io_handle() -> crate::runtime::io::Handle { CONTEXT.with(|ctx| match *ctx.borrow() { Some(ref ctx) => ctx.io_handle.clone(), None => Default::default(), }) } } cfg_time! { pub(crate) fn time_handle() -> crate::runtime::time::Handle { CONTEXT.with(|ctx| match *ctx.borrow() { Some(ref ctx) => ctx.time_handle.clone(), None => Default::default(), }) } cfg_test_util! { pub(crate) fn clock() -> Option { CONTEXT.with(|ctx| match *ctx.borrow() { Some(ref ctx) => Some(ctx.clock.clone()), None => None, }) } } } cfg_rt_core! { pub(crate) fn spawn_handle() -> Option { CONTEXT.with(|ctx| match *ctx.borrow() { Some(ref ctx) => Some(ctx.spawner.clone()), None => None, }) } } /// Set this [`ThreadContext`] as the current active [`ThreadContext`]. /// /// [`ThreadContext`]: struct@ThreadContext pub(crate) fn enter(new: Handle, f: F) -> R where F: FnOnce() -> R, { struct DropGuard(Option); impl Drop for DropGuard { fn drop(&mut self) { CONTEXT.with(|ctx| { *ctx.borrow_mut() = self.0.take(); }); } } let _guard = CONTEXT.with(|ctx| { let old = ctx.borrow_mut().replace(new); DropGuard(old) }); f() }