aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteven Fackler <[email protected]>2013-12-29 09:29:49 -0700
committerSteven Fackler <[email protected]>2013-12-29 09:29:49 -0700
commit4d7aa586808087677e1ebf496508baacff9509b7 (patch)
treeadabf423e530b00263c8adb8b93f1b46ace91391
parentAdd a crate_type attribute (diff)
downloadrust-openssl-4d7aa586808087677e1ebf496508baacff9509b7.tar.xz
rust-openssl-4d7aa586808087677e1ebf496508baacff9509b7.zip
Switch to real mutex for init.
-rw-r--r--ssl/mod.rs43
1 files changed, 22 insertions, 21 deletions
diff --git a/ssl/mod.rs b/ssl/mod.rs
index 777e5dae..7c95f5cf 100644
--- a/ssl/mod.rs
+++ b/ssl/mod.rs
@@ -1,10 +1,9 @@
use std::cast;
use std::libc::{c_int, c_void, c_char};
use std::ptr;
-use std::task;
-use std::sync::atomics::{AtomicBool, INIT_ATOMIC_BOOL, AtomicUint,
- INIT_ATOMIC_UINT, Acquire, Release, SeqCst};
-use std::unstable::mutex::Mutex;
+use std::sync::atomics::{AtomicUint, INIT_ATOMIC_UINT, Acquire, Release, SeqCst};
+use std::unstable::finally::Finally;
+use std::unstable::mutex::{Mutex, MUTEX_INIT};
use std::io::{Stream, Reader, Writer, Decorator};
use std::vec;
@@ -15,8 +14,8 @@ mod ffi;
#[cfg(test)]
mod tests;
-static mut STARTED_INIT: AtomicBool = INIT_ATOMIC_BOOL;
-static mut FINISHED_INIT: AtomicBool = INIT_ATOMIC_BOOL;
+static mut INIT_LOCK: Mutex = MUTEX_INIT;
+static mut INITIALIZED: bool = false;
static mut VERIFY_IDX: AtomicUint = INIT_ATOMIC_UINT;
@@ -25,26 +24,28 @@ static mut MUTEXES: AtomicUint = INIT_ATOMIC_UINT;
fn init() {
unsafe {
- if STARTED_INIT.swap(true, Acquire) {
- while !FINISHED_INIT.load(Release) {
- task::deschedule();
+ INIT_LOCK.lock();
+ (|| {
+ if INITIALIZED {
+ return;
}
- return;
- }
- ffi::SSL_library_init();
- let verify_idx = ffi::SSL_CTX_get_ex_new_index(0, ptr::null(), None,
- None, None);
- assert!(verify_idx >= 0);
- VERIFY_IDX.store(verify_idx as uint, Release);
+ ffi::SSL_library_init();
+ let verify_idx = ffi::SSL_CTX_get_ex_new_index(0, ptr::null(), None,
+ None, None);
+ assert!(verify_idx >= 0);
+ VERIFY_IDX.store(verify_idx as uint, Release);
- let num_locks = ffi::CRYPTO_num_locks();
- let mutexes = ~vec::from_fn(num_locks as uint, |_| Mutex::new());
- MUTEXES.store(cast::transmute(mutexes), Release);
+ let num_locks = ffi::CRYPTO_num_locks();
+ let mutexes = ~vec::from_fn(num_locks as uint, |_| Mutex::new());
+ MUTEXES.store(cast::transmute(mutexes), Release);
- ffi::CRYPTO_set_locking_callback(locking_function);
+ ffi::CRYPTO_set_locking_callback(locking_function);
- FINISHED_INIT.store(true, Release);
+ INITIALIZED = true;
+ }).finally(|| {
+ INIT_LOCK.unlock();
+ })
}
}