lockable
The lockable library offers thread-safe HashMap (see LockableHashMap) and LruCache (see LockableLruCache) types where individual keys can be locked/unlocked, even if there is no entry for this key in the map.
This can be very useful for synchronizing access to an underlying key-value store or for building cache data structures on top of such a key-value store.
LRU cache example
This example builds a simple LRU cache and locks some entries.
use ;
let lockable_cache: = new;
// Insert an entry
lockable_cache.async_lock
.await?
.insert;
// Hold a lock on a different entry
let guard = lockable_cache.async_lock
.await?;
// This next line would wait until the lock gets released, which in this case would
// cause a deadlock because we're on the same thread.
// let guard2 = lockable_cache.async_lock(5, AsyncLimit::no_limit()).await?;
// After dropping the corresponding guard, we can lock it again
drop;
let guard2 = lockable_cache.async_lock.await?;
Lockpool example
This example builds a simple lock pool using the LockableHashMap data structure. A lock pool is a pool of keyable locks. In this example, the entries don't have a value assigned to them and the lock pool is only used to synchronize access to some keyed resource.
use ;
let lockable_cache: = new;
let entry1 = lockable_cache.async_lock.await?;
let entry2 = lockable_cache.async_lock.await?;
// This next line would wait until the lock gets released, which in this case would
// cause a deadlock because we're on the same thread.
// let entry3 = lockable_cache.async_lock(4, AsyncLimit::no_limit()).await?;
// After dropping the corresponding guard, we can lock it again
drop;
let entry3 = lockable_cache.async_lock.await?;
License: MIT OR Apache-2.0