about summary refs log tree commit diff
path: root/src/libstd/timer.rs
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2013-05-08 17:09:37 -0700
committerbors <bors@rust-lang.org>2013-05-08 17:09:37 -0700
commitd82d9874a6f88e0afa021796e9efaba5b3670c31 (patch)
tree4270207820c8eca6e33cf2bbf9f1bbcafe9d74a9 /src/libstd/timer.rs
parent5a65f51d666855d7685850808cc06e49c3d21c72 (diff)
parentd20e63ab65f7ba28db36ae43379706ca9dba1ca5 (diff)
downloadrust-d82d9874a6f88e0afa021796e9efaba5b3670c31.tar.gz
rust-d82d9874a6f88e0afa021796e9efaba5b3670c31.zip
auto merge of #6232 : pcwalton/rust/demuting, r=pcwalton
They're still parsed for bootstrapping purposes, but the qualifier is immediately dropped on the floor.

r? @nikomatsakis 
Diffstat (limited to 'src/libstd/timer.rs')
-rw-r--r--src/libstd/timer.rs40
1 files changed, 24 insertions, 16 deletions
diff --git a/src/libstd/timer.rs b/src/libstd/timer.rs
index b19b2f2889e..0d15bbb54d3 100644
--- a/src/libstd/timer.rs
+++ b/src/libstd/timer.rs
@@ -14,10 +14,11 @@ use uv;
 use uv::iotask;
 use uv::iotask::IoTask;
 
-use core::libc;
-use core::libc::c_void;
 use core::cast::transmute;
+use core::cast;
 use core::comm::{stream, Chan, SharedChan, Port, select2i};
+use core::libc::c_void;
+use core::libc;
 
 /**
  * Wait for timeout period then send provided value over a channel
@@ -120,22 +121,28 @@ pub fn sleep(iotask: &IoTask, msecs: uint) {
 pub fn recv_timeout<T:Copy + Owned>(iotask: &IoTask,
                                    msecs: uint,
                                    wait_po: &Port<T>)
-                                -> Option<T> {
-    let (timeout_po, timeout_ch) = stream::<()>();
+                                   -> Option<T> {
+    let mut (timeout_po, timeout_ch) = stream::<()>();
     delayed_send(iotask, msecs, &timeout_ch, ());
-    // FIXME: This could be written clearer (#2618)
-    either::either(
-        |_| {
-            None
-        }, |_| {
-            Some(wait_po.recv())
-        }, &select2i(&timeout_po, wait_po)
-    )
+
+    // XXX: Workaround due to ports and channels not being &mut. They should
+    // be.
+    unsafe {
+        let wait_po = cast::transmute_mut(wait_po);
+
+        // FIXME: This could be written clearer (#2618)
+        either::either(
+            |_| {
+                None
+            }, |_| {
+                Some(wait_po.recv())
+            }, &select2i(&mut timeout_po, wait_po)
+        )
+    }
 }
 
 // INTERNAL API
-extern fn delayed_send_cb(handle: *uv::ll::uv_timer_t,
-                                status: libc::c_int) {
+extern fn delayed_send_cb(handle: *uv::ll::uv_timer_t, status: libc::c_int) {
     unsafe {
         debug!(
             "delayed_send_cb handle %? status %?", handle, status);
@@ -212,7 +219,7 @@ mod test {
                 let hl_loop_clone = hl_loop.clone();
                 do task::spawn {
                     use core::rand::*;
-                    let rng = rng();
+                    let mut rng = rng();
                     for old_iter::repeat(times) {
                         sleep(&hl_loop_clone, rng.next() as uint % maxms);
                     }
@@ -269,7 +276,8 @@ mod test {
         let hl_loop = uv::global_loop::get();
 
         for old_iter::repeat(times as uint) {
-            let expected = rand::rng().gen_str(16u);
+            let mut rng = rand::rng();
+            let expected = rng.gen_str(16u);
             let (test_po, test_ch) = stream::<~str>();
             let hl_loop_clone = hl_loop.clone();
             do task::spawn() {