Rizin
unix-like reverse engineering framework and cli tools
uv-common.h
Go to the documentation of this file.
1 /* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
2  *
3  * Permission is hereby granted, free of charge, to any person obtaining a copy
4  * of this software and associated documentation files (the "Software"), to
5  * deal in the Software without restriction, including without limitation the
6  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
7  * sell copies of the Software, and to permit persons to whom the Software is
8  * furnished to do so, subject to the following conditions:
9  *
10  * The above copyright notice and this permission notice shall be included in
11  * all copies or substantial portions of the Software.
12  *
13  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
18  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
19  * IN THE SOFTWARE.
20  */
21 
22 /*
23  * This file is private to libuv. It provides common functionality to both
24  * Windows and Unix backends.
25  */
26 
27 #ifndef UV_COMMON_H_
28 #define UV_COMMON_H_
29 
30 #include <assert.h>
31 #include <stdarg.h>
32 #include <stddef.h>
33 
34 #if defined(_MSC_VER) && _MSC_VER < 1600
35 # include "uv/stdint-msvc2008.h"
36 #else
37 # include <stdint.h>
38 #endif
39 
40 #include "uv.h"
41 #include "uv/tree.h"
42 #include "queue.h"
43 #include "strscpy.h"
44 
45 #if EDOM > 0
46 # define UV__ERR(x) (-(x))
47 #else
48 # define UV__ERR(x) (x)
49 #endif
50 
51 #if !defined(snprintf) && defined(_MSC_VER) && _MSC_VER < 1900
52 extern int snprintf(char*, size_t, const char*, ...);
53 #endif
54 
55 #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
56 
57 #define container_of(ptr, type, member) \
58  ((type *) ((char *) (ptr) - offsetof(type, member)))
59 
60 #define STATIC_ASSERT(expr) \
61  void uv__static_assert(int static_assert_failed[1 - 2 * !(expr)])
62 
63 #if defined(__GNUC__) && (__GNUC__ > 4 || __GNUC__ == 4 && __GNUC_MINOR__ >= 7)
64 #define uv__load_relaxed(p) __atomic_load_n(p, __ATOMIC_RELAXED)
65 #define uv__store_relaxed(p, v) __atomic_store_n(p, v, __ATOMIC_RELAXED)
66 #else
67 #define uv__load_relaxed(p) (*p)
68 #define uv__store_relaxed(p, v) do *p = v; while (0)
69 #endif
70 
71 /* Handle flags. Some flags are specific to Windows or UNIX. */
72 enum {
73  /* Used by all handles. */
74  UV_HANDLE_CLOSING = 0x00000001,
75  UV_HANDLE_CLOSED = 0x00000002,
76  UV_HANDLE_ACTIVE = 0x00000004,
77  UV_HANDLE_REF = 0x00000008,
78  UV_HANDLE_INTERNAL = 0x00000010,
80 
81  /* Used by streams. */
82  UV_HANDLE_LISTENING = 0x00000040,
83  UV_HANDLE_CONNECTION = 0x00000080,
84  UV_HANDLE_SHUTTING = 0x00000100,
85  UV_HANDLE_SHUT = 0x00000200,
86  UV_HANDLE_READ_PARTIAL = 0x00000400,
87  UV_HANDLE_READ_EOF = 0x00000800,
88 
89  /* Used by streams and UDP handles. */
90  UV_HANDLE_READING = 0x00001000,
91  UV_HANDLE_BOUND = 0x00002000,
92  UV_HANDLE_READABLE = 0x00004000,
93  UV_HANDLE_WRITABLE = 0x00008000,
94  UV_HANDLE_READ_PENDING = 0x00010000,
96  UV_HANDLE_ZERO_READ = 0x00040000,
97  UV_HANDLE_EMULATE_IOCP = 0x00080000,
100 
101  /* Used by uv_tcp_t and uv_udp_t handles */
102  UV_HANDLE_IPV6 = 0x00400000,
103 
104  /* Only used by uv_tcp_t handles. */
105  UV_HANDLE_TCP_NODELAY = 0x01000000,
111 
112  /* Only used by uv_udp_t handles. */
116 
117  /* Only used by uv_pipe_t handles. */
119  UV_HANDLE_PIPESERVER = 0x02000000,
120 
121  /* Only used by uv_tty_t handles. */
123  UV_HANDLE_TTY_RAW = 0x02000000,
126 
127  /* Only used by uv_signal_t handles. */
129  UV_SIGNAL_ONE_SHOT = 0x02000000,
130 
131  /* Only used by uv_poll_t handles. */
132  UV_HANDLE_POLL_SLOW = 0x01000000
133 };
134 
136 
138 
139 int uv__tcp_bind(uv_tcp_t* tcp,
140  const struct sockaddr* addr,
141  unsigned int addrlen,
142  unsigned int flags);
143 
145  uv_tcp_t* handle,
146  const struct sockaddr* addr,
147  unsigned int addrlen,
148  uv_connect_cb cb);
149 
151  uv_udp_t* handle,
152  unsigned flags,
153  int domain);
154 
156  const struct sockaddr* addr,
157  unsigned int addrlen,
158  unsigned int flags);
159 
161  const struct sockaddr* addr,
162  unsigned int addrlen);
163 
165 
167 
169  uv_udp_t* handle,
170  const uv_buf_t bufs[],
171  unsigned int nbufs,
172  const struct sockaddr* addr,
173  unsigned int addrlen,
174  uv_udp_send_cb send_cb);
175 
177  const uv_buf_t bufs[],
178  unsigned int nbufs,
179  const struct sockaddr* addr,
180  unsigned int addrlen);
181 
183  uv_udp_recv_cb recv_cb);
184 
186 
188 
189 int uv__getaddrinfo_translate_error(int sys_err); /* EAI_* error. */
190 
195 };
196 
198  struct uv__work *w,
199  enum uv__work_kind kind,
200  void (*work)(struct uv__work *w),
201  void (*done)(struct uv__work *w, int status));
202 
204 
205 size_t uv__count_bufs(const uv_buf_t bufs[], unsigned int nbufs);
206 
207 int uv__socket_sockopt(uv_handle_t* handle, int optname, int* value);
208 
212 
213 int uv__next_timeout(const uv_loop_t* loop);
216 
217 void uv__process_title_cleanup(void);
218 void uv__signal_cleanup(void);
219 void uv__threadpool_cleanup(void);
220 
221 #define uv__has_active_reqs(loop) \
222  ((loop)->active_reqs.count > 0)
223 
224 #define uv__req_register(loop, req) \
225  do { \
226  (loop)->active_reqs.count++; \
227  } \
228  while (0)
229 
230 #define uv__req_unregister(loop, req) \
231  do { \
232  assert(uv__has_active_reqs(loop)); \
233  (loop)->active_reqs.count--; \
234  } \
235  while (0)
236 
237 #define uv__has_active_handles(loop) \
238  ((loop)->active_handles > 0)
239 
240 #define uv__active_handle_add(h) \
241  do { \
242  (h)->loop->active_handles++; \
243  } \
244  while (0)
245 
246 #define uv__active_handle_rm(h) \
247  do { \
248  (h)->loop->active_handles--; \
249  } \
250  while (0)
251 
252 #define uv__is_active(h) \
253  (((h)->flags & UV_HANDLE_ACTIVE) != 0)
254 
255 #define uv__is_closing(h) \
256  (((h)->flags & (UV_HANDLE_CLOSING | UV_HANDLE_CLOSED)) != 0)
257 
258 #define uv__handle_start(h) \
259  do { \
260  if (((h)->flags & UV_HANDLE_ACTIVE) != 0) break; \
261  (h)->flags |= UV_HANDLE_ACTIVE; \
262  if (((h)->flags & UV_HANDLE_REF) != 0) uv__active_handle_add(h); \
263  } \
264  while (0)
265 
266 #define uv__handle_stop(h) \
267  do { \
268  if (((h)->flags & UV_HANDLE_ACTIVE) == 0) break; \
269  (h)->flags &= ~UV_HANDLE_ACTIVE; \
270  if (((h)->flags & UV_HANDLE_REF) != 0) uv__active_handle_rm(h); \
271  } \
272  while (0)
273 
274 #define uv__handle_ref(h) \
275  do { \
276  if (((h)->flags & UV_HANDLE_REF) != 0) break; \
277  (h)->flags |= UV_HANDLE_REF; \
278  if (((h)->flags & UV_HANDLE_CLOSING) != 0) break; \
279  if (((h)->flags & UV_HANDLE_ACTIVE) != 0) uv__active_handle_add(h); \
280  } \
281  while (0)
282 
283 #define uv__handle_unref(h) \
284  do { \
285  if (((h)->flags & UV_HANDLE_REF) == 0) break; \
286  (h)->flags &= ~UV_HANDLE_REF; \
287  if (((h)->flags & UV_HANDLE_CLOSING) != 0) break; \
288  if (((h)->flags & UV_HANDLE_ACTIVE) != 0) uv__active_handle_rm(h); \
289  } \
290  while (0)
291 
292 #define uv__has_ref(h) \
293  (((h)->flags & UV_HANDLE_REF) != 0)
294 
295 #if defined(_WIN32)
296 # define uv__handle_platform_init(h) ((h)->u.fd = -1)
297 #else
298 # define uv__handle_platform_init(h) ((h)->next_closing = NULL)
299 #endif
300 
301 #define uv__handle_init(loop_, h, type_) \
302  do { \
303  (h)->loop = (loop_); \
304  (h)->type = (type_); \
305  (h)->flags = UV_HANDLE_REF; /* Ref the loop when active. */ \
306  QUEUE_INSERT_TAIL(&(loop_)->handle_queue, &(h)->handle_queue); \
307  uv__handle_platform_init(h); \
308  } \
309  while (0)
310 
311 /* Note: uses an open-coded version of SET_REQ_SUCCESS() because of
312  * a circular dependency between src/uv-common.h and src/win/internal.h.
313  */
314 #if defined(_WIN32)
315 # define UV_REQ_INIT(req, typ) \
316  do { \
317  (req)->type = (typ); \
318  (req)->u.io.overlapped.Internal = 0; /* SET_REQ_SUCCESS() */ \
319  } \
320  while (0)
321 #else
322 # define UV_REQ_INIT(req, typ) \
323  do { \
324  (req)->type = (typ); \
325  } \
326  while (0)
327 #endif
328 
329 #define uv__req_init(loop, req, typ) \
330  do { \
331  UV_REQ_INIT(req, typ); \
332  uv__req_register(loop, req); \
333  } \
334  while (0)
335 
336 #define uv__get_internal_fields(loop) \
337  ((uv__loop_internal_fields_t*) loop->internal_fields)
338 
339 #define uv__get_loop_metrics(loop) \
340  (&uv__get_internal_fields(loop)->loop_metrics)
341 
342 /* Allocator prototypes */
343 void *uv__calloc(size_t count, size_t size);
344 char *uv__strdup(const char* s);
345 char *uv__strndup(const char* s, size_t n);
346 void* uv__malloc(size_t size);
347 void uv__free(void* ptr);
348 void* uv__realloc(void* ptr, size_t size);
349 void* uv__reallocf(void* ptr, size_t size);
350 
353 
358 };
359 
362 
364  unsigned int flags;
366 };
367 
368 #endif /* UV_COMMON_H_ */
static mcore_handle handle
Definition: asm_mcore.c:8
static int value
Definition: cmd_api.c:93
#define w
Definition: crypto_rc6.c:13
static static sync static getppid static getegid const char static filename char static len const char char static bufsiz static mask static vfork const void static prot static getpgrp const char static swapflags static arg static fd static protocol static who struct sockaddr static addrlen static backlog struct timeval struct timezone static tz const struct iovec static count static mode const void const struct sockaddr static tolen const char static pathname void static offset struct stat static buf void long static basep static whence static length const void static len static semflg const void static shmflg const struct timespec req
Definition: sflib.h:128
static static sync static getppid static getegid const char static filename char static len const char char static bufsiz static mask static vfork const void static prot static getpgrp const char static swapflags static arg static fd domain
Definition: sflib.h:79
static static sync static getppid static getegid const char static filename char static len const char char static bufsiz static mask static vfork const void static prot static getpgrp const char static swapflags static arg static fd static protocol static who struct sockaddr static addrlen static backlog struct timeval struct timezone static tz const struct iovec static count static mode const void const struct sockaddr static tolen const char static pathname void count
Definition: sflib.h:98
struct tab * done
Definition: enough.c:233
voidpf void uLong size
Definition: ioapi.h:138
snprintf
Definition: kernel.h:364
static const char struct stat static buf struct stat static buf static vhangup int status
Definition: sflib.h:145
static const void static count static fd struct stat static buf struct pollfd unsigned static timeout void static offset void static length char static len const struct iovec static count unsigned long static filedes static sched_yield static flags static oldfd static pause unsigned static seconds static protocol struct sockaddr addrlen
Definition: sflib.h:75
int n
Definition: mipsasm.c:19
static RzSocket * s
Definition: rtr.c:28
static struct sockaddr static addrlen static backlog const void static flags void flags
Definition: sfsocketcall.h:123
unsigned long uint64_t
Definition: sftypes.h:28
Definition: sftypes.h:48
Definition: getopt.h:84
uv__loop_metrics_t loop_metrics
Definition: uv-common.h:365
uv_mutex_t lock
Definition: uv-common.h:357
uint64_t provider_idle_time
Definition: uv-common.h:356
uint64_t provider_entry_time
Definition: uv-common.h:355
Definition: uv.h:844
Definition: unix.h:123
Definition: uv.h:1306
Definition: uv.h:1780
Definition: uv.h:547
Definition: uv.h:860
Definition: uv.h:638
uv_loop_t * loop
Definition: main.c:7
static char bufs[4][128]
Buffers for uint64_to_str() and uint64_to_nicestr()
Definition: util.c:18
pthread_mutex_t uv_mutex_t
Definition: unix.h:137
int uv__loop_configure(uv_loop_t *loop, uv_loop_option option, va_list ap)
Definition: loop.c:211
@ UV_HANDLE_TCP_KEEPALIVE
Definition: uv-common.h:106
@ UV_HANDLE_TTY_SAVED_POSITION
Definition: uv-common.h:124
@ UV_HANDLE_UDP_PROCESSING
Definition: uv-common.h:113
@ UV_HANDLE_ZERO_READ
Definition: uv-common.h:96
@ UV_HANDLE_PIPESERVER
Definition: uv-common.h:119
@ UV_HANDLE_REF
Definition: uv-common.h:77
@ UV_HANDLE_READ_PARTIAL
Definition: uv-common.h:86
@ UV_HANDLE_TTY_SAVED_ATTRIBUTES
Definition: uv-common.h:125
@ UV_HANDLE_IPV6
Definition: uv-common.h:102
@ UV_HANDLE_TCP_NODELAY
Definition: uv-common.h:105
@ UV_HANDLE_BLOCKING_WRITES
Definition: uv-common.h:98
@ UV_HANDLE_CANCELLATION_PENDING
Definition: uv-common.h:99
@ UV_HANDLE_TCP_SOCKET_CLOSED
Definition: uv-common.h:109
@ UV_HANDLE_POLL_SLOW
Definition: uv-common.h:132
@ UV_SIGNAL_ONE_SHOT
Definition: uv-common.h:129
@ UV_HANDLE_TCP_SINGLE_ACCEPT
Definition: uv-common.h:107
@ UV_HANDLE_READING
Definition: uv-common.h:90
@ UV_HANDLE_READ_EOF
Definition: uv-common.h:87
@ UV_HANDLE_LISTENING
Definition: uv-common.h:82
@ UV_HANDLE_SHUT
Definition: uv-common.h:85
@ UV_HANDLE_UDP_RECVMMSG
Definition: uv-common.h:115
@ UV_HANDLE_UDP_CONNECTED
Definition: uv-common.h:114
@ UV_HANDLE_CLOSING
Definition: uv-common.h:74
@ UV_HANDLE_EMULATE_IOCP
Definition: uv-common.h:97
@ UV_HANDLE_ENDGAME_QUEUED
Definition: uv-common.h:79
@ UV_HANDLE_CONNECTION
Definition: uv-common.h:83
@ UV_HANDLE_SHARED_TCP_SOCKET
Definition: uv-common.h:110
@ UV_HANDLE_SHUTTING
Definition: uv-common.h:84
@ UV_HANDLE_TCP_ACCEPT_STATE_CHANGING
Definition: uv-common.h:108
@ UV_HANDLE_WRITABLE
Definition: uv-common.h:93
@ UV_HANDLE_CLOSED
Definition: uv-common.h:75
@ UV_HANDLE_SYNC_BYPASS_IOCP
Definition: uv-common.h:95
@ UV_HANDLE_TTY_RAW
Definition: uv-common.h:123
@ UV_HANDLE_INTERNAL
Definition: uv-common.h:78
@ UV_HANDLE_READ_PENDING
Definition: uv-common.h:94
@ UV_SIGNAL_ONE_SHOT_DISPATCHED
Definition: uv-common.h:128
@ UV_HANDLE_ACTIVE
Definition: uv-common.h:76
@ UV_HANDLE_NON_OVERLAPPED_PIPE
Definition: uv-common.h:118
@ UV_HANDLE_BOUND
Definition: uv-common.h:91
@ UV_HANDLE_READABLE
Definition: uv-common.h:92
@ UV_HANDLE_TTY_READABLE
Definition: uv-common.h:122
int uv__udp_init_ex(uv_loop_t *loop, uv_udp_t *handle, unsigned flags, int domain)
Definition: udp.c:954
int uv__udp_send(uv_udp_send_t *req, uv_udp_t *handle, const uv_buf_t bufs[], unsigned int nbufs, const struct sockaddr *addr, unsigned int addrlen, uv_udp_send_cb send_cb)
Definition: udp.c:650
int uv__udp_is_connected(uv_udp_t *handle)
Definition: uv-common.c:393
void * uv__reallocf(void *ptr, size_t size)
Definition: uv-common.c:103
void uv__work_done(uv_async_t *handle)
Definition: threadpool.c:295
char * uv__strndup(const char *s, size_t n)
Definition: uv-common.c:63
void * uv__realloc(void *ptr, size_t size)
Definition: uv-common.c:96
int uv__next_timeout(const uv_loop_t *loop)
Definition: timer.c:141
size_t uv__count_bufs(const uv_buf_t bufs[], unsigned int nbufs)
Definition: uv-common.c:573
uv__work_kind
Definition: uv-common.h:191
@ UV__WORK_SLOW_IO
Definition: uv-common.h:194
@ UV__WORK_FAST_IO
Definition: uv-common.h:193
@ UV__WORK_CPU
Definition: uv-common.h:192
void uv__threadpool_cleanup(void)
Definition: threadpool.c:163
int uv__tcp_connect(uv_connect_t *req, uv_tcp_t *handle, const struct sockaddr *addr, unsigned int addrlen, uv_connect_cb cb)
Definition: tcp.c:204
int uv__udp_disconnect(uv_udp_t *handle)
Definition: udp.c:629
int uv__tcp_bind(uv_tcp_t *tcp, const struct sockaddr *addr, unsigned int addrlen, unsigned int flags)
Definition: tcp.c:148
int uv__udp_connect(uv_udp_t *handle, const struct sockaddr *addr, unsigned int addrlen)
Definition: udp.c:606
void uv__fs_scandir_cleanup(uv_fs_t *req)
Definition: uv-common.c:635
char * uv__strdup(const char *s)
Definition: uv-common.c:55
void uv__process_title_cleanup(void)
Definition: aix.c:987
void uv__run_timers(uv_loop_t *loop)
Definition: timer.c:162
void uv__signal_cleanup(void)
Definition: signal.c:80
void uv__fs_poll_close(uv_fs_poll_t *handle)
Definition: fs-poll.c:164
void * uv__malloc(size_t size)
Definition: uv-common.c:75
void * uv__calloc(size_t count, size_t size)
Definition: uv-common.c:92
int uv__socket_sockopt(uv_handle_t *handle, int optname, int *value)
Definition: core.c:180
void uv__fs_readdir_cleanup(uv_fs_t *req)
Definition: uv-common.c:724
int uv__udp_recv_stop(uv_udp_t *handle)
Definition: udp.c:1322
int uv__getaddrinfo_translate_error(int sys_err)
Definition: getaddrinfo.c:42
int uv__udp_try_send(uv_udp_t *handle, const uv_buf_t bufs[], unsigned int nbufs, const struct sockaddr *addr, unsigned int addrlen)
Definition: udp.c:716
void uv__metrics_update_idle_time(uv_loop_t *loop)
Definition: uv-common.c:872
uv_dirent_type_t uv__fs_get_dirent_type(uv__dirent_t *dent)
Definition: uv-common.c:688
void uv__free(void *ptr)
Definition: uv-common.c:81
int uv__udp_recv_start(uv_udp_t *handle, uv_alloc_cb alloccb, uv_udp_recv_cb recv_cb)
Definition: udp.c:1297
void uv__work_submit(uv_loop_t *loop, struct uv__work *w, enum uv__work_kind kind, void(*work)(struct uv__work *w), void(*done)(struct uv__work *w, int status))
Definition: threadpool.c:256
int uv__udp_bind(uv_udp_t *handle, const struct sockaddr *addr, unsigned int addrlen, unsigned int flags)
Definition: udp.c:508
void uv__loop_close(uv_loop_t *loop)
Definition: loop.c:165
void uv__timer_close(uv_timer_t *handle)
Definition: timer.c:182
void uv__metrics_set_provider_entry_time(uv_loop_t *loop)
Definition: uv-common.c:899
void(* uv_udp_recv_cb)(uv_udp_t *handle, ssize_t nread, const uv_buf_t *buf, const struct sockaddr *addr, unsigned flags)
Definition: uv.h:631
void(* uv_udp_send_cb)(uv_udp_send_t *req, int status)
Definition: uv.h:630
void(* uv_alloc_cb)(uv_handle_t *handle, size_t suggested_size, uv_buf_t *buf)
Definition: uv.h:309
uv_dirent_type_t
Definition: uv.h:1139
void(* uv_connect_cb)(uv_connect_t *req, int status)
Definition: uv.h:316
uv_loop_option
Definition: uv.h:249
static const char * cb[]
Definition: z80_tab.h:176
static int addr
Definition: z80asm.c:58