pub type RtioTcpStreamObject = uvio::UvTcpStream;
pub type RtioTcpListenerObject = uvio::UvTcpListener;
pub type RtioUdpSocketObject = uvio::UvUdpSocket;
+pub type RtioTimerObject = uvio::UvTimer;
pub trait EventLoop {
fn run(&mut self);
fn tcp_connect(&mut self, addr: IpAddr) -> Result<~RtioTcpStreamObject, IoError>;
fn tcp_bind(&mut self, addr: IpAddr) -> Result<~RtioTcpListenerObject, IoError>;
fn udp_bind(&mut self, addr: IpAddr) -> Result<~RtioUdpSocketObject, IoError>;
+ fn timer_init(&mut self) -> Result<~RtioTimerObject, IoError>;
}
pub trait RtioTcpListener : RtioSocket {
fn hear_broadcasts(&mut self);
fn ignore_broadcasts(&mut self);
}
+
+pub trait RtioTimer {
+ fn sleep(&self, msecs: u64);
+}
}
}
}
+
+ fn timer_init(&mut self) -> Result<~RtioTimerObject, IoError> {
+ Ok(~UvTimer(TimerWatcher::new(self.uv_loop())))
+ }
}
// FIXME #6090: Prefer newtype structs but Drop doesn't work
fn ignore_broadcasts(&mut self) { fail!(); }
}
+pub struct UvTimer(timer::TimerWatcher);
+
+impl UvTimer {
+ fn new(w: timer::TimerWatcher) -> UvTimer {
+ UvTimer(w)
+ }
+}
+
+impl Drop for UvTimer {
+ fn drop(&self) {
+ rtdebug!("closing UvTimer");
+ let scheduler = Local::take::<Scheduler>();
+ do scheduler.deschedule_running_task_and_then |_, task| {
+ let task_cell = Cell::new(task);
+ do self.close {
+ let scheduler = Local::take::<Scheduler>();
+ scheduler.resume_task_immediately(task_cell.take());
+ }
+ }
+ }
+}
+
+impl RtioTimer for UvTimer {
+ fn sleep(&self, msecs: u64) {
+ let scheduler = Local::take::<Scheduler>();
+ assert!(scheduler.in_task_context());
+ do scheduler.deschedule_running_task_and_then |sched, task| {
+ rtdebug!("sleep: entered scheduler context");
+ assert!(!sched.in_task_context());
+ let task_cell = Cell::new(task);
+ let mut watcher = **self;
+ do watcher.start(msecs, 0) |_, status| {
+ assert!(status.is_none());
+ let scheduler = Local::take::<Scheduler>();
+ scheduler.resume_task_immediately(task_cell.take());
+ }
+ }
+ let mut w = **self;
+ w.stop();
+ }
+}
+
#[test]
fn test_simple_io_no_connect() {
do run_in_newsched_task {
}
}
}
+
+fn test_timer_sleep_simple_impl() {
+ unsafe {
+ let io = Local::unsafe_borrow::<IoFactoryObject>();
+ let timer = (*io).timer_init();
+ match timer {
+ Ok(t) => t.sleep(1),
+ Err(_) => assert!(false)
+ }
+ }
+}
+#[test]
+fn test_timer_sleep_simple() {
+ do run_in_newsched_task {
+ test_timer_sleep_simple_impl();
+ }
+}