Skip to content

Commit 921d991

Browse files
committed
std: add RtioTimer and UvTimer impl atop rt::uv
1 parent 48f115e commit 921d991

File tree

2 files changed

+69
-0
lines changed

2 files changed

+69
-0
lines changed

src/libstd/rt/rtio.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ pub type IoFactoryObject = uvio::UvIoFactory;
2323
pub type RtioTcpStreamObject = uvio::UvTcpStream;
2424
pub type RtioTcpListenerObject = uvio::UvTcpListener;
2525
pub type RtioUdpSocketObject = uvio::UvUdpSocket;
26+
pub type RtioTimerObject = uvio::UvTimer;
2627

2728
pub trait EventLoop {
2829
fn run(&mut self);
@@ -46,6 +47,7 @@ pub trait IoFactory {
4647
fn tcp_connect(&mut self, addr: IpAddr) -> Result<~RtioTcpStreamObject, IoError>;
4748
fn tcp_bind(&mut self, addr: IpAddr) -> Result<~RtioTcpListenerObject, IoError>;
4849
fn udp_bind(&mut self, addr: IpAddr) -> Result<~RtioUdpSocketObject, IoError>;
50+
fn timer_init(&mut self) -> Result<~RtioTimerObject, IoError>;
4951
}
5052

5153
pub trait RtioTcpListener : RtioSocket {
@@ -84,3 +86,7 @@ pub trait RtioUdpSocket : RtioSocket {
8486
fn hear_broadcasts(&mut self);
8587
fn ignore_broadcasts(&mut self);
8688
}
89+
90+
pub trait RtioTimer {
91+
fn sleep(&self, msecs: u64);
92+
}

src/libstd/rt/uv/uvio.rs

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,10 @@ impl IoFactory for UvIoFactory {
280280
}
281281
}
282282
}
283+
284+
fn timer_init(&mut self) -> Result<~RtioTimerObject, IoError> {
285+
Ok(~UvTimer(TimerWatcher::new(self.uv_loop())))
286+
}
283287
}
284288

285289
// FIXME #6090: Prefer newtype structs but Drop doesn't work
@@ -562,6 +566,48 @@ impl RtioUdpSocket for UvUdpSocket {
562566
fn ignore_broadcasts(&mut self) { fail!(); }
563567
}
564568

569+
pub struct UvTimer(timer::TimerWatcher);
570+
571+
impl UvTimer {
572+
fn new(w: timer::TimerWatcher) -> UvTimer {
573+
UvTimer(w)
574+
}
575+
}
576+
577+
impl Drop for UvTimer {
578+
fn drop(&self) {
579+
rtdebug!("closing UvTimer");
580+
let scheduler = Local::take::<Scheduler>();
581+
do scheduler.deschedule_running_task_and_then |_, task| {
582+
let task_cell = Cell::new(task);
583+
do self.close {
584+
let scheduler = Local::take::<Scheduler>();
585+
scheduler.resume_task_immediately(task_cell.take());
586+
}
587+
}
588+
}
589+
}
590+
591+
impl RtioTimer for UvTimer {
592+
fn sleep(&self, msecs: u64) {
593+
let scheduler = Local::take::<Scheduler>();
594+
assert!(scheduler.in_task_context());
595+
do scheduler.deschedule_running_task_and_then |sched, task| {
596+
rtdebug!("sleep: entered scheduler context");
597+
assert!(!sched.in_task_context());
598+
let task_cell = Cell::new(task);
599+
let mut watcher = **self;
600+
do watcher.start(msecs, 0) |_, status| {
601+
assert!(status.is_none());
602+
let scheduler = Local::take::<Scheduler>();
603+
scheduler.resume_task_immediately(task_cell.take());
604+
}
605+
}
606+
let mut w = **self;
607+
w.stop();
608+
}
609+
}
610+
565611
#[test]
566612
fn test_simple_io_no_connect() {
567613
do run_in_newsched_task {
@@ -832,3 +878,20 @@ fn test_udp_many_read() {
832878
}
833879
}
834880
}
881+
882+
fn test_timer_sleep_simple_impl() {
883+
unsafe {
884+
let io = Local::unsafe_borrow::<IoFactoryObject>();
885+
let timer = (*io).timer_init();
886+
match timer {
887+
Ok(t) => t.sleep(1),
888+
Err(_) => assert!(false)
889+
}
890+
}
891+
}
892+
#[test]
893+
fn test_timer_sleep_simple() {
894+
do run_in_newsched_task {
895+
test_timer_sleep_simple_impl();
896+
}
897+
}

0 commit comments

Comments
 (0)