about summary refs log tree commit diff
path: root/src/libnative/task.rs
diff options
context:
space:
mode:
authorHuon Wilson <dbau.pp+github@gmail.com>2014-02-13 17:17:50 +1100
committerHuon Wilson <dbau.pp+github@gmail.com>2014-02-16 10:13:56 +1100
commit76a59fd6e2d5c8c42193c047fd5eaba982d499f7 (patch)
treea913c967de98b492f47fdd0bbd5a11cf0be96ed5 /src/libnative/task.rs
parentfba32ea79f1828ef441d91abca3635fad57f323d (diff)
downloadrust-76a59fd6e2d5c8c42193c047fd5eaba982d499f7.tar.gz
rust-76a59fd6e2d5c8c42193c047fd5eaba982d499f7.zip
std: add an RAII unlocker to Mutex.
This automatically unlocks its lock when it goes out of scope, and
provides a safe(ish) method to call .wait.
Diffstat (limited to 'src/libnative/task.rs')
-rw-r--r--src/libnative/task.rs15
1 files changed, 6 insertions, 9 deletions
diff --git a/src/libnative/task.rs b/src/libnative/task.rs
index a9c3afbbb16..d940edcadc7 100644
--- a/src/libnative/task.rs
+++ b/src/libnative/task.rs
@@ -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();
         }
     }