summaryrefslogtreecommitdiffstats
path: root/tokio/src/sync/loom.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tokio/src/sync/loom.rs')
-rw-r--r--tokio/src/sync/loom.rs48
1 files changed, 48 insertions, 0 deletions
diff --git a/tokio/src/sync/loom.rs b/tokio/src/sync/loom.rs
new file mode 100644
index 00000000..1b5a5c9d
--- /dev/null
+++ b/tokio/src/sync/loom.rs
@@ -0,0 +1,48 @@
+#[cfg(not(all(test, loom)))]
+mod imp {
+ pub(crate) mod future {
+ pub(crate) use crate::sync::task::AtomicWaker;
+ }
+
+ pub(crate) mod sync {
+ pub(crate) use std::sync::atomic;
+ pub(crate) use std::sync::Arc;
+
+ use std::cell::UnsafeCell;
+
+ pub(crate) struct CausalCell<T>(UnsafeCell<T>);
+
+ impl<T> CausalCell<T> {
+ pub(crate) fn new(data: T) -> CausalCell<T> {
+ CausalCell(UnsafeCell::new(data))
+ }
+
+ pub(crate) fn with<F, R>(&self, f: F) -> R
+ where
+ F: FnOnce(*const T) -> R,
+ {
+ f(self.0.get())
+ }
+
+ pub(crate) fn with_mut<F, R>(&self, f: F) -> R
+ where
+ F: FnOnce(*mut T) -> R,
+ {
+ f(self.0.get())
+ }
+ }
+ }
+
+ pub(crate) mod thread {
+ pub(crate) fn yield_now() {
+ ::std::sync::atomic::spin_loop_hint();
+ }
+ }
+}
+
+#[cfg(all(test, loom))]
+mod imp {
+ pub(crate) use loom::*;
+}
+
+pub(crate) use self::imp::*;