From f4fe3cd0e997fc417a245fd33d0d27fb0b44ba10 Mon Sep 17 00:00:00 2001 From: Steven Stewart-Gallus Date: Tue, 14 Mar 2017 21:28:31 -0700 Subject: Added spin loop pause function --- src/libcore/sync/atomic.rs | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'src/libcore/sync') 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`. -- cgit 1.4.1-3-g733a5