]> git.lizzy.rs Git - rust.git/commitdiff
Isolate common wait_end logic
authorSteven Stewart-Gallus <sstewartgallus00@mylangara.bc.ca>
Fri, 9 Aug 2013 02:33:34 +0000 (19:33 -0700)
committerSteven Stewart-Gallus <sstewartgallus00@mylangara.bc.ca>
Fri, 9 Aug 2013 02:34:01 +0000 (19:34 -0700)
src/libextra/sync.rs

index 4172c715adb96309701da1228c37f66eb4f492b9..3bdb16a13d21aa30314f48bfcefc51a5e622680c 100644 (file)
@@ -71,6 +71,12 @@ fn broadcast(&self) -> uint {
         }
         count
     }
+
+    fn wait_end(&self) -> WaitEnd {
+        let (wait_end, signal_end) = comm::oneshot();
+        self.tail.send_deferred(signal_end);
+        wait_end
+    }
 }
 
 // The building-block used to make semaphores, mutexes, and rwlocks.
@@ -99,12 +105,9 @@ pub fn acquire(&self) {
             do (**self).with |state| {
                 state.count -= 1;
                 if state.count < 0 {
-                    // Create waiter nobe.
-                    let (WaitEnd, SignalEnd) = comm::oneshot();
-                    // Tell outer scope we need to block.
-                    waiter_nobe = Some(WaitEnd);
-                    // Enqueue ourself.
-                    state.waiters.tail.send_deferred(SignalEnd);
+                    // Create waiter nobe, enqueue ourself, and tell
+                    // outer scope we need to block.
+                    waiter_nobe = Some(state.waiters.wait_end());
                 }
             }
             // Uncomment if you wish to test for sem races. Not valgrind-friendly.
@@ -200,10 +203,7 @@ pub fn wait(&self) { self.wait_on(0) }
      * wait() is equivalent to wait_on(0).
      */
     pub fn wait_on(&self, condvar_id: uint) {
-        // Create waiter nobe.
-        let (WaitEnd, SignalEnd) = comm::oneshot();
-        let mut WaitEnd   = Some(WaitEnd);
-        let mut SignalEnd = Some(SignalEnd);
+        let mut WaitEnd = None;
         let mut out_of_bounds = None;
         do task::unkillable {
             // Release lock, 'atomically' enqueuing ourselves in so doing.
@@ -215,9 +215,9 @@ pub fn wait_on(&self, condvar_id: uint) {
                         if state.count <= 0 {
                             state.waiters.signal();
                         }
-                        // Enqueue ourself to be woken up by a signaller.
-                        let SignalEnd = SignalEnd.take_unwrap();
-                        state.blocked[condvar_id].tail.send_deferred(SignalEnd);
+                        // Create waiter nobe, and enqueue ourself to
+                        // be woken up by a signaller.
+                        WaitEnd = Some(state.blocked[condvar_id].wait_end());
                     } else {
                         out_of_bounds = Some(state.blocked.len());
                     }