@@ -280,6 +280,10 @@ impl IoFactory for UvIoFactory {
280
280
}
281
281
}
282
282
}
283
+
284
+ fn timer_init ( & mut self ) -> Result < ~RtioTimerObject , IoError > {
285
+ Ok ( ~UvTimer ( TimerWatcher :: new ( self . uv_loop ( ) ) ) )
286
+ }
283
287
}
284
288
285
289
// FIXME #6090: Prefer newtype structs but Drop doesn't work
@@ -562,6 +566,48 @@ impl RtioUdpSocket for UvUdpSocket {
562
566
fn ignore_broadcasts ( & mut self ) { fail ! ( ) ; }
563
567
}
564
568
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
+
565
611
#[ test]
566
612
fn test_simple_io_no_connect ( ) {
567
613
do run_in_newsched_task {
@@ -832,3 +878,20 @@ fn test_udp_many_read() {
832
878
}
833
879
}
834
880
}
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