diff options
| author | Steven Fackler <[email protected]> | 2013-12-29 09:29:49 -0700 |
|---|---|---|
| committer | Steven Fackler <[email protected]> | 2013-12-29 09:29:49 -0700 |
| commit | 4d7aa586808087677e1ebf496508baacff9509b7 (patch) | |
| tree | adabf423e530b00263c8adb8b93f1b46ace91391 | |
| parent | Add a crate_type attribute (diff) | |
| download | rust-openssl-4d7aa586808087677e1ebf496508baacff9509b7.tar.xz rust-openssl-4d7aa586808087677e1ebf496508baacff9509b7.zip | |
Switch to real mutex for init.
| -rw-r--r-- | ssl/mod.rs | 43 |
1 files changed, 22 insertions, 21 deletions
@@ -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(); + }) } } |