Crates.io | spinning_top |
lib.rs | spinning_top |
version | 0.3.0 |
source | src |
created_at | 2020-02-12 12:20:47.829378 |
updated_at | 2023-10-19 05:52:13.265054 |
description | A simple spinlock crate based on the abstractions provided by `lock_api`. |
homepage | |
repository | https://github.com/rust-osdev/spinning_top |
max_upload_size | |
id | 207662 |
size | 86,754 |
A simple spinlock crate based on the abstractions provided by lock_api
.
First, import the crate as a dependency in your Cargo.toml
. Then you can use it in the following way:
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
}
Spinlock::new
is a const
function. This makes the Spinlock
type
usable in statics:
use spinning_top::Spinlock;
static DATA: Spinlock<u32> = Spinlock::new(0);
fn main() {
let mut data = DATA.lock();
*data += 1;
assert_eq!(*data, 1);
}
Licensed under either of
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.