about summary refs log tree commit diff
path: root/src/libcore/sync
diff options
context:
space:
mode:
authorSteven Stewart-Gallus <sstewartgallus00@mylangara.bc.ca>2017-03-14 21:28:31 -0700
committerSteven Stewart-Gallus <sstewartgallus@sstewartgallus.com>2017-05-01 17:11:44 -0700
commitf4fe3cd0e997fc417a245fd33d0d27fb0b44ba10 (patch)
tree628224c250ff8dffd1017e913607d359a4384db4 /src/libcore/sync
parent777ee20796e80a31d4b7c985dd68eda2941460d6 (diff)
downloadrust-f4fe3cd0e997fc417a245fd33d0d27fb0b44ba10.tar.gz
rust-f4fe3cd0e997fc417a245fd33d0d27fb0b44ba10.zip
Added spin loop pause function
Diffstat (limited to 'src/libcore/sync')
-rw-r--r--src/libcore/sync/atomic.rs23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/libcore/sync/atomic.rs b/src/libcore/sync/atomic.rs
index fad58deecd4..3c51dbc2550 100644
--- a/src/libcore/sync/atomic.rs
+++ b/src/libcore/sync/atomic.rs
@@ -94,6 +94,29 @@ use intrinsics;
 use cell::UnsafeCell;
 use fmt;
 
+/// Save power or switch hyperthreads in a busy-wait spin-loop.
+///
+/// This function is deliberately more primitive than
+/// `std::thread::yield_now` and does not directly yield to the
+/// system's scheduler.  In some cases it might be useful to use a
+/// combination of both functions.  Careful benchmarking is advised.
+///
+/// On some platforms this function may not do anything at all.
+#[inline]
+#[unstable(feature = "hint_core_should_pause", issue = "41196")]
+pub fn hint_core_should_pause()
+{
+    #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
+    unsafe {
+        asm!("pause" ::: "memory" : "volatile");
+    }
+
+    #[cfg(target_arch = "aarch64")]
+    unsafe {
+        asm!("yield" ::: "memory" : "volatile");
+    }
+}
+
 /// A boolean type which can be safely shared between threads.
 ///
 /// This type has the same in-memory representation as a `bool`.