]> git.lizzy.rs Git - rust.git/blob - library/std/src/sys/unsupported/rwlock.rs
Auto merge of #91962 - matthiaskrgr:rollup-2g082jw, r=matthiaskrgr
[rust.git] / library / std / src / sys / unsupported / rwlock.rs
1 use crate::cell::Cell;
2
3 pub struct RWLock {
4     // This platform has no threads, so we can use a Cell here.
5     mode: Cell<isize>,
6 }
7
8 pub type MovableRWLock = RWLock;
9
10 unsafe impl Send for RWLock {}
11 unsafe impl Sync for RWLock {} // no threads on this platform
12
13 impl RWLock {
14     pub const fn new() -> RWLock {
15         RWLock { mode: Cell::new(0) }
16     }
17
18     #[inline]
19     pub unsafe fn read(&self) {
20         let m = self.mode.get();
21         if m >= 0 {
22             self.mode.set(m + 1);
23         } else {
24             rtabort!("rwlock locked for writing");
25         }
26     }
27
28     #[inline]
29     pub unsafe fn try_read(&self) -> bool {
30         let m = self.mode.get();
31         if m >= 0 {
32             self.mode.set(m + 1);
33             true
34         } else {
35             false
36         }
37     }
38
39     #[inline]
40     pub unsafe fn write(&self) {
41         if self.mode.replace(-1) != 0 {
42             rtabort!("rwlock locked for reading")
43         }
44     }
45
46     #[inline]
47     pub unsafe fn try_write(&self) -> bool {
48         if self.mode.get() == 0 {
49             self.mode.set(-1);
50             true
51         } else {
52             false
53         }
54     }
55
56     #[inline]
57     pub unsafe fn read_unlock(&self) {
58         self.mode.set(self.mode.get() - 1);
59     }
60
61     #[inline]
62     pub unsafe fn write_unlock(&self) {
63         assert_eq!(self.mode.replace(0), -1);
64     }
65
66     #[inline]
67     pub unsafe fn destroy(&self) {}
68 }