Skip to content

Commit

Permalink
std: Remove ms-taking methods from timers
Browse files Browse the repository at this point in the history
  • Loading branch information
brson committed Aug 13, 2014
1 parent 51e9728 commit 1666dab
Showing 1 changed file with 49 additions and 172 deletions.
221 changes: 49 additions & 172 deletions src/libstd/io/timer.rs
Expand Up @@ -79,15 +79,10 @@ fn in_ms(d: Duration) -> u64 {

/// Sleep the current task for the specified duration.
pub fn sleep(duration: Duration) {
sleep_ms(in_ms(duration))
}

/// Sleep the current task for `msecs` milliseconds.
pub fn sleep_ms(msecs: u64) {
let timer = Timer::new();
let mut timer = timer.ok().expect("timer::sleep: could not create a Timer");

timer.sleep_ms(msecs)
timer.sleep(duration)
}

impl Timer {
Expand All @@ -108,14 +103,6 @@ impl Timer {
self.obj.sleep(in_ms(duration));
}

/// Blocks the current task for `msecs` milliseconds.
///
/// Note that this function will cause any other receivers for this timer to
/// be invalidated (the other end will be closed).
pub fn sleep_ms(&mut self, msecs: u64) {
self.obj.sleep(msecs);
}

/// Creates a oneshot receiver which will have a notification sent when
/// the specified duration has elapsed.
///
Expand All @@ -133,46 +120,6 @@ impl Timer {
return rx
}

/// Creates a oneshot receiver which will have a notification sent when
/// `msecs` milliseconds has elapsed.
///
/// This does *not* block the current task, but instead returns immediately.
///
/// Note that this invalidates any previous receiver which has been created
/// by this timer, and that the returned receiver will be invalidated once
/// the timer is destroyed (when it falls out of scope). In particular, if
/// this is called in method-chaining style, the receiver will be
/// invalidated at the end of that statement, and all `recv` calls will
/// fail.
///
/// # Example
///
/// ```rust
/// use std::io::Timer;
///
/// let mut timer = Timer::new().unwrap();
/// let ten_milliseconds = timer.oneshot(10);
///
/// for _ in range(0u, 100) { /* do work */ }
///
/// // blocks until 10 ms after the `oneshot` call
/// ten_milliseconds.recv();
/// ```
///
/// ```rust
/// use std::io::Timer;
///
/// // Incorrect, method chaining-style:
/// let mut five_ms = Timer::new().unwrap().oneshot(5);
/// // The timer object was destroyed, so this will always fail:
/// // five_ms.recv()
/// ```
pub fn oneshot_ms(&mut self, msecs: u64) -> Receiver<()> {
let (tx, rx) = channel();
self.obj.oneshot(msecs, box TimerCallback { tx: tx });
return rx
}

/// Creates a receiver which will have a continuous stream of notifications
/// being sent each time the specified duration has elapsed.
///
Expand All @@ -191,54 +138,6 @@ impl Timer {
self.obj.period(in_ms(duration), box TimerCallback { tx: tx });
return rx
}

/// Creates a receiver which will have a continuous stream of notifications
/// being sent every `msecs` milliseconds.
///
/// This does *not* block the current task, but instead returns
/// immediately. The first notification will not be received immediately,
/// but rather after `msec` milliseconds have passed.
///
/// Note that this invalidates any previous receiver which has been created
/// by this timer, and that the returned receiver will be invalidated once
/// the timer is destroyed (when it falls out of scope). In particular, if
/// this is called in method-chaining style, the receiver will be
/// invalidated at the end of that statement, and all `recv` calls will
/// fail.
///
/// # Example
///
/// ```rust
/// use std::io::Timer;
///
/// let mut timer = Timer::new().unwrap();
/// let ten_milliseconds = timer.periodic(10);
///
/// for _ in range(0u, 100) { /* do work */ }
///
/// // blocks until 10 ms after the `periodic` call
/// ten_milliseconds.recv();
///
/// for _ in range(0u, 100) { /* do work */ }
///
/// // blocks until 20 ms after the `periodic` call (*not* 10ms after the
/// // previous `recv`)
/// ten_milliseconds.recv();
/// ```
///
/// ```rust
/// use std::io::Timer;
///
/// // Incorrect, method chaining-style.
/// let mut five_ms = Timer::new().unwrap().periodic(5);
/// // The timer object was destroyed, so this will always fail:
/// // five_ms.recv()
/// ```
pub fn periodic_ms(&mut self, msecs: u64) -> Receiver<()> {
let (tx, rx) = channel();
self.obj.period(msecs, box TimerCallback { tx: tx });
return rx
}
}

impl Callback for TimerCallback {
Expand All @@ -249,101 +148,103 @@ impl Callback for TimerCallback {

#[cfg(test)]
mod test {
iotest!(fn test_io_timer_sleep_ms_simple() {
use time::Duration;

iotest!(fn test_io_timer_sleep_simple() {
let mut timer = Timer::new().unwrap();
timer.sleep_ms(1);
timer.sleep(Duration::milliseconds(1));
})

iotest!(fn test_io_timer_sleep_oneshot_ms() {
iotest!(fn test_io_timer_sleep_oneshot() {
let mut timer = Timer::new().unwrap();
timer.oneshot_ms(1).recv();
timer.oneshot(Duration::milliseconds(1)).recv();
})

iotest!(fn test_io_timer_sleep_oneshot_ms_forget() {
iotest!(fn test_io_timer_sleep_oneshot_forget() {
let mut timer = Timer::new().unwrap();
timer.oneshot_ms(100000000000);
timer.oneshot(Duration::milliseconds(100000000000));
})

iotest!(fn oneshot_ms_twice() {
iotest!(fn oneshot_twice() {
let mut timer = Timer::new().unwrap();
let rx1 = timer.oneshot_ms(10000);
let rx = timer.oneshot_ms(1);
let rx1 = timer.oneshot(Duration::milliseconds(10000));
let rx = timer.oneshot(1);
rx.recv();
assert_eq!(rx1.recv_opt(), Err(()));
})

iotest!(fn test_io_timer_oneshot_ms_then_sleep() {
iotest!(fn test_io_timer_oneshot_then_sleep() {
let mut timer = Timer::new().unwrap();
let rx = timer.oneshot_ms(100000000000);
timer.sleep_ms(1); // this should invalidate rx
let rx = timer.oneshot(Duration::milliseconds(100000000000));
timer.sleep(Duration::milliseconds(1)); // this should invalidate rx

assert_eq!(rx.recv_opt(), Err(()));
})

iotest!(fn test_io_timer_sleep_periodic_ms() {
iotest!(fn test_io_timer_sleep_periodic() {
let mut timer = Timer::new().unwrap();
let rx = timer.periodic_ms(1);
let rx = timer.periodic(Duration::milliseconds(1));
rx.recv();
rx.recv();
rx.recv();
})

iotest!(fn test_io_timer_sleep_periodic_ms_forget() {
iotest!(fn test_io_timer_sleep_periodic_forget() {
let mut timer = Timer::new().unwrap();
timer.periodic_ms(100000000000);
timer.periodic(Duration::milliseconds(100000000000));
})

iotest!(fn test_io_timer_sleep_ms_standalone() {
sleep_ms(1)
iotest!(fn test_io_timer_sleep_standalone() {
sleep(Duration::milliseconds(1))
})

iotest!(fn oneshot_ms() {
iotest!(fn oneshot() {
let mut timer = Timer::new().unwrap();

let rx = timer.oneshot_ms(1);
let rx = timer.oneshot(Duration::milliseconds(1));
rx.recv();
assert!(rx.recv_opt().is_err());

let rx = timer.oneshot_ms(1);
let rx = timer.oneshot(Duration::milliseconds(1));
rx.recv();
assert!(rx.recv_opt().is_err());
})

iotest!(fn override() {
let mut timer = Timer::new().unwrap();
let orx = timer.oneshot_ms(100);
let prx = timer.periodic_ms(100);
timer.sleep_ms(1);
let orx = timer.oneshot(Duration::milliseconds(100));
let prx = timer.periodic(Duration::milliseconds(100));
timer.sleep(Duration::milliseconds(1));
assert_eq!(orx.recv_opt(), Err(()));
assert_eq!(prx.recv_opt(), Err(()));
timer.oneshot_ms(1).recv();
timer.oneshot(Duration::milliseconds(1)).recv();
})

iotest!(fn period_ms() {
iotest!(fn period() {
let mut timer = Timer::new().unwrap();
let rx = timer.periodic_ms(1);
let rx = timer.periodic(Duration::milliseconds(1));
rx.recv();
rx.recv();
let rx2 = timer.periodic_ms(1);
let rx2 = timer.periodic(Durtion::milliseconds(1));
rx2.recv();
rx2.recv();
})

iotest!(fn sleep_ms() {
iotest!(fn sleep() {
let mut timer = Timer::new().unwrap();
timer.sleep_ms(1);
timer.sleep_ms(1);
timer.sleep(Duration::milliseconds(1));
timer.sleep(Duration::milliseconds(1));
})

iotest!(fn oneshot_ms_fail() {
iotest!(fn oneshot_fail() {
let mut timer = Timer::new().unwrap();
let _rx = timer.oneshot_ms(1);
let _rx = timer.oneshot(Duration::milliseconds(1));
fail!();
} #[should_fail])

iotest!(fn period_ms_fail() {
iotest!(fn period_fail() {
let mut timer = Timer::new().unwrap();
let _rx = timer.periodic_ms(1);
let _rx = timer.periodic(Duration::milliseconds(1));
fail!();
} #[should_fail])

Expand All @@ -355,7 +256,7 @@ mod test {
iotest!(fn closing_channel_during_drop_doesnt_kill_everything() {
// see issue #10375
let mut timer = Timer::new().unwrap();
let timer_rx = timer.periodic_ms(1000);
let timer_rx = timer.periodic(Duration::milliseconds(1000));

spawn(proc() {
let _ = timer_rx.recv_opt();
Expand All @@ -368,82 +269,58 @@ mod test {
iotest!(fn reset_doesnt_switch_tasks() {
// similar test to the one above.
let mut timer = Timer::new().unwrap();
let timer_rx = timer.periodic_ms(1000);
let timer_rx = timer.periodic(Duration::milliseconds(1000));

spawn(proc() {
let _ = timer_rx.recv_opt();
});

timer.oneshot_ms(1);
timer.oneshot(Duration::milliseconds(1));
})

iotest!(fn reset_doesnt_switch_tasks2() {
// similar test to the one above.
let mut timer = Timer::new().unwrap();
let timer_rx = timer.periodic_ms(1000);
let timer_rx = timer.periodic(Duration::milliseconds(1000));

spawn(proc() {
let _ = timer_rx.recv_opt();
});

timer.sleep_ms(1);
timer.sleep(Duration::milliseconds(1));
})

iotest!(fn sender_goes_away_oneshot() {
let rx = {
let mut timer = Timer::new().unwrap();
timer.oneshot_ms(1000)
timer.oneshot(Duration::milliseconds(1000))
};
assert_eq!(rx.recv_opt(), Err(()));
})

iotest!(fn sender_goes_away_period() {
let rx = {
let mut timer = Timer::new().unwrap();
timer.periodic_ms(1000)
timer.periodic(Duration::milliseconds(1000))
};
assert_eq!(rx.recv_opt(), Err(()));
})

iotest!(fn receiver_goes_away_oneshot() {
let mut timer1 = Timer::new().unwrap();
timer1.oneshot_ms(1);
timer1.oneshot(Duration::milliseconds(1));
let mut timer2 = Timer::new().unwrap();
// while sleeping, the previous timer should fire and not have its
// callback do something terrible.
timer2.sleep_ms(2);
timer2.sleep(Duration::milliseconds(2));
})

iotest!(fn receiver_goes_away_period() {
let mut timer1 = Timer::new().unwrap();
timer1.periodic_ms(1);
timer1.periodic(Duration::milliseconds(1));
let mut timer2 = Timer::new().unwrap();
// while sleeping, the previous timer should fire and not have its
// callback do something terrible.
timer2.sleep_ms(2);
})


iotest!(fn test_io_timer_sleep_duration_simple() {
use time::Duration;
let mut timer = Timer::new().unwrap();
timer.sleep(Duration::seconds(1));
})

iotest!(fn test_io_timer_sleep_oneshot_duration() {
use time::Duration;
let mut timer = Timer::new().unwrap();
timer.oneshot(Duration::seconds(1)).recv();
timer2.sleep(Duration::milliseconds(2));
})

iotest!(fn test_io_timer_sleep_periodic_duration() {
use time::Duration;
let mut timer = Timer::new().unwrap();
let rx = timer.periodic(Duration::seconds(1));
rx.recv();
rx.recv();
rx.recv();
})


}

0 comments on commit 1666dab

Please sign in to comment.