Vulnerabilities | |||||
---|---|---|---|---|---|
Version | Suggest | Low | Medium | High | Critical |
0.10.0 | 0 | 0 | 0 | 0 | 0 |
0.9.8 | 0 | 0 | 0 | 0 | 0 |
0.9.7 | 0 | 0 | 1 | 0 | 0 |
0.9.6 | 0 | 0 | 1 | 0 | 0 |
0.9.5 | 0 | 0 | 1 | 0 | 0 |
0.9.4 | 0 | 0 | 1 | 0 | 0 |
0.9.3 | 0 | 0 | 1 | 0 | 0 |
0.9.2 | 0 | 0 | 0 | 0 | 0 |
0.9.1 | 0 | 0 | 0 | 0 | 0 |
0.9.0 | 0 | 0 | 0 | 0 | 0 |
0.8.0 | 0 | 0 | 0 | 0 | 0 |
0.7.1 | 0 | 0 | 0 | 0 | 0 |
0.7.0 | 0 | 0 | 0 | 0 | 0 |
0.6.0 | 0 | 0 | 0 | 0 | 0 |
0.5.2 | 0 | 0 | 0 | 0 | 0 |
0.5.1 | 0 | 0 | 1 | 0 | 0 |
0.5.0 | 0 | 0 | 1 | 0 | 0 |
0.4.10 | 0 | 0 | 1 | 0 | 0 |
0.4.9 | 0 | 0 | 1 | 0 | 0 |
0.4.8 | 0 | 0 | 1 | 0 | 0 |
0.4.7 | 0 | 0 | 1 | 0 | 0 |
0.4.6 | 0 | 0 | 1 | 0 | 0 |
0.4.5 | 0 | 0 | 1 | 0 | 0 |
0.4.4 | 0 | 0 | 1 | 0 | 0 |
0.4.3 | 0 | 0 | 1 | 0 | 0 |
0.4.2 | 0 | 0 | 1 | 0 | 0 |
0.4.1 | 0 | 0 | 1 | 0 | 0 |
0.4.0 | 0 | 0 | 1 | 0 | 0 |
0.3.5 | 0 | 0 | 1 | 0 | 0 |
0.3.4 | 0 | 0 | 1 | 0 | 0 |
0.3.3 | 0 | 0 | 1 | 0 | 0 |
0.3.2 | 0 | 0 | 1 | 0 | 0 |
0.3.1 | 0 | 0 | 1 | 0 | 0 |
0.3.0 | 0 | 0 | 1 | 0 | 0 |
0.2.1 | 0 | 0 | 1 | 0 | 0 |
0.2.0 | 0 | 0 | 1 | 0 | 0 |
0.1.4 | 0 | 0 | 1 | 0 | 0 |
0.1.3 | 0 | 0 | 1 | 0 | 0 |
0.1.2 | 0 | 0 | 1 | 0 | 0 |
0.10.0 - This version is safe to use because it has no known security vulnerabilities at this time. Find out if your coding project uses this component and get notified of any reported security vulnerabilities with Meterian-X Open Source Security Platform
Maintain your licence declarations and avoid unwanted licences to protect your IP the way you intended.
MIT - MIT LicenseSpin-based synchronization primitives.
This crate provides spin-based
versions of the primitives in std::sync
. Because synchronization is done
through spinning, the primitives are suitable for use in no_std
environments.
Before deciding to use spin
, we recommend reading
this superb blog post
by @matklad that discusses the pros and cons of
spinlocks. If you have access to std
, it's likely that the primitives in
std::sync
will serve you better except in very specific circumstances.
Mutex
, RwLock
, Once
, Lazy
and Barrier
equivalentsno_std
environmentslock_api
compatibilityRwLock
guardsInclude the following under the [dependencies]
section in your Cargo.toml
file.
spin = "x.y"
When calling lock
on a Mutex
you will get a guard value that provides access
to the data. When this guard is dropped, the mutex will become available again.
extern crate spin;
use std::{sync::Arc, thread};
fn main() {
let counter = Arc::new(spin::Mutex::new(0));
let thread = thread::spawn({
let counter = counter.clone();
move || {
for _ in 0..100 {
*counter.lock() += 1;
}
}
});
for _ in 0..100 {
*counter.lock() += 1;
}
thread.join().unwrap();
assert_eq!(*counter.lock(), 200);
}
The crate comes with a few feature flags that you may wish to use.
mutex
enables the Mutex
type.
spin_mutex
enables the SpinMutex
type.
ticket_mutex
enables the TicketMutex
type.
use_ticket_mutex
switches to a ticket lock for the implementation of Mutex
. This
is recommended only on targets for which ordinary spinning locks perform very badly
because it will change the implementation used by other crates that depend on spin
.
rwlock
enables the RwLock
type.
once
enables the Once
type.
lazy
enables the Lazy
type.
barrier
enables the Barrier
type.
lock_api
enables support for lock_api
std
enables support for thread yielding instead of spinning.
portable-atomic
enables usage of the portable-atomic
crate
to support platforms without native atomic operations (Cortex-M0, etc.).
The portable_atomic_unsafe_assume_single_core
or critical-section
feature
of portable-atomic
crate must also be set by the final binary crate.
See the documentation for the portable-atomic
crate for more information
with some requirements for no-std build:
https://github.com/taiki-e/portable-atomic#optional-features
It is often desirable to have a lock shared between threads. Wrapping the lock in an
std::sync::Arc
is route through which this might be achieved.
Locks provide zero-overhead access to their data when accessed through a mutable
reference by using their get_mut
methods.
The behaviour of these lock is similar to their namesakes in std::sync
. they
differ on the following:
Many of the feature flags listed above are enabled by default. If you're writing a library, we recommend disabling those that you don't use to avoid increasing compilation time for your crate's users. You can do this like so:
[dependencies]
spin = { version = "x.y", default-features = false, features = [...] }
This crate is guaranteed to compile on a Minimum Safe Rust Version (MSRV) of 1.60.0 and above. This version will not be changed without a minor version bump.
spin
is distributed under the MIT License, (See LICENSE
).