| Crates.io | lockpool |
| lib.rs | lockpool |
| version | 3.0.1 |
| created_at | 2021-10-15 03:37:43.779263+00 |
| updated_at | 2022-11-23 22:20:11.693525+00 |
| description | This library offers a pool of locks where individual locks can be locked/unlocked by key |
| homepage | https://github.com/smessmer/lockpool |
| repository | https://github.com/smessmer/lockpool |
| max_upload_size | |
| id | 465212 |
| size | 99,843 |
This library is not maintained anymore. Please use the lockable crate instead.
It offers a LockPool data structure with pretty much the same functionality that was offered by this crate. There is an example for a lock pool in the README.
This library offers a pool of locks where individual locks can be locked/unlocked by key. It initially considers all keys as "unlocked", but they can be locked and if a second thread tries to acquire a lock for the same key, they will have to wait.
use lockpool::{LockPool, SyncLockPool};
let pool = SyncLockPool::new();
let guard1 = pool.lock(4)?;
let guard2 = pool.lock(5)?;
// This next line would cause a deadlock or panic because `4` is already locked on this thread
// let guard3 = pool.lock(4)?;
// After dropping the corresponding guard, we can lock it again
std::mem::drop(guard1);
let guard3 = pool.lock(4)?;
You can use an arbitrary type to index locks by, as long as that type implements PartialEq + Eq + Hash + Clone + Debug.
use lockpool::{LockPool, SyncLockPool};
#[derive(PartialEq, Eq, Hash, Clone, Debug)]
struct CustomLockKey(u32);
let pool = SyncLockPool::new();
let guard = pool.lock(CustomLockKey(4))?;
Under the hood, a LockPool is a HashMap of Mutexes, with some logic making sure there aren't any race conditions when accessing the hash map.
If the tokio feature is enabled, then this crate also offers [TokioLockPool] which allows locks to be held across await points.
License: MIT OR Apache-2.0