read-write-api

Crates.ioread-write-api
lib.rsread-write-api
version0.17.2
sourcesrc
created_at2023-06-23 11:18:26.208909
updated_at2023-09-07 12:23:55.176189
descriptionProvides an interface to unify single-threaded code and RwLocks-based code.
homepage
repositoryhttps://github.com/andrewsonin/read_write_api
max_upload_size
id898170
size28,432
Andrew Sonin (andrewsonin)

documentation

README

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.

Example

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);
Commit count: 22

cargo fmt