diff options
| author | Steven Stewart-Gallus <sstewartgallus00@mylangara.bc.ca> | 2017-03-14 21:28:31 -0700 |
|---|---|---|
| committer | Steven Stewart-Gallus <sstewartgallus@sstewartgallus.com> | 2017-05-01 17:11:44 -0700 |
| commit | f4fe3cd0e997fc417a245fd33d0d27fb0b44ba10 (patch) | |
| tree | 628224c250ff8dffd1017e913607d359a4384db4 /src/libcore/sync | |
| parent | 777ee20796e80a31d4b7c985dd68eda2941460d6 (diff) | |
| download | rust-f4fe3cd0e997fc417a245fd33d0d27fb0b44ba10.tar.gz rust-f4fe3cd0e997fc417a245fd33d0d27fb0b44ba10.zip | |
Added spin loop pause function
Diffstat (limited to 'src/libcore/sync')
| -rw-r--r-- | src/libcore/sync/atomic.rs | 23 |
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`. |
