# ARCHIVED ARCHIVED ARCHIVED This crate is archived and will not be updated. [`std::sync::Mutex`] got a `const` constructor, making this crate unnecessary. See [rustlang/rust#66806](https://github.com/rust-lang/rust/issues/66806). Don't use this crate. Just use [`std::sync::Mutex`]. For folks who continue using this crate, `SafeLock` is now a simple wrapper around [`std::sync::Mutex`], so their tests will run a bit faster. ---- # safe-lock A simple `SafeLock` struct. # Use Cases - Run tests sequentially - Prevent concurrent operations on atomic values - Prevent concurrent operations on data and systems outside the Rust runtime # Features - Const constructor - Depends only on `std` - `forbid(unsafe_code)` - 100% test coverage # Limitations - Not a `Mutex`. Does not contain a value. - Unoptimized. Uses [`AtomicBool`](https://doc.rust-lang.org/core/sync/atomic/struct.AtomicBool.html) in a spinlock, not fast OS locks. - Not a fair lock. If multiple threads acquire the lock in loops, some may never acquire it. # Alternatives - [`rusty-fork`](https://crates.io/crates/rusty-fork) - Run tests in separate processes - [`std::sync::Mutex`](https://doc.rust-lang.org/std/sync/struct.Mutex.html) - Part of the Rust standard library: well reviewed, well tested, and well maintained. - Uses fast OS locks - Has no const constructor. See [rust#66806](https://github.com/rust-lang/rust/issues/66806) and [const-eval#3](https://github.com/rust-lang/const-eval/issues/3). You can work around this with unstable [`core::lazy::OnceCell`](https://doc.rust-lang.org/core/lazy/struct.OnceCell.html) or various `unsafe` crates: [`lazy_static`](https://crates.io/crates/lazy_static), [`once_cell`](https://crates.io/crates/once_cell), [`lazycell`](https://crates.io/crates/lazycell), and [`conquer-once`](https://crates.io/crates/conquer-once). - [`parking_lot`](https://crates.io/crates/parking_lot) - Well written code. Many hope that it will end up in the Rust standard library someday. - Contains plenty of `unsafe` - [`try-lock`](https://crates.io/crates/try-lock) - Popular - No dependencies, `no_std` - Uses `unsafe` - [`ruspiro-lock`](https://crates.io/crates/ruspiro-lock) - Sync and async locks - No dependencies, `no_std` - Uses `unsafe` - [`flexible-locks`](https://crates.io/crates/flexible-locks) - Lots of `unsafe` - Uses fast OS locks - Unmaintained # Related Crates - [`safina-sync`](https://crates.io/crates/safina-sync) provides a safe async `Mutex` # Example Make some tests run sequentially so they don't interfere with each other: ```unknown use safe_lock::SafeLock; static LOCK: SafeLock = SafeLock::new(); [#test] fn test1() { let _guard = LOCK.lock(); // ... } [#test] fn test2() { let _guard = LOCK.lock(); // ... } ``` # Cargo Geiger Safety Report ``` Metric output format: x/y x = unsafe code used by the build y = total unsafe code found in the crate Symbols: 🔒 = No `unsafe` usage found, declares #![forbid(unsafe_code)] ❓ = No `unsafe` usage found, missing #![forbid(unsafe_code)] ☢️ = `unsafe` usage found Functions Expressions Impls Traits Methods Dependency 0/0 0/0 0/0 0/0 0/0 🔒 safe-lock 0.1.4 0/0 0/0 0/0 0/0 0/0 ``` # Changelog - v0.1.4 - Make `SafeLock` a wrapper around [`std::sync::Mutex`] since it got a const constructor. - Add archival notice. - v0.1.3 - Increase test coverage - v0.1.2 - Use `Acquire` and `Release` ordering - v0.1.1 - Update docs - v0.1.0 - Initial version License: Apache-2.0