[][src]Type Definition spinning_top::Spinlock

type Spinlock<T> = Mutex<RawSpinlock, T>;

A mutual exclusion (Mutex) type based on busy-waiting.

Calling lock (or try_lock) on this type returns a SpinlockGuard, which automatically frees the lock when it goes out of scope.

Example

use spinning_top::Spinlock;
 
fn main() {
    // Wrap some data in a spinlock
    let data = String::from("Hello");
    let spinlock = Spinlock::new(data);
    make_uppercase(&spinlock); // only pass a shared reference

    // We have ownership of the spinlock, so we can extract the data without locking
    // Note: this consumes the spinlock
    let data = spinlock.into_inner();
    assert_eq!(data.as_str(), "HELLO");
}
 
fn make_uppercase(spinlock: &Spinlock<String>) {
    // Lock the spinlock to get a mutable reference to the data
    let mut locked_data = spinlock.lock();
    assert_eq!(locked_data.as_str(), "Hello");
    locked_data.make_ascii_uppercase();
 
    // the lock is automatically freed at the end of the scope
}

Nightly Example

On Rust nightly, the new function is a const function, which makes the Spinlock type usable in statics:

This example is not tested
use spinning_top::Spinlock;
 
static DATA: Spinlock<u32> = Spinlock::new(0);
 
fn main() {
    let mut data = DATA.lock();
    *data += 1;
    assert_eq!(*data, 1);
}