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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/* Copyright (C) 2025 Saúl Valdelvira
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. */
//! Spinlock-based synchronization primitives
//!
//! The following synchronization primitives are implemented
//! - [Mutex]
//! - [RwLock]
//! - [OnceLock]
//! - [LazyLock]
//! - [Condvar]
//!
//! # Examples
//! ## Mutex
//! ```
//! use syncrs::{Mutex, LazyLock};
//!
//! static N: Mutex<u32> = Mutex::new(0);
//!
//! let threads = (0..10).map(|_|{
//! std::thread::spawn(move || {
//! let mut sync_n = N.lock();
//! for _ in 0..10 {
//! *sync_n += 1;
//! }
//! })
//! }).collect::<Vec<_>>();
//!
//! for t in threads {
//! t.join().unwrap();
//! }
//!
//! assert_eq!(*N.lock(), 100);
//! ```
//!
//! ## LazyLock
//! ```no_run
//! use syncrs::LazyLock;
//! use std::collections::HashMap;
//!
//! static MAP: LazyLock<HashMap<i32, String>> = LazyLock::new(|| {
//! let mut map = HashMap::new();
//! for n in 0..10 {
//! map.insert(n, format!("{n}"));
//! }
//! map
//! });
//!
//! let map = MAP.get(); /* MAP is initialized at this point */
//! assert_eq!(
//! map.get(&4).map(|s| s.as_str()),
//! Some("4"),
//! );
//! ```
pub use Mutex;
pub use RwLock;
pub use Arc;
pub use Semaphore;
pub use Condvar;
pub use OnceLock;
pub use LazyLock;