Rizin
unix-like reverse engineering framework and cli tools
timer.c
Go to the documentation of this file.
1 /* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
2  * Permission is hereby granted, free of charge, to any person obtaining a copy
3  * of this software and associated documentation files (the "Software"), to
4  * deal in the Software without restriction, including without limitation the
5  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
6  * sell copies of the Software, and to permit persons to whom the Software is
7  * furnished to do so, subject to the following conditions:
8  *
9  * The above copyright notice and this permission notice shall be included in
10  * all copies or substantial portions of the Software.
11  *
12  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
13  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
14  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
15  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
16  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
17  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
18  * IN THE SOFTWARE.
19  */
20 
21 #include "uv.h"
22 #include "uv-common.h"
23 #include "heap-inl.h"
24 
25 #include <assert.h>
26 #include <limits.h>
27 
28 
29 static struct heap *timer_heap(const uv_loop_t* loop) {
30 #ifdef _WIN32
31  return (struct heap*) loop->timer_heap;
32 #else
33  return (struct heap*) &loop->timer_heap;
34 #endif
35 }
36 
37 
38 static int timer_less_than(const struct heap_node* ha,
39  const struct heap_node* hb) {
40  const uv_timer_t* a;
41  const uv_timer_t* b;
42 
45 
46  if (a->timeout < b->timeout)
47  return 1;
48  if (b->timeout < a->timeout)
49  return 0;
50 
51  /* Compare start_id when both have the same timeout. start_id is
52  * allocated with loop->timer_counter in uv_timer_start().
53  */
54  return a->start_id < b->start_id;
55 }
56 
57 
59  uv__handle_init(loop, (uv_handle_t*)handle, UV_TIMER);
60  handle->timer_cb = NULL;
61  handle->repeat = 0;
62  return 0;
63 }
64 
65 
69  uint64_t repeat) {
70  uint64_t clamped_timeout;
71 
72  if (uv__is_closing(handle) || cb == NULL)
73  return UV_EINVAL;
74 
75  if (uv__is_active(handle))
77 
78  clamped_timeout = handle->loop->time + timeout;
79  if (clamped_timeout < timeout)
80  clamped_timeout = (uint64_t) -1;
81 
82  handle->timer_cb = cb;
83  handle->timeout = clamped_timeout;
84  handle->repeat = repeat;
85  /* start_id is the second index to be compared in timer_less_than() */
86  handle->start_id = handle->loop->timer_counter++;
87 
88  heap_insert(timer_heap(handle->loop),
89  (struct heap_node*) &handle->heap_node,
92 
93  return 0;
94 }
95 
96 
98  if (!uv__is_active(handle))
99  return 0;
100 
101  heap_remove(timer_heap(handle->loop),
102  (struct heap_node*) &handle->heap_node,
105 
106  return 0;
107 }
108 
109 
111  if (handle->timer_cb == NULL)
112  return UV_EINVAL;
113 
114  if (handle->repeat) {
116  uv_timer_start(handle, handle->timer_cb, handle->repeat, handle->repeat);
117  }
118 
119  return 0;
120 }
121 
122 
124  handle->repeat = repeat;
125 }
126 
127 
129  return handle->repeat;
130 }
131 
132 
134  if (handle->loop->time >= handle->timeout)
135  return 0;
136 
137  return handle->timeout - handle->loop->time;
138 }
139 
140 
142  const struct heap_node* heap_node;
143  const uv_timer_t* handle;
144  uint64_t diff;
145 
146  heap_node = heap_min(timer_heap(loop));
147  if (heap_node == NULL)
148  return -1; /* block indefinitely */
149 
151  if (handle->timeout <= loop->time)
152  return 0;
153 
154  diff = handle->timeout - loop->time;
155  if (diff > INT_MAX)
156  diff = INT_MAX;
157 
158  return (int) diff;
159 }
160 
161 
163  struct heap_node* heap_node;
165 
166  for (;;) {
167  heap_node = heap_min(timer_heap(loop));
168  if (heap_node == NULL)
169  break;
170 
172  if (handle->timeout > loop->time)
173  break;
174 
177  handle->timer_cb(handle);
178  }
179 }
180 
181 
184 }
static mcore_handle handle
Definition: asm_mcore.c:8
#define INT_MAX
Definition: cp-demangle.c:131
#define NULL
Definition: cris-opc.c:27
static void repeat(struct parse *, sopno, int, int)
Definition: regcomp.c:1155
#define container_of(ptr, type, member)
Definition: rz_types.h:650
unsigned long uint64_t
Definition: sftypes.h:28
#define b(i)
Definition: sha256.c:42
#define a(i)
Definition: sha256.c:41
Definition: heap-inl.h:40
Definition: uv.h:1780
Definition: uv.h:860
uv_loop_t * loop
Definition: main.c:7
uv_timer_t timeout
Definition: main.c:9
int uv__next_timeout(const uv_loop_t *loop)
Definition: timer.c:141
uint64_t uv_timer_get_repeat(const uv_timer_t *handle)
Definition: timer.c:128
int uv_timer_init(uv_loop_t *loop, uv_timer_t *handle)
Definition: timer.c:58
static struct heap * timer_heap(const uv_loop_t *loop)
Definition: timer.c:29
void uv__run_timers(uv_loop_t *loop)
Definition: timer.c:162
int uv_timer_stop(uv_timer_t *handle)
Definition: timer.c:97
void uv_timer_set_repeat(uv_timer_t *handle, uint64_t repeat)
Definition: timer.c:123
static int timer_less_than(const struct heap_node *ha, const struct heap_node *hb)
Definition: timer.c:38
int uv_timer_again(uv_timer_t *handle)
Definition: timer.c:110
uint64_t uv_timer_get_due_in(const uv_timer_t *handle)
Definition: timer.c:133
int uv_timer_start(uv_timer_t *handle, uv_timer_cb cb, uint64_t timeout, uint64_t repeat)
Definition: timer.c:66
void uv__timer_close(uv_timer_t *handle)
Definition: timer.c:182
#define uv__is_closing(h)
Definition: uv-common.h:255
#define uv__handle_init(loop_, h, type_)
Definition: uv-common.h:301
#define uv__handle_stop(h)
Definition: uv-common.h:266
#define uv__is_active(h)
Definition: uv-common.h:252
#define uv__handle_start(h)
Definition: uv-common.h:258
void(* uv_timer_cb)(uv_timer_t *handle)
Definition: uv.h:321
static const char * cb[]
Definition: z80_tab.h:176