diff options
| author | bors <bors@rust-lang.org> | 2014-02-15 15:21:28 -0800 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2014-02-15 15:21:28 -0800 |
| commit | d98668a55996d656072a4cac7abb1dcbbdf4f48b (patch) | |
| tree | 9480a773995df199411254f148e321b64cd24556 /src/libnative | |
| parent | 6b025c803c72d610c2ad4c950151b0d23782d114 (diff) | |
| parent | 4668cdf3c4788e4a67f1b7dea0eb2d661ac05a49 (diff) | |
| download | rust-d98668a55996d656072a4cac7abb1dcbbdf4f48b.tar.gz rust-d98668a55996d656072a4cac7abb1dcbbdf4f48b.zip | |
auto merge of #12235 : huonw/rust/raii-lock, r=alexcrichton
- adds a `LockGuard` type returned by `.lock` and `.trylock` that unlocks the mutex in the destructor - renames `mutex::Mutex` to `StaticNativeMutex` - adds a `NativeMutex` type with a destructor - removes `LittleLock` - adds `#[must_use]` to `sync::mutex::Guard` to remind people to use it
Diffstat (limited to 'src/libnative')
| -rw-r--r-- | src/libnative/bookkeeping.rs | 18 | ||||
| -rw-r--r-- | src/libnative/io/net.rs | 7 | ||||
| -rw-r--r-- | src/libnative/io/timer_helper.rs | 7 | ||||
| -rw-r--r-- | src/libnative/task.rs | 27 |
4 files changed, 24 insertions, 35 deletions
diff --git a/src/libnative/bookkeeping.rs b/src/libnative/bookkeeping.rs index 868586b3691..b1addc5cda5 100644 --- a/src/libnative/bookkeeping.rs +++ b/src/libnative/bookkeeping.rs @@ -17,10 +17,10 @@ //! The green counterpart for this is bookkeeping on sched pools. use std::sync::atomics; -use std::unstable::mutex::{Mutex, MUTEX_INIT}; +use std::unstable::mutex::{StaticNativeMutex, NATIVE_MUTEX_INIT}; static mut TASK_COUNT: atomics::AtomicUint = atomics::INIT_ATOMIC_UINT; -static mut TASK_LOCK: Mutex = MUTEX_INIT; +static mut TASK_LOCK: StaticNativeMutex = NATIVE_MUTEX_INIT; pub fn increment() { let _ = unsafe { TASK_COUNT.fetch_add(1, atomics::SeqCst) }; @@ -29,9 +29,8 @@ pub fn increment() { pub fn decrement() { unsafe { if TASK_COUNT.fetch_sub(1, atomics::SeqCst) == 1 { - TASK_LOCK.lock(); - TASK_LOCK.signal(); - TASK_LOCK.unlock(); + let mut guard = TASK_LOCK.lock(); + guard.signal(); } } } @@ -40,11 +39,12 @@ pub fn decrement() { /// the entry points of native programs pub fn wait_for_other_tasks() { unsafe { - TASK_LOCK.lock(); - while TASK_COUNT.load(atomics::SeqCst) > 0 { - TASK_LOCK.wait(); + { + let mut guard = TASK_LOCK.lock(); + while TASK_COUNT.load(atomics::SeqCst) > 0 { + guard.wait(); + } } - TASK_LOCK.unlock(); TASK_LOCK.destroy(); } } diff --git a/src/libnative/io/net.rs b/src/libnative/io/net.rs index ec6a5c5cb9b..b33b54862dc 100644 --- a/src/libnative/io/net.rs +++ b/src/libnative/io/net.rs @@ -218,11 +218,11 @@ pub fn init() { } unsafe { - use std::unstable::mutex::{Mutex, MUTEX_INIT}; + use std::unstable::mutex::{StaticNativeMutex, NATIVE_MUTEX_INIT}; static mut INITIALIZED: bool = false; - static mut LOCK: Mutex = MUTEX_INIT; + static mut LOCK: StaticNativeMutex = NATIVE_MUTEX_INIT; - LOCK.lock(); + let _guard = LOCK.lock(); if !INITIALIZED { let mut data: WSADATA = mem::init(); let ret = WSAStartup(0x202, // version 2.2 @@ -230,7 +230,6 @@ pub fn init() { assert_eq!(ret, 0); INITIALIZED = true; } - LOCK.unlock(); } } diff --git a/src/libnative/io/timer_helper.rs b/src/libnative/io/timer_helper.rs index 2c976e67d25..004cd6f3114 100644 --- a/src/libnative/io/timer_helper.rs +++ b/src/libnative/io/timer_helper.rs @@ -22,7 +22,7 @@ use std::cast; use std::rt; -use std::unstable::mutex::{Mutex, MUTEX_INIT}; +use std::unstable::mutex::{StaticNativeMutex, NATIVE_MUTEX_INIT}; use bookkeeping; use io::timer::{Req, Shutdown}; @@ -37,11 +37,11 @@ static mut HELPER_CHAN: *mut Chan<Req> = 0 as *mut Chan<Req>; static mut HELPER_SIGNAL: imp::signal = 0 as imp::signal; pub fn boot(helper: fn(imp::signal, Port<Req>)) { - static mut LOCK: Mutex = MUTEX_INIT; + static mut LOCK: StaticNativeMutex = NATIVE_MUTEX_INIT; static mut INITIALIZED: bool = false; unsafe { - LOCK.lock(); + let mut _guard = LOCK.lock(); if !INITIALIZED { let (msgp, msgc) = Chan::new(); // promote this to a shared channel @@ -58,7 +58,6 @@ pub fn boot(helper: fn(imp::signal, Port<Req>)) { rt::at_exit(proc() { shutdown() }); INITIALIZED = true; } - LOCK.unlock(); } } diff --git a/src/libnative/task.rs b/src/libnative/task.rs index a9c3afbbb16..d8f410834f2 100644 --- a/src/libnative/task.rs +++ b/src/libnative/task.rs @@ -22,7 +22,7 @@ use std::rt::task::{Task, BlockedTask, SendMessage}; use std::rt::thread::Thread; use std::rt; use std::task::TaskOpts; -use std::unstable::mutex::Mutex; +use std::unstable::mutex::NativeMutex; use std::unstable::stack; use io; @@ -40,7 +40,7 @@ pub fn new(stack_bounds: (uint, uint)) -> ~Task { fn ops() -> ~Ops { ~Ops { - lock: unsafe { Mutex::new() }, + lock: unsafe { NativeMutex::new() }, awoken: false, io: io::IoFactory::new(), // these *should* get overwritten @@ -109,7 +109,7 @@ pub fn spawn_opts(opts: TaskOpts, f: proc()) { // This structure is the glue between channels and the 1:1 scheduling mode. This // structure is allocated once per task. struct Ops { - lock: Mutex, // native synchronization + lock: NativeMutex, // native synchronization awoken: bool, // used to prevent spurious wakeups io: io::IoFactory, // local I/O factory @@ -191,20 +191,19 @@ impl rt::Runtime for Ops { let task = BlockedTask::block(cur_task); if times == 1 { - (*me).lock.lock(); + let mut guard = (*me).lock.lock(); (*me).awoken = false; match f(task) { Ok(()) => { while !(*me).awoken { - (*me).lock.wait(); + guard.wait(); } } Err(task) => { cast::forget(task.wake()); } } - (*me).lock.unlock(); } else { let mut iter = task.make_selectable(times); - (*me).lock.lock(); + let mut guard = (*me).lock.lock(); (*me).awoken = false; let success = iter.all(|task| { match f(task) { @@ -216,9 +215,8 @@ impl rt::Runtime for Ops { } }); while success && !(*me).awoken { - (*me).lock.wait(); + guard.wait(); } - (*me).lock.unlock(); } // re-acquire ownership of the task cur_task = cast::transmute::<uint, ~Task>(cur_task_dupe); @@ -235,10 +233,9 @@ impl rt::Runtime for Ops { let me = &mut *self as *mut Ops; to_wake.put_runtime(self as ~rt::Runtime); cast::forget(to_wake); - (*me).lock.lock(); + let mut guard = (*me).lock.lock(); (*me).awoken = true; - (*me).lock.signal(); - (*me).lock.unlock(); + guard.signal(); } } @@ -254,12 +251,6 @@ impl rt::Runtime for Ops { } } -impl Drop for Ops { - fn drop(&mut self) { - unsafe { self.lock.destroy() } - } -} - #[cfg(test)] mod tests { use std::rt::Runtime; |
