Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'helix-event/src/runtime.rs')
| -rw-r--r-- | helix-event/src/runtime.rs | 89 |
1 files changed, 0 insertions, 89 deletions
diff --git a/helix-event/src/runtime.rs b/helix-event/src/runtime.rs deleted file mode 100644 index 02d66fb6..00000000 --- a/helix-event/src/runtime.rs +++ /dev/null @@ -1,89 +0,0 @@ -//! The event system makes use of global to decouple different systems. -//! However, this can cause problems for the integration test system because -//! it runs multiple helix applications in parallel. Making the globals -//! thread-local does not work because a applications can/does have multiple -//! runtime threads. Instead this crate implements a similar notion to a thread -//! local but instead of being local to a single thread, the statics are local to -//! a single tokio-runtime. The implementation requires locking so it's not exactly efficient. -//! -//! Therefore this function is only enabled during integration tests and behaves like -//! a normal static otherwise. I would prefer this module to be fully private and to only -//! export the macro but the macro still need to construct these internals so it's marked -//! `doc(hidden)` instead - -use std::ops::Deref; - -#[cfg(not(feature = "integration_test"))] -pub struct RuntimeLocal<T: 'static> { - /// inner API used in the macro, not part of public API - #[doc(hidden)] - pub __data: T, -} - -#[cfg(not(feature = "integration_test"))] -impl<T> Deref for RuntimeLocal<T> { - type Target = T; - - fn deref(&self) -> &Self::Target { - &self.__data - } -} - -#[cfg(not(feature = "integration_test"))] -#[macro_export] -macro_rules! runtime_local { - ($($(#[$attr:meta])* $vis: vis static $name:ident: $ty: ty = $init: expr;)*) => { - $($(#[$attr])* $vis static $name: $crate::runtime::RuntimeLocal<$ty> = $crate::runtime::RuntimeLocal { - __data: $init - };)* - }; -} - -#[cfg(feature = "integration_test")] -pub struct RuntimeLocal<T: 'static> { - data: parking_lot::RwLock< - hashbrown::HashMap<tokio::runtime::Id, &'static T, foldhash::fast::FixedState>, - >, - init: fn() -> T, -} - -#[cfg(feature = "integration_test")] -impl<T> RuntimeLocal<T> { - /// inner API used in the macro, not part of public API - #[doc(hidden)] - pub const fn __new(init: fn() -> T) -> Self { - Self { - data: parking_lot::RwLock::new(hashbrown::HashMap::with_hasher( - foldhash::fast::FixedState::with_seed(12345678910), - )), - init, - } - } -} - -#[cfg(feature = "integration_test")] -impl<T> Deref for RuntimeLocal<T> { - type Target = T; - fn deref(&self) -> &T { - let id = tokio::runtime::Handle::current().id(); - let guard = self.data.read(); - match guard.get(&id) { - Some(res) => res, - None => { - drop(guard); - let data = Box::leak(Box::new((self.init)())); - let mut guard = self.data.write(); - guard.insert(id, data); - data - } - } - } -} - -#[cfg(feature = "integration_test")] -#[macro_export] -macro_rules! runtime_local { - ($($(#[$attr:meta])* $vis: vis static $name:ident: $ty: ty = $init: expr;)*) => { - $($(#[$attr])* $vis static $name: $crate::runtime::RuntimeLocal<$ty> = $crate::runtime::RuntimeLocal::__new(|| $init);)* - }; -} |