about summary refs log tree commit diff
path: root/src/libstd/sys/windows/mutex.rs
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2015-05-05 16:44:28 -0700
committerAlex Crichton <alex@alexcrichton.com>2015-05-07 09:30:00 -0700
commit7529bd60c3cbc4c7b635ee43a89d5b14f6fb8bf7 (patch)
tree3497eae8c3d88f0f1b5c1e9fb3cf289b751c414e /src/libstd/sys/windows/mutex.rs
parenta031325e83b8f050f840395239197ea87361ada5 (diff)
downloadrust-7529bd60c3cbc4c7b635ee43a89d5b14f6fb8bf7.tar.gz
rust-7529bd60c3cbc4c7b635ee43a89d5b14f6fb8bf7.zip
std: Remove a double-box in ReentrantMutex
Perform unsafe initialization up front and then only afterward the mutex is in
place do we initialize it.
Diffstat (limited to 'src/libstd/sys/windows/mutex.rs')
-rw-r--r--src/libstd/sys/windows/mutex.rs12
1 files changed, 7 insertions, 5 deletions
diff --git a/src/libstd/sys/windows/mutex.rs b/src/libstd/sys/windows/mutex.rs
index ca20858bb5b..9d2624f9418 100644
--- a/src/libstd/sys/windows/mutex.rs
+++ b/src/libstd/sys/windows/mutex.rs
@@ -59,16 +59,18 @@ impl Mutex {
     }
 }
 
-pub struct ReentrantMutex { inner: Box<UnsafeCell<ffi::CRITICAL_SECTION>> }
+pub struct ReentrantMutex { inner: UnsafeCell<ffi::CRITICAL_SECTION> }
 
 unsafe impl Send for ReentrantMutex {}
 unsafe impl Sync for ReentrantMutex {}
 
 impl ReentrantMutex {
-    pub unsafe fn new() -> ReentrantMutex {
-        let mutex = ReentrantMutex { inner: box mem::uninitialized() };
-        ffi::InitializeCriticalSection(mutex.inner.get());
-        mutex
+    pub unsafe fn uninitialized() -> ReentrantMutex {
+        mem::uninitialized()
+    }
+
+    pub unsafe fn init(&mut self) {
+        ffi::InitializeCriticalSection(self.inner.get());
     }
 
     pub unsafe fn lock(&self) {