An open API service indexing awesome lists of open source software.

https://github.com/hinto-janai/rolock

Read Only Lock
https://github.com/hinto-janai/rolock

lock read-only rust sync

Last synced: 8 months ago
JSON representation

Read Only Lock

Awesome Lists containing this project

README

          

# RoLock
[![Windows](https://github.com/hinto-janai/rolock/actions/workflows/windows.yml/badge.svg)](https://github.com/hinto-janai/rolock/actions/workflows/windows.yml) [![macOS](https://github.com/hinto-janai/rolock/actions/workflows/macos.yml/badge.svg)](https://github.com/hinto-janai/rolock/actions/workflows/macos.yml) [![Linux](https://github.com/hinto-janai/rolock/actions/workflows/linux.yml/badge.svg)](https://github.com/hinto-janai/rolock/actions/workflows/linux.yml) [![crates.io](https://img.shields.io/crates/v/rolock.svg)](https://crates.io/crates/rolock) [![docs.rs](https://docs.rs/rolock/badge.svg)](https://docs.rs/rolock)

Read Only Lock.

This is a wrapper around `Arc>` that only implements `RwLock::read()` operations.

## Usage
Create a normal `Arc>` in `thread_1`, send a `RoLock` to `thread_2`:
```rust
let rw = Arc::new(RwLock::new(0)); // Regular Arc>.
let ro = RoLock::new(&rw); // Read Only Lock.

assert!(*rw.read().unwrap() == 0); // This can read...
*rw.write().unwrap() = 1; // and write.

std::thread::spawn(move|| {
assert!(*ro.read().unwrap() == 1); // This one can only read.
});
```
- `thread_1` still has full read/write control
- `thread_2` can only `RoLock::read()`

This type guarantees at compile time that you cannot write because the function doesn't even exist:
```rust
let rw = Arc::new(RwLock::new(0));
let ro = RoLock::new(&rw);

ro.write(); // Compile error!
```

Since the inner field of `RoLock` (`self.0`) is private, you can't call `RwLock::write` directly either:
```rust
let rw = Arc::new(RwLock::new(0));
let ro = RoLock::new(&rw);

ro.0.write(); // Compile error!
```