]> git.lizzy.rs Git - rust.git/blob - src/libstd/sys/wasm/mutex.rs
Rollup merge of #58802 - nnethercote:inline-record_layout, r=oli-obk
[rust.git] / src / libstd / sys / wasm / mutex.rs
1 use crate::cell::UnsafeCell;
2
3 pub struct Mutex {
4     locked: UnsafeCell<bool>,
5 }
6
7 unsafe impl Send for Mutex {}
8 unsafe impl Sync for Mutex {} // no threads on wasm
9
10 impl Mutex {
11     pub const fn new() -> Mutex {
12         Mutex { locked: UnsafeCell::new(false) }
13     }
14
15     #[inline]
16     pub unsafe fn init(&mut self) {
17     }
18
19     #[inline]
20     pub unsafe fn lock(&self) {
21         let locked = self.locked.get();
22         assert!(!*locked, "cannot recursively acquire mutex");
23         *locked = true;
24     }
25
26     #[inline]
27     pub unsafe fn unlock(&self) {
28         *self.locked.get() = false;
29     }
30
31     #[inline]
32     pub unsafe fn try_lock(&self) -> bool {
33         let locked = self.locked.get();
34         if *locked {
35             false
36         } else {
37             *locked = true;
38             true
39         }
40     }
41
42     #[inline]
43     pub unsafe fn destroy(&self) {
44     }
45 }
46
47 // All empty stubs because wasm has no threads yet, so lock acquisition always
48 // succeeds.
49 pub struct ReentrantMutex {
50 }
51
52 impl ReentrantMutex {
53     pub unsafe fn uninitialized() -> ReentrantMutex {
54         ReentrantMutex { }
55     }
56
57     pub unsafe fn init(&mut self) {}
58
59     pub unsafe fn lock(&self) {}
60
61     #[inline]
62     pub unsafe fn try_lock(&self) -> bool {
63         true
64     }
65
66     pub unsafe fn unlock(&self) {}
67
68     pub unsafe fn destroy(&self) {}
69 }