summaryrefslogtreecommitdiffstats
path: root/vendor/sharded-slab/src/sync.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/sharded-slab/src/sync.rs')
-rw-r--r--vendor/sharded-slab/src/sync.rs140
1 files changed, 140 insertions, 0 deletions
diff --git a/vendor/sharded-slab/src/sync.rs b/vendor/sharded-slab/src/sync.rs
new file mode 100644
index 000000000..64a31dcd9
--- /dev/null
+++ b/vendor/sharded-slab/src/sync.rs
@@ -0,0 +1,140 @@
+pub(crate) use self::inner::*;
+
+#[cfg(all(loom, any(test, feature = "loom")))]
+mod inner {
+ pub(crate) mod atomic {
+ pub use loom::sync::atomic::*;
+ pub use std::sync::atomic::Ordering;
+ }
+ pub(crate) use loom::{
+ cell::UnsafeCell, hint, lazy_static, sync::Mutex, thread::yield_now, thread_local,
+ };
+
+ pub(crate) mod alloc {
+ #![allow(dead_code)]
+ use loom::alloc;
+ use std::fmt;
+ /// Track allocations, detecting leaks
+ ///
+ /// This is a version of `loom::alloc::Track` that adds a missing
+ /// `Default` impl.
+ pub struct Track<T>(alloc::Track<T>);
+
+ impl<T> Track<T> {
+ /// Track a value for leaks
+ #[inline(always)]
+ pub fn new(value: T) -> Track<T> {
+ Track(alloc::Track::new(value))
+ }
+
+ /// Get a reference to the value
+ #[inline(always)]
+ pub fn get_ref(&self) -> &T {
+ self.0.get_ref()
+ }
+
+ /// Get a mutable reference to the value
+ #[inline(always)]
+ pub fn get_mut(&mut self) -> &mut T {
+ self.0.get_mut()
+ }
+
+ /// Stop tracking the value for leaks
+ #[inline(always)]
+ pub fn into_inner(self) -> T {
+ self.0.into_inner()
+ }
+ }
+
+ impl<T: fmt::Debug> fmt::Debug for Track<T> {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ self.0.fmt(f)
+ }
+ }
+
+ impl<T: Default> Default for Track<T> {
+ fn default() -> Self {
+ Self::new(T::default())
+ }
+ }
+ }
+}
+
+#[cfg(not(all(loom, any(feature = "loom", test))))]
+mod inner {
+ #![allow(dead_code)]
+ pub(crate) use lazy_static::lazy_static;
+ pub(crate) use std::{
+ sync::{atomic, Mutex},
+ thread::yield_now,
+ thread_local,
+ };
+
+ pub(crate) mod hint {
+ #[inline(always)]
+ pub(crate) fn spin_loop() {
+ // MSRV: std::hint::spin_loop() stabilized in 1.49.0
+ #[allow(deprecated)]
+ super::atomic::spin_loop_hint()
+ }
+ }
+
+ #[derive(Debug)]
+ pub(crate) struct UnsafeCell<T>(std::cell::UnsafeCell<T>);
+
+ impl<T> UnsafeCell<T> {
+ pub fn new(data: T) -> UnsafeCell<T> {
+ UnsafeCell(std::cell::UnsafeCell::new(data))
+ }
+
+ #[inline(always)]
+ pub fn with<F, R>(&self, f: F) -> R
+ where
+ F: FnOnce(*const T) -> R,
+ {
+ f(self.0.get())
+ }
+
+ #[inline(always)]
+ pub fn with_mut<F, R>(&self, f: F) -> R
+ where
+ F: FnOnce(*mut T) -> R,
+ {
+ f(self.0.get())
+ }
+ }
+
+ pub(crate) mod alloc {
+ /// Track allocations, detecting leaks
+ #[derive(Debug, Default)]
+ pub struct Track<T> {
+ value: T,
+ }
+
+ impl<T> Track<T> {
+ /// Track a value for leaks
+ #[inline(always)]
+ pub fn new(value: T) -> Track<T> {
+ Track { value }
+ }
+
+ /// Get a reference to the value
+ #[inline(always)]
+ pub fn get_ref(&self) -> &T {
+ &self.value
+ }
+
+ /// Get a mutable reference to the value
+ #[inline(always)]
+ pub fn get_mut(&mut self) -> &mut T {
+ &mut self.value
+ }
+
+ /// Stop tracking the value for leaks
+ #[inline(always)]
+ pub fn into_inner(self) -> T {
+ self.value
+ }
+ }
+ }
+}