1
Fork 0

Avoid creating &muts in Windows ReentrantMutex.

This commit is contained in:
Mara Bos 2020-09-16 21:16:32 +02:00
parent 3fadc603ab
commit 0bb96e7490
2 changed files with 8 additions and 7 deletions

View file

@ -315,6 +315,7 @@
#![feature(try_reserve)] #![feature(try_reserve)]
#![feature(unboxed_closures)] #![feature(unboxed_closures)]
#![feature(unsafe_block_in_unsafe_fn)] #![feature(unsafe_block_in_unsafe_fn)]
#![feature(unsafe_cell_raw_get)]
#![feature(untagged_unions)] #![feature(untagged_unions)]
#![feature(unwind_attributes)] #![feature(unwind_attributes)]
#![feature(vec_into_raw_parts)] #![feature(vec_into_raw_parts)]

View file

@ -148,7 +148,7 @@ fn kind() -> Kind {
} }
pub struct ReentrantMutex { pub struct ReentrantMutex {
inner: UnsafeCell<MaybeUninit<c::CRITICAL_SECTION>>, inner: MaybeUninit<UnsafeCell<c::CRITICAL_SECTION>>,
} }
unsafe impl Send for ReentrantMutex {} unsafe impl Send for ReentrantMutex {}
@ -156,27 +156,27 @@ unsafe impl Sync for ReentrantMutex {}
impl ReentrantMutex { impl ReentrantMutex {
pub const fn uninitialized() -> ReentrantMutex { pub const fn uninitialized() -> ReentrantMutex {
ReentrantMutex { inner: UnsafeCell::new(MaybeUninit::uninit()) } ReentrantMutex { inner: MaybeUninit::uninit() }
} }
pub unsafe fn init(&self) { 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) { pub unsafe fn lock(&self) {
c::EnterCriticalSection((&mut *self.inner.get()).as_mut_ptr()); c::EnterCriticalSection(UnsafeCell::raw_get(self.inner.as_ptr()));
} }
#[inline] #[inline]
pub unsafe fn try_lock(&self) -> bool { 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) { 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) { pub unsafe fn destroy(&self) {
c::DeleteCriticalSection((&mut *self.inner.get()).as_mut_ptr()); c::DeleteCriticalSection(UnsafeCell::raw_get(self.inner.as_ptr()));
} }
} }