@@ -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_blocked_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_blocked_task_immediately ( task_cell. take ( ) ) ;
604+ }
605+ }
606+ let mut w = * * self ;
607+ w. stop ( ) ;
608+ }
609+ }
610+
565611#[ test]
566612fn 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