Skip to content

Commit

Permalink
Add example showcasing how to replace parking_lot
Browse files Browse the repository at this point in the history
  • Loading branch information
bertptrs committed Jan 18, 2025
1 parent 0f20198 commit 7ae0bd3
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 0 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
- On Rust 1.80 or newer, a wrapper for `std::sync::LazyLock` is now available. The MSRV has not been
changed; older versions simply don't get this wrapper.

- Added missing const-initialisation wrappers for `parking_lot`. The API interface for
`tracing_mutex::parkinglot` is now identical to `parking_lot`, and an example showing how to use
it as a drop-in replacement was added.

### Changed

- Reworked CI to better test continued support for the minimum supported Rust version
Expand Down
4 changes: 4 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@ rand = "0.8"
name = "mutex"
harness = false

[[example]]
name = "drop_in_parking_lot"
required-features = ["parkinglot"]

[features]
default = ["backtraces"]
backtraces = []
Expand Down
32 changes: 32 additions & 0 deletions examples/drop_in_parking_lot.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
//! This example shows how you can use the [`tracing-mutex`] crate as a drop-in replacement for the
//! parking_lot crate. By default, `tracing-mutex` offers a set of type aliases that allows you to
//! use cycle-checking in development, and raw primitives in release mode, but this way, you can
//! even remove the dependency altogether, or hide it behind a feature.
//!
//! You can use whatever conditional compilation makes sense in context.
use std::sync::Arc;

#[cfg(not(debug_assertions))]
use parking_lot;

#[cfg(debug_assertions)]
// Note: specifically use the `tracing` module, because at this point we are very sure we want to do
// deadlock tracing, so no need to use the automatic selection.
use tracing_mutex::parkinglot::tracing as parking_lot;

fn main() {
let mutex = Arc::new(parking_lot::const_mutex(0));

let handles: Vec<_> = (0..42)
.map(|_| {
let mutex = Arc::clone(&mutex);
std::thread::spawn(move || *mutex.lock() += 1)
})
.collect();

handles
.into_iter()
.for_each(|handle| handle.join().unwrap());

assert_eq!(*mutex.lock(), 42);
}

0 comments on commit 7ae0bd3

Please sign in to comment.