Skip to main content

v_shield/sync/
rwlock.rs

1//! RwLock wrapper multiplataforma
2//!
3//! - `native`: `std::sync::RwLock`
4//! - `wasm`: `std::sync::RwLock` (compatibilidad)
5//! - `async-tokio`: `tokio::sync::RwLock`
6
7#[cfg(all(feature = "native", not(feature = "async-tokio")))]
8pub use std::sync::RwLock;
9
10#[cfg(all(feature = "wasm", not(feature = "async-tokio")))]
11pub use std::sync::RwLock;
12
13#[cfg(feature = "async-tokio")]
14pub use tokio::sync::RwLock;
15
16#[cfg(test)]
17mod tests {
18    use super::RwLock;
19
20    #[test]
21    fn test_rwlock_read() {
22        let rw = RwLock::new(42);
23        let read = rw.read().unwrap();
24        assert_eq!(*read, 42);
25    }
26
27    #[test]
28    fn test_rwlock_write() {
29        let rw = RwLock::new(vec![1, 2]);
30        {
31            let mut write = rw.write().unwrap();
32            write.push(3);
33        }
34        let read = rw.read().unwrap();
35        assert_eq!(*read, vec![1, 2, 3]);
36    }
37
38    #[test]
39    fn test_rwlock_multiple_readers() {
40        let rw = std::sync::Arc::new(RwLock::new("hello"));
41        let r1 = rw.read().unwrap();
42        let r2 = rw.read().unwrap();
43        assert_eq!(*r1, "hello");
44        assert_eq!(*r2, "hello");
45        drop(r1);
46        drop(r2);
47    }
48}