diff options
Diffstat (limited to 'ext/node_resolver/sync.rs')
-rw-r--r-- | ext/node_resolver/sync.rs | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/ext/node_resolver/sync.rs b/ext/node_resolver/sync.rs new file mode 100644 index 000000000..f6689a56a --- /dev/null +++ b/ext/node_resolver/sync.rs @@ -0,0 +1,86 @@ +// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license. + +pub use inner::*; + +#[cfg(feature = "sync")] +mod inner { + #![allow(clippy::disallowed_types)] + + use std::ops::Deref; + use std::ops::DerefMut; + pub use std::sync::Arc as MaybeArc; + + pub struct MaybeArcMutexGuard<'lock, T>(std::sync::MutexGuard<'lock, T>); + + impl<'lock, T> Deref for MaybeArcMutexGuard<'lock, T> { + type Target = std::sync::MutexGuard<'lock, T>; + fn deref(&self) -> &std::sync::MutexGuard<'lock, T> { + &self.0 + } + } + + impl<'lock, T> DerefMut for MaybeArcMutexGuard<'lock, T> { + fn deref_mut(&mut self) -> &mut std::sync::MutexGuard<'lock, T> { + &mut self.0 + } + } + + #[derive(Debug)] + pub struct MaybeArcMutex<T>(std::sync::Arc<std::sync::Mutex<T>>); + impl<T> MaybeArcMutex<T> { + pub fn new(val: T) -> Self { + Self(std::sync::Arc::new(std::sync::Mutex::new(val))) + } + } + + impl<'lock, T> MaybeArcMutex<T> { + pub fn lock(&'lock self) -> MaybeArcMutexGuard<'lock, T> { + MaybeArcMutexGuard(self.0.lock().unwrap()) + } + } + + pub use core::marker::Send as MaybeSend; + pub use core::marker::Sync as MaybeSync; +} + +#[cfg(not(feature = "sync"))] +mod inner { + use std::ops::Deref; + use std::ops::DerefMut; + + pub use std::rc::Rc as MaybeArc; + + pub struct MaybeArcMutexGuard<'lock, T>(std::cell::RefMut<'lock, T>); + + impl<'lock, T> Deref for MaybeArcMutexGuard<'lock, T> { + type Target = std::cell::RefMut<'lock, T>; + fn deref(&self) -> &std::cell::RefMut<'lock, T> { + &self.0 + } + } + + impl<'lock, T> DerefMut for MaybeArcMutexGuard<'lock, T> { + fn deref_mut(&mut self) -> &mut std::cell::RefMut<'lock, T> { + &mut self.0 + } + } + + #[derive(Debug)] + pub struct MaybeArcMutex<T>(std::rc::Rc<std::cell::RefCell<T>>); + impl<T> MaybeArcMutex<T> { + pub fn new(val: T) -> Self { + Self(std::rc::Rc::new(std::cell::RefCell::new(val))) + } + } + + impl<'lock, T> MaybeArcMutex<T> { + pub fn lock(&'lock self) -> MaybeArcMutexGuard<'lock, T> { + MaybeArcMutexGuard(self.0.borrow_mut()) + } + } + + pub trait MaybeSync {} + impl<T> MaybeSync for T where T: ?Sized {} + pub trait MaybeSend {} + impl<T> MaybeSend for T where T: ?Sized {} +} |