3333#include "internal.h"
3434#include "queue.h"
3535#include "handle-inl.h"
36+ #include "heap-inl.h"
3637#include "req-inl.h"
3738
3839/* uv_once initialization guards */
@@ -221,6 +222,7 @@ static void uv_init(void) {
221222
222223
223224int uv_loop_init (uv_loop_t * loop ) {
225+ struct heap * timer_heap ;
224226 int err ;
225227
226228 /* Initialize libuv itself first */
@@ -246,7 +248,11 @@ int uv_loop_init(uv_loop_t* loop) {
246248
247249 loop -> endgame_handles = NULL ;
248250
249- RB_INIT (& loop -> timers );
251+ loop -> timer_heap = timer_heap = uv__malloc (sizeof (* timer_heap ));
252+ if (timer_heap == NULL )
253+ goto fail_timers_alloc ;
254+
255+ heap_init (timer_heap );
250256
251257 loop -> check_handles = NULL ;
252258 loop -> prepare_handles = NULL ;
@@ -285,13 +291,24 @@ int uv_loop_init(uv_loop_t* loop) {
285291 uv_mutex_destroy (& loop -> wq_mutex );
286292
287293fail_mutex_init :
294+ uv__free (timer_heap );
295+ loop -> timer_heap = NULL ;
296+
297+ fail_timers_alloc :
288298 CloseHandle (loop -> iocp );
289299 loop -> iocp = INVALID_HANDLE_VALUE ;
290300
291301 return err ;
292302}
293303
294304
305+ void uv_update_time (uv_loop_t * loop ) {
306+ uint64_t new_time = uv__hrtime (1000 );
307+ assert (new_time >= loop -> time );
308+ loop -> time = new_time ;
309+ }
310+
311+
295312void uv__once_init (void ) {
296313 uv_once (& uv_init_guard_ , uv_init );
297314}
@@ -320,6 +337,9 @@ void uv__loop_close(uv_loop_t* loop) {
320337 uv_mutex_unlock (& loop -> wq_mutex );
321338 uv_mutex_destroy (& loop -> wq_mutex );
322339
340+ uv__free (loop -> timer_heap );
341+ loop -> timer_heap = NULL ;
342+
323343 CloseHandle (loop -> iocp );
324344}
325345
@@ -441,7 +461,7 @@ int uv_run(uv_loop_t *loop, uv_run_mode mode) {
441461
442462 while (r != 0 && loop -> stop_flag == 0 ) {
443463 uv_update_time (loop );
444- uv_process_timers (loop );
464+ uv__run_timers (loop );
445465
446466 ran_pending = uv_process_reqs (loop );
447467 uv_idle_invoke (loop );
@@ -465,7 +485,7 @@ int uv_run(uv_loop_t *loop, uv_run_mode mode) {
465485 * UV_RUN_NOWAIT makes no guarantees about progress so it's omitted from
466486 * the check.
467487 */
468- uv_process_timers (loop );
488+ uv__run_timers (loop );
469489 }
470490
471491 r = uv__loop_alive (loop );
0 commit comments