]> git.proxmox.com Git - rustc.git/blame - src/libstd/sys/hermit/mutex.rs
New upstream version 1.41.1+dfsg1
[rustc.git] / src / libstd / sys / hermit / mutex.rs
CommitLineData
e74abb32 1use crate::ffi::c_void;
60c5eb7d 2use crate::ptr;
e74abb32
XL
3use crate::sys::hermit::abi;
4
5pub struct Mutex {
60c5eb7d 6 inner: *const c_void,
e74abb32
XL
7}
8
9unsafe impl Send for Mutex {}
10unsafe impl Sync for Mutex {}
11
12impl Mutex {
13 pub const fn new() -> Mutex {
14 Mutex { inner: ptr::null() }
15 }
16
17 #[inline]
18 pub unsafe fn init(&mut self) {
19 let _ = abi::sem_init(&mut self.inner as *mut *const c_void, 1);
20 }
21
22 #[inline]
23 pub unsafe fn lock(&self) {
24 let _ = abi::sem_timedwait(self.inner, 0);
25 }
26
27 #[inline]
28 pub unsafe fn unlock(&self) {
29 let _ = abi::sem_post(self.inner);
30 }
31
32 #[inline]
33 pub unsafe fn try_lock(&self) -> bool {
34 let result = abi::sem_trywait(self.inner);
35 result == 0
36 }
37
38 #[inline]
39 pub unsafe fn destroy(&self) {
40 let _ = abi::sem_destroy(self.inner);
41 }
42}
43
44pub struct ReentrantMutex {
60c5eb7d 45 inner: *const c_void,
e74abb32
XL
46}
47
48impl ReentrantMutex {
49 pub unsafe fn uninitialized() -> ReentrantMutex {
50 ReentrantMutex { inner: ptr::null() }
51 }
52
53 #[inline]
54 pub unsafe fn init(&mut self) {
55 let _ = abi::recmutex_init(&mut self.inner as *mut *const c_void);
56 }
57
58 #[inline]
59 pub unsafe fn lock(&self) {
60 let _ = abi::recmutex_lock(self.inner);
61 }
62
63 #[inline]
64 pub unsafe fn try_lock(&self) -> bool {
65 true
66 }
67
68 #[inline]
69 pub unsafe fn unlock(&self) {
70 let _ = abi::recmutex_unlock(self.inner);
71 }
72
73 #[inline]
74 pub unsafe fn destroy(&self) {
75 let _ = abi::recmutex_destroy(self.inner);
76 }
77}