#![feature(try_reserve)]
#![feature(unboxed_closures)]
#![feature(unsafe_block_in_unsafe_fn)]
+#![feature(unsafe_cell_raw_get)]
#![feature(untagged_unions)]
#![feature(unwind_attributes)]
#![feature(vec_into_raw_parts)]
}
pub struct ReentrantMutex {
- inner: UnsafeCell<MaybeUninit<c::CRITICAL_SECTION>>,
+ inner: MaybeUninit<UnsafeCell<c::CRITICAL_SECTION>>,
}
unsafe impl Send for ReentrantMutex {}
impl ReentrantMutex {
pub const fn uninitialized() -> ReentrantMutex {
- ReentrantMutex { inner: UnsafeCell::new(MaybeUninit::uninit()) }
+ ReentrantMutex { inner: MaybeUninit::uninit() }
}
pub unsafe fn init(&self) {
- c::InitializeCriticalSection((&mut *self.inner.get()).as_mut_ptr());
+ c::InitializeCriticalSection(UnsafeCell::raw_get(self.inner.as_ptr()));
}
pub unsafe fn lock(&self) {
- c::EnterCriticalSection((&mut *self.inner.get()).as_mut_ptr());
+ c::EnterCriticalSection(UnsafeCell::raw_get(self.inner.as_ptr()));
}
#[inline]
pub unsafe fn try_lock(&self) -> bool {
- c::TryEnterCriticalSection((&mut *self.inner.get()).as_mut_ptr()) != 0
+ c::TryEnterCriticalSection(UnsafeCell::raw_get(self.inner.as_ptr())) != 0
}
pub unsafe fn unlock(&self) {
- c::LeaveCriticalSection((&mut *self.inner.get()).as_mut_ptr());
+ c::LeaveCriticalSection(UnsafeCell::raw_get(self.inner.as_ptr()));
}
pub unsafe fn destroy(&self) {
- c::DeleteCriticalSection((&mut *self.inner.get()).as_mut_ptr());
+ c::DeleteCriticalSection(UnsafeCell::raw_get(self.inner.as_ptr()));
}
}