Crates.io | read-write-api |
lib.rs | read-write-api |
version | 0.17.2 |
source | src |
created_at | 2023-06-23 11:18:26.208909 |
updated_at | 2023-09-07 12:23:55.176189 |
description | Provides an interface to unify single-threaded code and RwLocks-based code. |
homepage | |
repository | https://github.com/andrewsonin/read_write_api |
max_upload_size | |
id | 898170 |
size | 28,432 |
Provides an interface to unify single-threaded code and RwLocks-based code.
A nice side effect of this trait is manifested in the activation
of the borrow-checker to check the absence of deadlocks introduced in the current scope.
This is because Self::write
can now only be called on a mutable,
but not constant, reference.
use parking_lot::RwLock;
use read_write_api::{
DowngradableWriteGuard,
RwApi,
RwApiWrapper,
RwApiWrapperOwned,
UpgradableReadGuard,
};
fn do_something(mut x: impl RwApi<Target=u64>) -> u64 {
let guard = x.upgradable_read();
if *guard == 1 {
let mut guard = guard.upgrade_to_downgradable();
*guard = 2;
*guard.downgrade()
} else {
*guard
}
}
assert_eq!(do_something(RwApiWrapperOwned(1)), 2);
assert_eq!(do_something(RwApiWrapperOwned(3)), 3);
assert_eq!(do_something(&mut RwApiWrapperOwned(1)), 2);
assert_eq!(do_something(&mut RwApiWrapperOwned(3)), 3);
assert_eq!(do_something(RwLock::new(1)), 2);
assert_eq!(do_something(RwLock::new(3)), 3);
assert_eq!(do_something(&RwLock::new(1)), 2);
assert_eq!(do_something(&RwLock::new(3)), 3);
assert_eq!(do_something(&mut RwLock::new(1)), 2);
assert_eq!(do_something(&mut RwLock::new(3)), 3);
fn do_something_ref<'a>(mut x: impl RwApi<Target=&'a mut u64>) -> u64 {
if **x.read() == 1 {
**x.write() = 2;
**x.read()
} else {
**x.read()
}
}
assert_eq!(do_something_ref(RwApiWrapper(&mut 1)), 2);
assert_eq!(do_something_ref(RwApiWrapper(&mut 3)), 3);
assert_eq!(do_something_ref(&mut RwApiWrapper(&mut 1)), 2);
assert_eq!(do_something_ref(&mut RwApiWrapper(&mut 3)), 3);
assert_eq!(do_something_ref(RwLock::new(&mut 1)), 2);
assert_eq!(do_something_ref(RwLock::new(&mut 3)), 3);
assert_eq!(do_something_ref(&RwLock::new(&mut 1)), 2);
assert_eq!(do_something_ref(&RwLock::new(&mut 3)), 3);
assert_eq!(do_something_ref(&mut RwLock::new(&mut 1)), 2);
assert_eq!(do_something_ref(&mut RwLock::new(&mut 3)), 3);