summaryrefslogtreecommitdiffstats
path: root/src/lib.rs
blob: e9a7c6b3d97d56aaa9cd9f2459ce3e9d4fdf675f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
// -*- coding: utf-8 -*-
//
// Copyright 2021-2023 Michael Büsch <m@bues.ch>
//
// Licensed under the Apache License version 2.0
// or the MIT license, at your option.
// SPDX-License-Identifier: Apache-2.0 OR MIT
//

//! This crate provides locks/mutexes for multi-threaded access to a single [std::vec::Vec] instance.
//!
//! # VecRangeLock: General purpose range lock
//!
//! This is a very basic usage example.
//! For a more complex example, please see the [VecRangeLock] struct documentation.
//!
//! ```
//! use range_lock::VecRangeLock;
//! use std::sync::Arc;
//! use std::thread;
//!
//! let lock = Arc::new(VecRangeLock::new(vec![1, 2, 3, 4, 5]));
//!
//! thread::spawn(move || {
//!     let mut guard = lock.try_lock(2..4).expect("Failed to lock range 2..4");
//!     assert_eq!(guard[0], 3);
//!     guard[0] = 10;
//! });
//! ```
//!
//! # RepVecRangeLock: Restricted interleaved pattern range lock
//!
//! This is a very basic usage example.
//! For a more complex example, please see the [RepVecRangeLock] struct documentation.
//!
//! ```
//! use range_lock::RepVecRangeLock;
//! use std::sync::Arc;
//! use std::thread;
//!
//! let data = vec![1, 2, 3,  // <- cycle 0
//!                 4, 5, 6]; // <- cycle 1
//! //              ^  ^  ^
//! //              |  |  |
//! //              |  |  offset-2
//! //       offset-0  offset-1
//!
//! let lock = Arc::new(RepVecRangeLock::new(data,
//!                                          1,    // slice_len: Each slice has 1 element.
//!                                          3));  // cycle_len: Each cycle has 3 slices (offsets).
//! thread::spawn(move || {
//!     // Lock slice offset 1:
//!     let mut guard = lock.try_lock(1).expect("Failed to lock offset.");
//!
//!     assert_eq!(guard[0][0], 2);     // Cycle 0, Slice element 0
//!     assert_eq!(guard[1][0], 5);     // Cycle 1, Slice element 0
//!
//!     guard[0][0] = 20;               // Cycle 0, Slice element 0
//!     guard[1][0] = 50;               // Cycle 1, Slice element 0
//! });
//! ```

mod lockedranges;
mod rangelock;
mod reprangelock;
mod util;

pub use rangelock::{VecRangeLock, VecRangeLockGuard};
pub use reprangelock::{RepVecRangeLock, RepVecRangeLockGuard};

// vim: ts=4 sw=4 expandtab
bues.ch cgit interface