@@ -66,7 +66,6 @@ static void uv__finish_close(uv_handle_t* handle);
66
66
void uv_close (uv_handle_t * handle , uv_close_cb close_cb ) {
67
67
uv_udp_t * udp ;
68
68
uv_async_t * async ;
69
- uv_timer_t * timer ;
70
69
uv_stream_t * stream ;
71
70
uv_process_t * process ;
72
71
@@ -123,11 +122,7 @@ void uv_close(uv_handle_t* handle, uv_close_cb close_cb) {
123
122
break ;
124
123
125
124
case UV_TIMER :
126
- timer = (uv_timer_t * )handle ;
127
- if (ev_is_active (& timer -> timer_watcher )) {
128
- ev_ref (timer -> loop -> ev );
129
- }
130
- ev_timer_stop (timer -> loop -> ev , & timer -> timer_watcher );
125
+ uv_timer_stop ((uv_timer_t * )handle );
131
126
break ;
132
127
133
128
case UV_PROCESS :
@@ -524,10 +519,23 @@ int uv_async_send(uv_async_t* async) {
524
519
}
525
520
526
521
522
+ static int uv__timer_active (const uv_timer_t * timer ) {
523
+ return timer -> flags & UV_TIMER_ACTIVE ;
524
+ }
525
+
526
+
527
+ static int uv__timer_repeating (const uv_timer_t * timer ) {
528
+ return timer -> flags & UV_TIMER_REPEAT ;
529
+ }
530
+
531
+
527
532
static void uv__timer_cb (EV_P_ ev_timer * w , int revents ) {
528
533
uv_timer_t * timer = w -> data ;
529
534
530
- if (!ev_is_active (w )) {
535
+ assert (uv__timer_active (timer ));
536
+
537
+ if (!uv__timer_repeating (timer )) {
538
+ timer -> flags &= ~UV_TIMER_ACTIVE ;
531
539
ev_ref (EV_A );
532
540
}
533
541
@@ -550,43 +558,61 @@ int uv_timer_init(uv_loop_t* loop, uv_timer_t* timer) {
550
558
551
559
int uv_timer_start (uv_timer_t * timer , uv_timer_cb cb , int64_t timeout ,
552
560
int64_t repeat ) {
553
- if (ev_is_active ( & timer -> timer_watcher )) {
561
+ if (uv__timer_active ( timer )) {
554
562
return -1 ;
555
563
}
556
564
557
565
timer -> timer_cb = cb ;
566
+ timer -> flags |= UV_TIMER_ACTIVE ;
567
+
568
+ if (repeat )
569
+ timer -> flags |= UV_TIMER_REPEAT ;
570
+ else
571
+ timer -> flags &= ~UV_TIMER_REPEAT ;
572
+
558
573
ev_timer_set (& timer -> timer_watcher , timeout / 1000.0 , repeat / 1000.0 );
559
574
ev_timer_start (timer -> loop -> ev , & timer -> timer_watcher );
560
575
ev_unref (timer -> loop -> ev );
576
+
561
577
return 0 ;
562
578
}
563
579
564
580
565
581
int uv_timer_stop (uv_timer_t * timer ) {
566
- if (ev_is_active ( & timer -> timer_watcher )) {
582
+ if (uv__timer_active ( timer )) {
567
583
ev_ref (timer -> loop -> ev );
568
584
}
569
585
586
+ timer -> flags &= ~(UV_TIMER_ACTIVE | UV_TIMER_REPEAT );
570
587
ev_timer_stop (timer -> loop -> ev , & timer -> timer_watcher );
588
+
571
589
return 0 ;
572
590
}
573
591
574
592
575
593
int uv_timer_again (uv_timer_t * timer ) {
576
- if (!ev_is_active ( & timer -> timer_watcher )) {
594
+ if (!uv__timer_active ( timer )) {
577
595
uv__set_sys_error (timer -> loop , EINVAL );
578
596
return -1 ;
579
597
}
580
598
599
+ assert (uv__timer_repeating (timer ));
581
600
ev_timer_again (timer -> loop -> ev , & timer -> timer_watcher );
582
601
return 0 ;
583
602
}
584
603
604
+
585
605
void uv_timer_set_repeat (uv_timer_t * timer , int64_t repeat ) {
586
606
assert (timer -> type == UV_TIMER );
587
607
timer -> timer_watcher .repeat = repeat / 1000.0 ;
608
+
609
+ if (repeat )
610
+ timer -> flags |= UV_TIMER_REPEAT ;
611
+ else
612
+ timer -> flags &= ~UV_TIMER_REPEAT ;
588
613
}
589
614
615
+
590
616
int64_t uv_timer_get_repeat (uv_timer_t * timer ) {
591
617
assert (timer -> type == UV_TIMER );
592
618
return (int64_t )(1000 * timer -> timer_watcher .repeat );
0 commit comments