asyncengine 0.0.1.testing1 → 0.0.2.alpha1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (251) hide show
  1. data/README.markdown +3 -0
  2. data/Rakefile +38 -0
  3. data/asyncengine.gemspec +8 -4
  4. data/ext/asyncengine/ae_call_from_other_thread.c +106 -0
  5. data/ext/asyncengine/ae_call_from_other_thread.h +12 -0
  6. data/ext/asyncengine/ae_handle_common.c +193 -48
  7. data/ext/asyncengine/ae_handle_common.h +40 -13
  8. data/ext/asyncengine/ae_ip_utils.c +246 -0
  9. data/ext/asyncengine/ae_ip_utils.h +25 -0
  10. data/ext/asyncengine/ae_next_tick.c +81 -21
  11. data/ext/asyncengine/ae_next_tick.h +4 -2
  12. data/ext/asyncengine/ae_resolver.c +156 -0
  13. data/ext/asyncengine/ae_resolver.h +10 -0
  14. data/ext/asyncengine/ae_tcp.c +908 -0
  15. data/ext/asyncengine/ae_tcp.h +20 -0
  16. data/ext/asyncengine/ae_timer.c +355 -81
  17. data/ext/asyncengine/ae_timer.h +11 -4
  18. data/ext/asyncengine/ae_udp.c +579 -13
  19. data/ext/asyncengine/ae_udp.h +15 -2
  20. data/ext/asyncengine/ae_utils.c +192 -0
  21. data/ext/asyncengine/ae_utils.h +16 -0
  22. data/ext/asyncengine/asyncengine_ruby.c +469 -26
  23. data/ext/asyncengine/asyncengine_ruby.h +49 -11
  24. data/ext/asyncengine/debug.h +68 -0
  25. data/ext/asyncengine/extconf.rb +26 -2
  26. data/ext/asyncengine/ip_parser.c +5954 -0
  27. data/ext/asyncengine/ip_parser.h +16 -0
  28. data/ext/asyncengine/libuv/AUTHORS +16 -0
  29. data/ext/asyncengine/libuv/common.gypi +4 -4
  30. data/ext/asyncengine/libuv/config-mingw.mk +6 -6
  31. data/ext/asyncengine/libuv/config-unix.mk +13 -13
  32. data/ext/asyncengine/libuv/gyp_uv +5 -1
  33. data/ext/asyncengine/libuv/ibc_tests/exec_test.sh +8 -0
  34. data/ext/asyncengine/libuv/ibc_tests/uv_shutdown_write_issue.c +171 -0
  35. data/ext/asyncengine/libuv/ibc_tests/uv_tcp_close_while_connecting.c +102 -0
  36. data/ext/asyncengine/libuv/include/uv-private/ngx-queue.h +3 -1
  37. data/ext/asyncengine/libuv/include/uv-private/uv-unix.h +103 -50
  38. data/ext/asyncengine/libuv/include/uv-private/uv-win.h +76 -24
  39. data/ext/asyncengine/libuv/include/uv.h +353 -88
  40. data/ext/asyncengine/libuv/src/ares/ares__close_sockets.o +0 -0
  41. data/ext/asyncengine/libuv/src/ares/ares__get_hostent.o +0 -0
  42. data/ext/asyncengine/libuv/src/ares/ares__read_line.o +0 -0
  43. data/ext/asyncengine/libuv/src/ares/ares__timeval.o +0 -0
  44. data/ext/asyncengine/libuv/src/ares/ares_cancel.o +0 -0
  45. data/ext/asyncengine/libuv/src/ares/ares_data.o +0 -0
  46. data/ext/asyncengine/libuv/src/ares/ares_destroy.o +0 -0
  47. data/ext/asyncengine/libuv/src/ares/ares_expand_name.o +0 -0
  48. data/ext/asyncengine/libuv/src/ares/ares_expand_string.o +0 -0
  49. data/ext/asyncengine/libuv/src/ares/ares_fds.o +0 -0
  50. data/ext/asyncengine/libuv/src/ares/ares_free_hostent.o +0 -0
  51. data/ext/asyncengine/libuv/src/ares/ares_free_string.o +0 -0
  52. data/ext/asyncengine/libuv/src/ares/ares_gethostbyaddr.o +0 -0
  53. data/ext/asyncengine/libuv/src/ares/ares_gethostbyname.o +0 -0
  54. data/ext/asyncengine/libuv/src/ares/ares_getnameinfo.o +0 -0
  55. data/ext/asyncengine/libuv/src/ares/ares_getopt.o +0 -0
  56. data/ext/asyncengine/libuv/src/ares/ares_getsock.o +0 -0
  57. data/ext/asyncengine/libuv/src/ares/ares_init.o +0 -0
  58. data/ext/asyncengine/libuv/src/ares/ares_library_init.o +0 -0
  59. data/ext/asyncengine/libuv/src/ares/ares_llist.o +0 -0
  60. data/ext/asyncengine/libuv/src/ares/ares_mkquery.o +0 -0
  61. data/ext/asyncengine/libuv/src/ares/ares_nowarn.o +0 -0
  62. data/ext/asyncengine/libuv/src/ares/ares_options.o +0 -0
  63. data/ext/asyncengine/libuv/src/ares/ares_parse_a_reply.o +0 -0
  64. data/ext/asyncengine/libuv/src/ares/ares_parse_aaaa_reply.o +0 -0
  65. data/ext/asyncengine/libuv/src/ares/ares_parse_mx_reply.o +0 -0
  66. data/ext/asyncengine/libuv/src/ares/ares_parse_ns_reply.o +0 -0
  67. data/ext/asyncengine/libuv/src/ares/ares_parse_ptr_reply.o +0 -0
  68. data/ext/asyncengine/libuv/src/ares/ares_parse_srv_reply.o +0 -0
  69. data/ext/asyncengine/libuv/src/ares/ares_parse_txt_reply.o +0 -0
  70. data/ext/asyncengine/libuv/src/ares/ares_process.o +0 -0
  71. data/ext/asyncengine/libuv/src/ares/ares_query.o +0 -0
  72. data/ext/asyncengine/libuv/src/ares/ares_search.o +0 -0
  73. data/ext/asyncengine/libuv/src/ares/ares_send.o +0 -0
  74. data/ext/asyncengine/libuv/src/ares/ares_strcasecmp.o +0 -0
  75. data/ext/asyncengine/libuv/src/ares/ares_strdup.o +0 -0
  76. data/ext/asyncengine/libuv/src/ares/ares_strerror.o +0 -0
  77. data/ext/asyncengine/libuv/src/ares/ares_timeout.o +0 -0
  78. data/ext/asyncengine/libuv/src/ares/ares_version.o +0 -0
  79. data/ext/asyncengine/libuv/src/ares/ares_writev.o +0 -0
  80. data/ext/asyncengine/libuv/src/ares/bitncmp.o +0 -0
  81. data/ext/asyncengine/libuv/src/ares/inet_net_pton.o +0 -0
  82. data/ext/asyncengine/libuv/src/ares/inet_ntop.o +0 -0
  83. data/ext/asyncengine/libuv/src/cares.c +225 -0
  84. data/ext/asyncengine/libuv/src/cares.o +0 -0
  85. data/ext/asyncengine/libuv/src/fs-poll.c +237 -0
  86. data/ext/asyncengine/libuv/src/fs-poll.o +0 -0
  87. data/ext/asyncengine/libuv/src/unix/async.c +78 -17
  88. data/ext/asyncengine/libuv/src/unix/async.o +0 -0
  89. data/ext/asyncengine/libuv/src/unix/core.c +305 -213
  90. data/ext/asyncengine/libuv/src/unix/core.o +0 -0
  91. data/ext/asyncengine/libuv/src/unix/cygwin.c +1 -1
  92. data/ext/asyncengine/libuv/src/unix/darwin.c +2 -1
  93. data/ext/asyncengine/libuv/src/unix/dl.c +36 -44
  94. data/ext/asyncengine/libuv/src/unix/dl.o +0 -0
  95. data/ext/asyncengine/libuv/src/unix/eio/eio.o +0 -0
  96. data/ext/asyncengine/libuv/src/unix/error.c +6 -0
  97. data/ext/asyncengine/libuv/src/unix/error.o +0 -0
  98. data/ext/asyncengine/libuv/src/unix/ev/ev.c +8 -4
  99. data/ext/asyncengine/libuv/src/unix/ev/ev.o +0 -0
  100. data/ext/asyncengine/libuv/src/unix/freebsd.c +1 -1
  101. data/ext/asyncengine/libuv/src/unix/fs.c +25 -33
  102. data/ext/asyncengine/libuv/src/unix/fs.o +0 -0
  103. data/ext/asyncengine/libuv/src/unix/internal.h +50 -31
  104. data/ext/asyncengine/libuv/src/unix/kqueue.c +2 -7
  105. data/ext/asyncengine/libuv/src/unix/linux/core.o +0 -0
  106. data/ext/asyncengine/libuv/src/unix/linux/inotify.c +12 -14
  107. data/ext/asyncengine/libuv/src/unix/linux/inotify.o +0 -0
  108. data/ext/asyncengine/libuv/src/unix/linux/{core.c → linux-core.c} +1 -1
  109. data/ext/asyncengine/libuv/src/unix/linux/linux-core.o +0 -0
  110. data/ext/asyncengine/libuv/src/unix/linux/syscalls.c +147 -1
  111. data/ext/asyncengine/libuv/src/unix/linux/syscalls.h +39 -2
  112. data/ext/asyncengine/libuv/src/unix/linux/syscalls.o +0 -0
  113. data/ext/asyncengine/libuv/src/unix/loop-watcher.c +63 -0
  114. data/ext/asyncengine/libuv/src/unix/loop-watcher.o +0 -0
  115. data/ext/asyncengine/libuv/src/unix/loop.c +29 -6
  116. data/ext/asyncengine/libuv/src/unix/loop.o +0 -0
  117. data/ext/asyncengine/libuv/src/unix/netbsd.c +1 -1
  118. data/ext/asyncengine/libuv/src/unix/openbsd.c +1 -1
  119. data/ext/asyncengine/libuv/src/unix/pipe.c +31 -36
  120. data/ext/asyncengine/libuv/src/unix/pipe.o +0 -0
  121. data/ext/asyncengine/libuv/src/unix/poll.c +116 -0
  122. data/ext/asyncengine/libuv/src/unix/poll.o +0 -0
  123. data/ext/asyncengine/libuv/src/unix/process.c +193 -115
  124. data/ext/asyncengine/libuv/src/unix/process.o +0 -0
  125. data/ext/asyncengine/libuv/src/unix/stream.c +146 -153
  126. data/ext/asyncengine/libuv/src/unix/stream.o +0 -0
  127. data/ext/asyncengine/libuv/src/unix/sunos.c +45 -36
  128. data/ext/asyncengine/libuv/src/unix/tcp.c +6 -5
  129. data/ext/asyncengine/libuv/src/unix/tcp.o +0 -0
  130. data/ext/asyncengine/libuv/src/unix/thread.c +82 -25
  131. data/ext/asyncengine/libuv/src/unix/thread.o +0 -0
  132. data/ext/asyncengine/libuv/src/unix/timer.c +69 -58
  133. data/ext/asyncengine/libuv/src/unix/timer.o +0 -0
  134. data/ext/asyncengine/libuv/src/unix/tty.c +3 -3
  135. data/ext/asyncengine/libuv/src/unix/tty.o +0 -0
  136. data/ext/asyncengine/libuv/src/unix/udp.c +57 -66
  137. data/ext/asyncengine/libuv/src/unix/udp.o +0 -0
  138. data/ext/asyncengine/libuv/src/unix/uv-eio.c +33 -50
  139. data/ext/asyncengine/libuv/src/unix/uv-eio.o +0 -0
  140. data/ext/asyncengine/libuv/src/uv-common.c +68 -38
  141. data/ext/asyncengine/libuv/src/uv-common.h +104 -20
  142. data/ext/asyncengine/libuv/src/uv-common.o +0 -0
  143. data/ext/asyncengine/libuv/src/win/async.c +20 -17
  144. data/ext/asyncengine/libuv/src/win/core.c +44 -31
  145. data/ext/asyncengine/libuv/src/win/dl.c +40 -36
  146. data/ext/asyncengine/libuv/src/win/error.c +21 -1
  147. data/ext/asyncengine/libuv/src/win/fs-event.c +19 -21
  148. data/ext/asyncengine/libuv/src/win/fs.c +541 -189
  149. data/ext/asyncengine/libuv/src/win/getaddrinfo.c +56 -63
  150. data/ext/asyncengine/libuv/src/win/handle-inl.h +145 -0
  151. data/ext/asyncengine/libuv/src/win/handle.c +26 -101
  152. data/ext/asyncengine/libuv/src/win/internal.h +92 -107
  153. data/ext/asyncengine/libuv/src/win/loop-watcher.c +6 -14
  154. data/ext/asyncengine/libuv/src/win/pipe.c +78 -64
  155. data/ext/asyncengine/libuv/src/win/poll.c +618 -0
  156. data/ext/asyncengine/libuv/src/win/process-stdio.c +479 -0
  157. data/ext/asyncengine/libuv/src/win/process.c +147 -274
  158. data/ext/asyncengine/libuv/src/win/req-inl.h +225 -0
  159. data/ext/asyncengine/libuv/src/win/req.c +0 -149
  160. data/ext/asyncengine/libuv/src/{unix/check.c → win/stream-inl.h} +31 -42
  161. data/ext/asyncengine/libuv/src/win/stream.c +9 -43
  162. data/ext/asyncengine/libuv/src/win/tcp.c +200 -82
  163. data/ext/asyncengine/libuv/src/win/thread.c +42 -2
  164. data/ext/asyncengine/libuv/src/win/threadpool.c +3 -2
  165. data/ext/asyncengine/libuv/src/win/timer.c +13 -63
  166. data/ext/asyncengine/libuv/src/win/tty.c +26 -20
  167. data/ext/asyncengine/libuv/src/win/udp.c +26 -17
  168. data/ext/asyncengine/libuv/src/win/util.c +312 -167
  169. data/ext/asyncengine/libuv/src/win/winapi.c +16 -1
  170. data/ext/asyncengine/libuv/src/win/winapi.h +33 -9
  171. data/ext/asyncengine/libuv/src/win/winsock.c +88 -1
  172. data/ext/asyncengine/libuv/src/win/winsock.h +36 -3
  173. data/ext/asyncengine/libuv/test/benchmark-ares.c +16 -17
  174. data/ext/asyncengine/libuv/test/benchmark-fs-stat.c +164 -0
  175. data/ext/asyncengine/libuv/test/benchmark-list.h +9 -0
  176. data/ext/asyncengine/libuv/{src/unix/prepare.c → test/benchmark-loop-count.c} +42 -33
  177. data/ext/asyncengine/libuv/test/benchmark-million-timers.c +65 -0
  178. data/ext/asyncengine/libuv/test/benchmark-pound.c +1 -1
  179. data/ext/asyncengine/libuv/test/benchmark-sizes.c +2 -0
  180. data/ext/asyncengine/libuv/test/benchmark-spawn.c +7 -1
  181. data/ext/asyncengine/libuv/test/benchmark-udp-packet-storm.c +1 -1
  182. data/ext/asyncengine/libuv/test/echo-server.c +8 -0
  183. data/ext/asyncengine/libuv/test/run-tests.c +30 -0
  184. data/ext/asyncengine/libuv/test/runner-unix.c +6 -26
  185. data/ext/asyncengine/libuv/test/runner-win.c +5 -63
  186. data/ext/asyncengine/libuv/test/runner.c +10 -1
  187. data/ext/asyncengine/libuv/test/task.h +0 -8
  188. data/ext/asyncengine/libuv/test/test-async.c +43 -141
  189. data/ext/asyncengine/libuv/test/test-callback-order.c +76 -0
  190. data/ext/asyncengine/libuv/test/test-counters-init.c +2 -3
  191. data/ext/asyncengine/libuv/test/test-dlerror.c +17 -8
  192. data/ext/asyncengine/libuv/test/test-fs-event.c +31 -39
  193. data/ext/asyncengine/libuv/test/test-fs-poll.c +146 -0
  194. data/ext/asyncengine/libuv/test/test-fs.c +114 -2
  195. data/ext/asyncengine/libuv/test/test-gethostbyname.c +8 -8
  196. data/ext/asyncengine/libuv/test/test-hrtime.c +18 -15
  197. data/ext/asyncengine/libuv/test/test-ipc.c +8 -2
  198. data/ext/asyncengine/libuv/test/test-list.h +59 -9
  199. data/ext/asyncengine/libuv/test/test-loop-handles.c +2 -25
  200. data/ext/asyncengine/libuv/{src/unix/idle.c → test/test-poll-close.c} +37 -39
  201. data/ext/asyncengine/libuv/test/test-poll.c +573 -0
  202. data/ext/asyncengine/libuv/test/test-ref.c +79 -63
  203. data/ext/asyncengine/libuv/test/test-run-once.c +15 -11
  204. data/ext/asyncengine/libuv/test/test-semaphore.c +111 -0
  205. data/ext/asyncengine/libuv/test/test-spawn.c +368 -20
  206. data/ext/asyncengine/libuv/test/test-stdio-over-pipes.c +25 -35
  207. data/ext/asyncengine/libuv/test/test-tcp-close-while-connecting.c +80 -0
  208. data/ext/asyncengine/libuv/test/test-tcp-close.c +1 -1
  209. data/ext/asyncengine/libuv/test/test-tcp-connect-error-after-write.c +95 -0
  210. data/ext/asyncengine/libuv/test/test-tcp-connect-timeout.c +85 -0
  211. data/ext/asyncengine/libuv/test/test-tcp-shutdown-after-write.c +131 -0
  212. data/ext/asyncengine/libuv/test/test-tcp-write-error.c +2 -2
  213. data/ext/asyncengine/libuv/test/test-tcp-writealot.c +29 -54
  214. data/ext/asyncengine/libuv/test/test-timer-again.c +1 -1
  215. data/ext/asyncengine/libuv/test/test-timer.c +23 -1
  216. data/ext/asyncengine/libuv/test/test-udp-options.c +1 -1
  217. data/ext/asyncengine/libuv/test/{test-eio-overflow.c → test-walk-handles.c} +31 -44
  218. data/ext/asyncengine/libuv/uv.gyp +26 -9
  219. data/ext/asyncengine/rb_utilities.c +54 -0
  220. data/ext/asyncengine/rb_utilities.h +63 -0
  221. data/lib/asyncengine.rb +45 -38
  222. data/lib/asyncengine/asyncengine_ext.so +0 -0
  223. data/lib/asyncengine/debug.rb +37 -0
  224. data/lib/asyncengine/handle.rb +9 -0
  225. data/lib/asyncengine/tcp.rb +28 -0
  226. data/lib/asyncengine/timer.rb +18 -28
  227. data/lib/asyncengine/udp.rb +29 -0
  228. data/lib/asyncengine/utils.rb +32 -0
  229. data/lib/asyncengine/uv_error.rb +17 -0
  230. data/lib/asyncengine/version.rb +9 -1
  231. data/test/ae_test_helper.rb +62 -0
  232. data/test/test_basic.rb +169 -0
  233. data/test/test_call_from_other_thread.rb +55 -0
  234. data/test/test_error.rb +92 -0
  235. data/test/test_ip_utils.rb +44 -0
  236. data/test/test_next_tick.rb +37 -0
  237. data/test/test_resolver.rb +51 -0
  238. data/test/test_threads.rb +69 -0
  239. data/test/test_timer.rb +95 -0
  240. data/test/test_udp.rb +216 -0
  241. data/test/test_utils.rb +49 -0
  242. metadata +84 -57
  243. data/ext/asyncengine/libuv/mkmf.log +0 -24
  244. data/ext/asyncengine/libuv/src/unix/cares.c +0 -194
  245. data/ext/asyncengine/libuv/src/unix/cares.o +0 -0
  246. data/ext/asyncengine/libuv/src/unix/check.o +0 -0
  247. data/ext/asyncengine/libuv/src/unix/idle.o +0 -0
  248. data/ext/asyncengine/libuv/src/unix/prepare.o +0 -0
  249. data/ext/asyncengine/libuv/src/win/cares.c +0 -290
  250. data/lib/asyncengine/errors.rb +0 -5
  251. data/lib/asyncengine/next_tick.rb +0 -24
@@ -49,7 +49,7 @@ extern "C" {
49
49
 
50
50
 
51
51
  #define UV_VERSION_MAJOR 0
52
- #define UV_VERSION_MINOR 6
52
+ #define UV_VERSION_MINOR 9
53
53
 
54
54
 
55
55
  #include <stdint.h> /* int64_t */
@@ -57,8 +57,10 @@ extern "C" {
57
57
 
58
58
  #include "ares.h"
59
59
 
60
- #ifndef _SSIZE_T_
61
- typedef intptr_t ssize_t;
60
+ #if !defined(_SSIZE_T_) && !defined(_SSIZE_T_DEFINED)
61
+ typedef intptr_t ssize_t;
62
+ # define _SSIZE_T_
63
+ # define _SSIZE_T_DEFINED
62
64
  #endif
63
65
 
64
66
  #if defined(__unix__) || defined(__POSIX__) || defined(__APPLE__)
@@ -123,7 +125,8 @@ typedef intptr_t ssize_t;
123
125
  XX( 52, EXDEV, "cross-device link not permitted") \
124
126
  XX( 53, ENOTEMPTY, "directory not empty") \
125
127
  XX( 54, ENOSPC, "no space left on device") \
126
- XX( 55, EIO, "i/o error")
128
+ XX( 55, EIO, "i/o error") \
129
+ XX( 56, EROFS, "read-only file system" )
127
130
 
128
131
 
129
132
  #define UV_ERRNO_GEN(val, name, s) UV_##name = val,
@@ -134,12 +137,13 @@ typedef enum {
134
137
  #undef UV_ERRNO_GEN
135
138
 
136
139
  #define UV_HANDLE_TYPE_MAP(XX) \
137
- XX(ARES_TASK, ares_task) \
138
140
  XX(ASYNC, async) \
139
141
  XX(CHECK, check) \
140
142
  XX(FS_EVENT, fs_event) \
143
+ XX(FS_POLL, fs_poll) \
141
144
  XX(IDLE, idle) \
142
145
  XX(NAMED_PIPE, pipe) \
146
+ XX(POLL, poll) \
143
147
  XX(PREPARE, prepare) \
144
148
  XX(PROCESS, process) \
145
149
  XX(TCP, tcp) \
@@ -161,8 +165,8 @@ typedef enum {
161
165
  #define XX(uc, lc) UV_##uc,
162
166
  UV_HANDLE_TYPE_MAP(XX)
163
167
  #undef XX
168
+ UV_ARES_TASK,
164
169
  UV_FILE,
165
- UV_HANDLE_TYPE_PRIVATE
166
170
  UV_HANDLE_TYPE_MAX
167
171
  } uv_handle_type;
168
172
 
@@ -176,7 +180,7 @@ typedef enum {
176
180
  } uv_req_type;
177
181
 
178
182
 
179
-
183
+ /* Handle types. */
180
184
  typedef struct uv_loop_s uv_loop_t;
181
185
  typedef struct uv_ares_task_s uv_ares_task_t;
182
186
  typedef struct uv_err_s uv_err_t;
@@ -186,27 +190,31 @@ typedef struct uv_tcp_s uv_tcp_t;
186
190
  typedef struct uv_udp_s uv_udp_t;
187
191
  typedef struct uv_pipe_s uv_pipe_t;
188
192
  typedef struct uv_tty_s uv_tty_t;
193
+ typedef struct uv_poll_s uv_poll_t;
189
194
  typedef struct uv_timer_s uv_timer_t;
190
195
  typedef struct uv_prepare_s uv_prepare_t;
191
196
  typedef struct uv_check_s uv_check_t;
192
197
  typedef struct uv_idle_s uv_idle_t;
193
198
  typedef struct uv_async_s uv_async_t;
194
- typedef struct uv_getaddrinfo_s uv_getaddrinfo_t;
195
199
  typedef struct uv_process_s uv_process_t;
196
- typedef struct uv_counters_s uv_counters_t;
197
- typedef struct uv_cpu_info_s uv_cpu_info_t;
198
- typedef struct uv_interface_address_s uv_interface_address_t;
199
- /* Request types */
200
+ typedef struct uv_fs_event_s uv_fs_event_t;
201
+ typedef struct uv_fs_poll_s uv_fs_poll_t;
202
+
203
+ /* Request types. */
200
204
  typedef struct uv_req_s uv_req_t;
205
+ typedef struct uv_getaddrinfo_s uv_getaddrinfo_t;
201
206
  typedef struct uv_shutdown_s uv_shutdown_t;
202
207
  typedef struct uv_write_s uv_write_t;
203
208
  typedef struct uv_connect_s uv_connect_t;
204
209
  typedef struct uv_udp_send_s uv_udp_send_t;
205
210
  typedef struct uv_fs_s uv_fs_t;
206
- /* uv_fs_event_t is a subclass of uv_handle_t. */
207
- typedef struct uv_fs_event_s uv_fs_event_t;
208
211
  typedef struct uv_work_s uv_work_t;
209
212
 
213
+ /* None of the above. */
214
+ typedef struct uv_counters_s uv_counters_t;
215
+ typedef struct uv_cpu_info_s uv_cpu_info_t;
216
+ typedef struct uv_interface_address_s uv_interface_address_t;
217
+
210
218
 
211
219
  /*
212
220
  * This function must be called before any other functions in libuv.
@@ -219,10 +227,6 @@ typedef struct uv_work_s uv_work_t;
219
227
  UV_EXTERN uv_loop_t* uv_loop_new(void);
220
228
  UV_EXTERN void uv_loop_delete(uv_loop_t*);
221
229
 
222
- /* This is a debugging tool. It's NOT part of the official API. */
223
- UV_EXTERN int uv_loop_refcount(const uv_loop_t*);
224
-
225
-
226
230
  /*
227
231
  * Returns the default loop.
228
232
  */
@@ -230,21 +234,24 @@ UV_EXTERN uv_loop_t* uv_default_loop(void);
230
234
 
231
235
  /*
232
236
  * This function starts the event loop. It blocks until the reference count
233
- * of the loop drops to zero.
237
+ * of the loop drops to zero. Always returns zero.
234
238
  */
235
- UV_EXTERN int uv_run (uv_loop_t*);
239
+ UV_EXTERN int uv_run(uv_loop_t*);
236
240
 
237
241
  /*
238
- * This function polls for new events without blocking.
242
+ * Poll for new events once. Note that this function blocks if there are no
243
+ * pending events. Returns zero when done (no active handles or requests left),
244
+ * or non-zero if more events are expected (meaning you should call
245
+ * uv_run_once() again sometime in the future).
239
246
  */
240
- UV_EXTERN int uv_run_once (uv_loop_t*);
247
+ UV_EXTERN int uv_run_once(uv_loop_t*);
241
248
 
242
249
  /*
243
250
  * Manually modify the event loop's reference count. Useful if the user wants
244
251
  * to have a handle or timeout that doesn't keep the loop alive.
245
252
  */
246
- UV_EXTERN void uv_ref(uv_loop_t*);
247
- UV_EXTERN void uv_unref(uv_loop_t*);
253
+ UV_EXTERN void uv_ref(uv_handle_t*);
254
+ UV_EXTERN void uv_unref(uv_handle_t*);
248
255
 
249
256
  UV_EXTERN void uv_update_time(uv_loop_t*);
250
257
  UV_EXTERN int64_t uv_now(uv_loop_t*);
@@ -285,18 +292,21 @@ typedef void (*uv_connect_cb)(uv_connect_t* req, int status);
285
292
  typedef void (*uv_shutdown_cb)(uv_shutdown_t* req, int status);
286
293
  typedef void (*uv_connection_cb)(uv_stream_t* server, int status);
287
294
  typedef void (*uv_close_cb)(uv_handle_t* handle);
295
+ typedef void (*uv_poll_cb)(uv_poll_t* handle, int status, int events);
288
296
  typedef void (*uv_timer_cb)(uv_timer_t* handle, int status);
289
297
  /* TODO: do these really need a status argument? */
290
298
  typedef void (*uv_async_cb)(uv_async_t* handle, int status);
291
299
  typedef void (*uv_prepare_cb)(uv_prepare_t* handle, int status);
292
300
  typedef void (*uv_check_cb)(uv_check_t* handle, int status);
293
301
  typedef void (*uv_idle_cb)(uv_idle_t* handle, int status);
294
- typedef void (*uv_getaddrinfo_cb)(uv_getaddrinfo_t* handle, int status,
295
- struct addrinfo* res);
296
302
  typedef void (*uv_exit_cb)(uv_process_t*, int exit_status, int term_signal);
303
+ typedef void (*uv_walk_cb)(uv_handle_t* handle, void* arg);
297
304
  typedef void (*uv_fs_cb)(uv_fs_t* req);
298
305
  typedef void (*uv_work_cb)(uv_work_t* req);
299
306
  typedef void (*uv_after_work_cb)(uv_work_t* req);
307
+ typedef void (*uv_getaddrinfo_cb)(uv_getaddrinfo_t* req,
308
+ int status,
309
+ struct addrinfo* res);
300
310
 
301
311
  /*
302
312
  * This will be called repeatedly after the uv_fs_event_t is initialized.
@@ -307,6 +317,11 @@ typedef void (*uv_after_work_cb)(uv_work_t* req);
307
317
  typedef void (*uv_fs_event_cb)(uv_fs_event_t* handle, const char* filename,
308
318
  int events, int status);
309
319
 
320
+ typedef void (*uv_fs_poll_cb)(uv_fs_poll_t* handle,
321
+ int status,
322
+ const uv_statbuf_t* prev,
323
+ const uv_statbuf_t* curr);
324
+
310
325
  typedef enum {
311
326
  UV_LEAVE_GROUP = 0,
312
327
  UV_JOIN_GROUP
@@ -332,12 +347,13 @@ UV_EXTERN const char* uv_err_name(uv_err_t err);
332
347
 
333
348
 
334
349
  #define UV_REQ_FIELDS \
335
- /* read-only */ \
336
- uv_req_type type; \
337
350
  /* public */ \
338
351
  void* data; \
339
352
  /* private */ \
340
- UV_REQ_PRIVATE_FIELDS
353
+ ngx_queue_t active_queue; \
354
+ UV_REQ_PRIVATE_FIELDS \
355
+ /* read-only */ \
356
+ uv_req_type type; \
341
357
 
342
358
  /* Abstract base class of all requests. */
343
359
  struct uv_req_s {
@@ -368,15 +384,17 @@ struct uv_shutdown_s {
368
384
  };
369
385
 
370
386
 
371
- #define UV_HANDLE_FIELDS \
372
- /* read-only */ \
373
- uv_loop_t* loop; \
374
- uv_handle_type type; \
375
- /* public */ \
376
- uv_close_cb close_cb; \
377
- void* data; \
378
- /* private */ \
379
- UV_HANDLE_PRIVATE_FIELDS
387
+ #define UV_HANDLE_FIELDS \
388
+ /* read-only */ \
389
+ uv_loop_t* loop; \
390
+ /* public */ \
391
+ uv_close_cb close_cb; \
392
+ void* data; \
393
+ /* read-only */ \
394
+ uv_handle_type type; \
395
+ /* private */ \
396
+ ngx_queue_t handle_queue; \
397
+ UV_HANDLE_PRIVATE_FIELDS \
380
398
 
381
399
  /* The abstract base class of all handles. */
382
400
  struct uv_handle_s {
@@ -399,7 +417,13 @@ UV_EXTERN size_t uv_req_size(uv_req_type type);
399
417
  * Returns 1 if the prepare/check/idle/timer handle has been started, 0
400
418
  * otherwise. For other handle types this always returns 1.
401
419
  */
402
- UV_EXTERN int uv_is_active(uv_handle_t* handle);
420
+ UV_EXTERN int uv_is_active(const uv_handle_t* handle);
421
+
422
+ /*
423
+ * Walk the list of open handles.
424
+ */
425
+ UV_EXTERN void uv_walk(uv_loop_t* loop, uv_walk_cb walk_cb, void* arg);
426
+
403
427
 
404
428
  /*
405
429
  * Request handle to be closed. close_cb will be called asynchronously after
@@ -418,7 +442,7 @@ UV_EXTERN void uv_close(uv_handle_t* handle, uv_close_cb close_cb);
418
442
  * base and len members of the uv_buf_t struct. The user is responsible for
419
443
  * freeing base after the uv_buf_t is done. Return struct passed by value.
420
444
  */
421
- UV_EXTERN uv_buf_t uv_buf_init(char* base, size_t len);
445
+ UV_EXTERN uv_buf_t uv_buf_init(char* base, unsigned int len);
422
446
 
423
447
 
424
448
  /*
@@ -540,8 +564,8 @@ struct uv_write_s {
540
564
  /*
541
565
  * Used to determine whether a stream is readable or writable.
542
566
  */
543
- UV_EXTERN int uv_is_readable(uv_stream_t* handle);
544
- UV_EXTERN int uv_is_writable(uv_stream_t* handle);
567
+ UV_EXTERN int uv_is_readable(const uv_stream_t* handle);
568
+ UV_EXTERN int uv_is_writable(const uv_stream_t* handle);
545
569
 
546
570
 
547
571
  /*
@@ -551,7 +575,7 @@ UV_EXTERN int uv_is_writable(uv_stream_t* handle);
551
575
  * and the arrival of the close callback, and cannot be used
552
576
  * to validate the handle.
553
577
  */
554
- UV_EXTERN int uv_is_closing(uv_handle_t* handle);
578
+ UV_EXTERN int uv_is_closing(const uv_handle_t* handle);
555
579
 
556
580
 
557
581
  /*
@@ -923,6 +947,74 @@ UV_EXTERN void uv_pipe_connect(uv_connect_t* req, uv_pipe_t* handle,
923
947
  UV_EXTERN void uv_pipe_pending_instances(uv_pipe_t* handle, int count);
924
948
 
925
949
 
950
+ /*
951
+ * uv_poll_t is a subclass of uv_handle_t.
952
+ *
953
+ * The uv_poll watcher is used to watch file descriptors for readability and
954
+ * writability, similar to the purpose of poll(2).
955
+ *
956
+ * The purpose of uv_poll is to enable integrating external libraries that
957
+ * rely on the event loop to signal it about the socket status changes, like
958
+ * c-ares or libssh2. Using uv_poll_t for any other other purpose is not
959
+ * recommended; uv_tcp_t, uv_udp_t, etc. provide an implementation that is
960
+ * much faster and more scalable than what can be achieved with uv_poll_t,
961
+ * especially on Windows.
962
+ *
963
+ * It is possible that uv_poll occasionally signals that a file descriptor is
964
+ * readable or writable even when it isn't. The user should therefore always
965
+ * be prepared to handle EAGAIN or equivalent when it attempts to read from or
966
+ * write to the fd.
967
+ *
968
+ * It is not okay to have multiple active uv_poll watchers for the same socket.
969
+ * This can cause libuv to busyloop or otherwise malfunction.
970
+ *
971
+ * The user should not close a file descriptor while it is being polled by an
972
+ * active uv_poll watcher. This can cause the poll watcher to report an error,
973
+ * but it might also start polling another socket. However the fd can be safely
974
+ * closed immediately after a call to uv_poll_stop() or uv_close().
975
+ *
976
+ * On windows only sockets can be polled with uv_poll. On unix any file
977
+ * descriptor that would be accepted by poll(2) can be used with uv_poll.
978
+ */
979
+ struct uv_poll_s {
980
+ UV_HANDLE_FIELDS
981
+ uv_poll_cb poll_cb;
982
+ UV_POLL_PRIVATE_FIELDS
983
+ };
984
+
985
+ enum uv_poll_event {
986
+ UV_READABLE = 1,
987
+ UV_WRITABLE = 2
988
+ };
989
+
990
+ /* Initialize the poll watcher using a file descriptor. */
991
+ UV_EXTERN int uv_poll_init(uv_loop_t* loop, uv_poll_t* handle, int fd);
992
+
993
+ /* Initialize the poll watcher using a socket descriptor. On unix this is */
994
+ /* identical to uv_poll_init. On windows it takes a SOCKET handle. */
995
+ UV_EXTERN int uv_poll_init_socket(uv_loop_t* loop, uv_poll_t* handle,
996
+ uv_os_sock_t socket);
997
+
998
+ /*
999
+ * Starts polling the file descriptor. `events` is a bitmask consisting made up
1000
+ * of UV_READABLE and UV_WRITABLE. As soon as an event is detected the callback
1001
+ * will be called with `status` set to 0, and the detected events set en the
1002
+ * `events` field.
1003
+ *
1004
+ * If an error happens while polling status may be set to -1 and the error
1005
+ * code can be retrieved with uv_last_error. The user should not close the
1006
+ * socket while uv_poll is active. If the user does that anyway, the callback
1007
+ * *may* be called reporting an error status, but this is not guaranteed.
1008
+ *
1009
+ * Calling uv_poll_start on an uv_poll watcher that is already active is fine.
1010
+ * Doing so will update the events mask that is being watched for.
1011
+ */
1012
+ UV_EXTERN int uv_poll_start(uv_poll_t* handle, int events, uv_poll_cb cb);
1013
+
1014
+ /* Stops polling the file descriptor. */
1015
+ UV_EXTERN int uv_poll_stop(uv_poll_t* handle);
1016
+
1017
+
926
1018
  /*
927
1019
  * uv_prepare_t is a subclass of uv_handle_t.
928
1020
  *
@@ -1058,7 +1150,7 @@ UV_EXTERN void uv_ares_destroy(uv_loop_t*, ares_channel channel);
1058
1150
  struct uv_getaddrinfo_s {
1059
1151
  UV_REQ_FIELDS
1060
1152
  /* read-only */
1061
- uv_loop_t* loop; \
1153
+ uv_loop_t* loop;
1062
1154
  UV_GETADDRINFO_PRIVATE_FIELDS
1063
1155
  };
1064
1156
 
@@ -1066,22 +1158,59 @@ struct uv_getaddrinfo_s {
1066
1158
  /*
1067
1159
  * Asynchronous getaddrinfo(3).
1068
1160
  *
1069
- * Return code 0 means that request is accepted and callback will be called
1070
- * with result. Other return codes mean that there will not be a callback.
1071
- * Input arguments may be released after return from this call.
1161
+ * Either node or service may be NULL but not both.
1162
+ *
1163
+ * hints is a pointer to a struct addrinfo with additional address type
1164
+ * constraints, or NULL. Consult `man -s 3 getaddrinfo` for details.
1165
+ *
1166
+ * Returns 0 on success, -1 on error. Call uv_last_error() to get the error.
1167
+ *
1168
+ * If successful, your callback gets called sometime in the future with the
1169
+ * lookup result, which is either:
1072
1170
  *
1073
- * uv_freeaddrinfo() must be called after completion to free the addrinfo
1074
- * structure.
1171
+ * a) status == 0, the res argument points to a valid struct addrinfo, or
1172
+ * b) status == -1, the res argument is NULL.
1075
1173
  *
1076
- * On error NXDOMAIN the status code will be non-zero and UV_ENOENT returned.
1174
+ * On NXDOMAIN, the status code is -1 and uv_last_error() returns UV_ENOENT.
1175
+ *
1176
+ * Call uv_freeaddrinfo() to free the addrinfo structure.
1077
1177
  */
1078
- UV_EXTERN int uv_getaddrinfo(uv_loop_t*, uv_getaddrinfo_t* handle,
1079
- uv_getaddrinfo_cb getaddrinfo_cb, const char* node, const char* service,
1080
- const struct addrinfo* hints);
1178
+ UV_EXTERN int uv_getaddrinfo(uv_loop_t* loop,
1179
+ uv_getaddrinfo_t* req,
1180
+ uv_getaddrinfo_cb getaddrinfo_cb,
1181
+ const char* node,
1182
+ const char* service,
1183
+ const struct addrinfo* hints);
1081
1184
 
1185
+ /*
1186
+ * Free the struct addrinfo. Passing NULL is allowed and is a no-op.
1187
+ */
1082
1188
  UV_EXTERN void uv_freeaddrinfo(struct addrinfo* ai);
1083
1189
 
1084
1190
  /* uv_spawn() options */
1191
+ typedef enum {
1192
+ UV_IGNORE = 0x00,
1193
+ UV_CREATE_PIPE = 0x01,
1194
+ UV_INHERIT_FD = 0x02,
1195
+ UV_INHERIT_STREAM = 0x04,
1196
+
1197
+ /* When UV_CREATE_PIPE is specified, UV_READABLE_PIPE and UV_WRITABLE_PIPE
1198
+ * determine the direction of flow, from the child process' perspective. Both
1199
+ * flags may be specified to create a duplex data stream.
1200
+ */
1201
+ UV_READABLE_PIPE = 0x10,
1202
+ UV_WRITABLE_PIPE = 0x20
1203
+ } uv_stdio_flags;
1204
+
1205
+ typedef struct uv_stdio_container_s {
1206
+ uv_stdio_flags flags;
1207
+
1208
+ union {
1209
+ uv_stream_t* stream;
1210
+ int fd;
1211
+ } data;
1212
+ } uv_stdio_container_t;
1213
+
1085
1214
  typedef struct uv_process_options_s {
1086
1215
  uv_exit_cb exit_cb; /* Called after the process exits. */
1087
1216
  const char* file; /* Path to program to execute. */
@@ -1102,22 +1231,64 @@ typedef struct uv_process_options_s {
1102
1231
  * in. Stands for current working directory.
1103
1232
  */
1104
1233
  char* cwd;
1105
-
1106
1234
  /*
1107
- * TODO describe how this works.
1235
+ * Various flags that control how uv_spawn() behaves. See the definition of
1236
+ * `enum uv_process_flags` below.
1237
+ */
1238
+ unsigned int flags;
1239
+ /*
1240
+ * Libuv can change the child process' user/group id. This happens only when
1241
+ * the appropriate bits are set in the flags fields. This is not supported on
1242
+ * windows; uv_spawn() will fail and set the error to UV_ENOTSUP.
1108
1243
  */
1109
- int windows_verbatim_arguments;
1244
+ uv_uid_t uid;
1245
+ uv_gid_t gid;
1110
1246
 
1111
1247
  /*
1112
- * The user should supply pointers to initialized uv_pipe_t structs for
1113
- * stdio. This is used to to send or receive input from the subprocess.
1114
- * The user is responsible for calling uv_close on them.
1248
+ * The `stdio` field points to an array of uv_stdio_container_t structs that
1249
+ * describe the file descriptors that will be made available to the child
1250
+ * process. The convention is that stdio[0] points to stdin, fd 1 is used for
1251
+ * stdout, and fd 2 is stderr.
1252
+ *
1253
+ * Note that on windows file descriptors greater than 2 are available to the
1254
+ * child process only if the child processes uses the MSVCRT runtime.
1115
1255
  */
1116
- uv_pipe_t* stdin_stream;
1117
- uv_pipe_t* stdout_stream;
1118
- uv_pipe_t* stderr_stream;
1256
+ int stdio_count;
1257
+ uv_stdio_container_t* stdio;
1119
1258
  } uv_process_options_t;
1120
1259
 
1260
+ /*
1261
+ * These are the flags that can be used for the uv_process_options.flags field.
1262
+ */
1263
+ enum uv_process_flags {
1264
+ /*
1265
+ * Set the child process' user id. The user id is supplied in the `uid` field
1266
+ * of the options struct. This does not work on windows; setting this flag
1267
+ * will cause uv_spawn() to fail.
1268
+ */
1269
+ UV_PROCESS_SETUID = (1 << 0),
1270
+ /*
1271
+ * Set the child process' group id. The user id is supplied in the `gid`
1272
+ * field of the options struct. This does not work on windows; setting this
1273
+ * flag will cause uv_spawn() to fail.
1274
+ */
1275
+ UV_PROCESS_SETGID = (1 << 1),
1276
+ /*
1277
+ * Do not wrap any arguments in quotes, or perform any other escaping, when
1278
+ * converting the argument list into a command line string. This option is
1279
+ * only meaningful on Windows systems. On unix it is silently ignored.
1280
+ */
1281
+ UV_PROCESS_WINDOWS_VERBATIM_ARGUMENTS = (1 << 2),
1282
+ /*
1283
+ * Spawn the child process in a detached state - this will make it a process
1284
+ * group leader, and will effectively enable the child to keep running after
1285
+ * the parent exits. Note that the child process will still keep the
1286
+ * parent's event loop alive unless the parent process calls uv_unref() on
1287
+ * the child's process handle.
1288
+ */
1289
+ UV_PROCESS_DETACHED = (1 << 3)
1290
+ };
1291
+
1121
1292
  /*
1122
1293
  * uv_process_t is a subclass of uv_handle_t
1123
1294
  */
@@ -1132,6 +1303,7 @@ struct uv_process_s {
1132
1303
  UV_EXTERN int uv_spawn(uv_loop_t*, uv_process_t*,
1133
1304
  uv_process_options_t options);
1134
1305
 
1306
+
1135
1307
  /*
1136
1308
  * Kills the process with the specified signal. The user must still
1137
1309
  * call uv_close on the process.
@@ -1249,8 +1421,8 @@ typedef enum {
1249
1421
  /* uv_fs_t is a subclass of uv_req_t */
1250
1422
  struct uv_fs_s {
1251
1423
  UV_REQ_FIELDS
1252
- uv_loop_t* loop;
1253
1424
  uv_fs_type fs_type;
1425
+ uv_loop_t* loop;
1254
1426
  uv_fs_cb cb;
1255
1427
  ssize_t result;
1256
1428
  void* ptr;
@@ -1268,13 +1440,13 @@ UV_EXTERN int uv_fs_open(uv_loop_t* loop, uv_fs_t* req, const char* path,
1268
1440
  int flags, int mode, uv_fs_cb cb);
1269
1441
 
1270
1442
  UV_EXTERN int uv_fs_read(uv_loop_t* loop, uv_fs_t* req, uv_file file,
1271
- void* buf, size_t length, off_t offset, uv_fs_cb cb);
1443
+ void* buf, size_t length, int64_t offset, uv_fs_cb cb);
1272
1444
 
1273
1445
  UV_EXTERN int uv_fs_unlink(uv_loop_t* loop, uv_fs_t* req, const char* path,
1274
1446
  uv_fs_cb cb);
1275
1447
 
1276
1448
  UV_EXTERN int uv_fs_write(uv_loop_t* loop, uv_fs_t* req, uv_file file,
1277
- void* buf, size_t length, off_t offset, uv_fs_cb cb);
1449
+ void* buf, size_t length, int64_t offset, uv_fs_cb cb);
1278
1450
 
1279
1451
  UV_EXTERN int uv_fs_mkdir(uv_loop_t* loop, uv_fs_t* req, const char* path,
1280
1452
  int mode, uv_fs_cb cb);
@@ -1301,10 +1473,10 @@ UV_EXTERN int uv_fs_fdatasync(uv_loop_t* loop, uv_fs_t* req, uv_file file,
1301
1473
  uv_fs_cb cb);
1302
1474
 
1303
1475
  UV_EXTERN int uv_fs_ftruncate(uv_loop_t* loop, uv_fs_t* req, uv_file file,
1304
- off_t offset, uv_fs_cb cb);
1476
+ int64_t offset, uv_fs_cb cb);
1305
1477
 
1306
1478
  UV_EXTERN int uv_fs_sendfile(uv_loop_t* loop, uv_fs_t* req, uv_file out_fd,
1307
- uv_file in_fd, off_t in_offset, size_t length, uv_fs_cb cb);
1479
+ uv_file in_fd, int64_t in_offset, size_t length, uv_fs_cb cb);
1308
1480
 
1309
1481
  UV_EXTERN int uv_fs_chmod(uv_loop_t* loop, uv_fs_t* req, const char* path,
1310
1482
  int mode, uv_fs_cb cb);
@@ -1327,6 +1499,12 @@ UV_EXTERN int uv_fs_link(uv_loop_t* loop, uv_fs_t* req, const char* path,
1327
1499
  */
1328
1500
  #define UV_FS_SYMLINK_DIR 0x0001
1329
1501
 
1502
+ /*
1503
+ * This flag can be used with uv_fs_symlink on Windows
1504
+ * to specify whether the symlink is to be created using junction points.
1505
+ */
1506
+ #define UV_FS_SYMLINK_JUNCTION 0x0002
1507
+
1330
1508
  UV_EXTERN int uv_fs_symlink(uv_loop_t* loop, uv_fs_t* req, const char* path,
1331
1509
  const char* new_path, int flags, uv_fs_cb cb);
1332
1510
 
@@ -1356,6 +1534,46 @@ struct uv_fs_event_s {
1356
1534
  };
1357
1535
 
1358
1536
 
1537
+ /*
1538
+ * uv_fs_stat() based polling file watcher.
1539
+ */
1540
+ struct uv_fs_poll_s {
1541
+ UV_HANDLE_FIELDS
1542
+ /* Private, don't touch. */
1543
+ int busy_polling; /* TODO(bnoordhuis) Fold into flags field. */
1544
+ unsigned int interval;
1545
+ uint64_t start_time;
1546
+ char* path;
1547
+ uv_fs_poll_cb poll_cb;
1548
+ uv_timer_t timer_handle;
1549
+ uv_fs_t* fs_req;
1550
+ uv_statbuf_t statbuf;
1551
+ };
1552
+
1553
+ UV_EXTERN int uv_fs_poll_init(uv_loop_t* loop, uv_fs_poll_t* handle);
1554
+
1555
+ /*
1556
+ * Check the file at `path` for changes every `interval` milliseconds.
1557
+ *
1558
+ * Your callback i invoked with `status == -1` if `path` does not exist
1559
+ * or is inaccessible. The watcher is *not* stopped but your callback is
1560
+ * not called again until something changes (e.g. when the file is created
1561
+ * or the error reason changes).
1562
+ *
1563
+ * When `status == 0`, your callback receives pointers to the old and new
1564
+ * `uv_statbuf_t` structs. They are valid for the duration of the callback
1565
+ * only!
1566
+ *
1567
+ * For maximum portability, use multi-second intervals. Sub-second intervals
1568
+ * will not detect all changes on many file systems.
1569
+ */
1570
+ UV_EXTERN int uv_fs_poll_start(uv_fs_poll_t* handle,
1571
+ uv_fs_poll_cb poll_cb,
1572
+ const char* path,
1573
+ unsigned int interval);
1574
+
1575
+ UV_EXTERN int uv_fs_poll_stop(uv_fs_poll_t* handle);
1576
+
1359
1577
  /*
1360
1578
  * Gets load avg
1361
1579
  * See: http://en.wikipedia.org/wiki/Load_(computing)
@@ -1427,23 +1645,42 @@ UV_EXTERN extern uint64_t uv_hrtime(void);
1427
1645
 
1428
1646
 
1429
1647
  /*
1430
- * Opens a shared library. The filename is in utf-8. On success, -1 is returned
1431
- * and the variable pointed by library receives a handle to the library.
1648
+ * Disables inheritance for file descriptors / handles that this process
1649
+ * inherited from its parent. The effect is that child processes spawned by
1650
+ * this proces don't accidently inherit these handles.
1651
+ *
1652
+ * It is recommended to call this function as early in your program as possible,
1653
+ * before the inherited file descriptors can be closed or duplicated.
1654
+ *
1655
+ * Note that this function works on a best-effort basis: there is no guarantee
1656
+ * that libuv can discover all file descriptors that were inherited. In general
1657
+ * it does a better job on Windows than it does on unix.
1658
+ *
1659
+ * TODO(bb): insert snarky remark to annoy bnoordhuis and the folks at joyent.
1660
+ */
1661
+ UV_EXTERN void uv_disable_stdio_inheritance(void);
1662
+
1663
+ /*
1664
+ * Opens a shared library. The filename is in utf-8. Returns 0 on success and
1665
+ * -1 on error. Call `uv_dlerror(uv_lib_t*)` to get the error message.
1666
+ */
1667
+ UV_EXTERN int uv_dlopen(const char* filename, uv_lib_t* lib);
1668
+
1669
+ /*
1670
+ * Close the shared libary.
1432
1671
  */
1433
- UV_EXTERN uv_err_t uv_dlopen(const char* filename, uv_lib_t* library);
1434
- UV_EXTERN uv_err_t uv_dlclose(uv_lib_t library);
1672
+ UV_EXTERN void uv_dlclose(uv_lib_t* lib);
1435
1673
 
1436
1674
  /*
1437
1675
  * Retrieves a data pointer from a dynamic library. It is legal for a symbol to
1438
- * map to NULL.
1676
+ * map to NULL. Returns 0 on success and -1 if the symbol was not found.
1439
1677
  */
1440
- UV_EXTERN uv_err_t uv_dlsym(uv_lib_t library, const char* name, void** ptr);
1678
+ UV_EXTERN int uv_dlsym(uv_lib_t* lib, const char* name, void** ptr);
1441
1679
 
1442
1680
  /*
1443
- * Retrieves and frees an error message of dynamic linking loaders.
1681
+ * Returns the last uv_dlopen() or uv_dlsym() error message.
1444
1682
  */
1445
- UV_EXTERN const char *uv_dlerror(uv_lib_t library);
1446
- UV_EXTERN void uv_dlerror_free(uv_lib_t library, const char *msg);
1683
+ UV_EXTERN const char* uv_dlerror(uv_lib_t* lib);
1447
1684
 
1448
1685
  /*
1449
1686
  * The mutex functions return 0 on success, -1 on error
@@ -1467,6 +1704,15 @@ UV_EXTERN void uv_rwlock_wrlock(uv_rwlock_t* rwlock);
1467
1704
  UV_EXTERN int uv_rwlock_trywrlock(uv_rwlock_t* rwlock);
1468
1705
  UV_EXTERN void uv_rwlock_wrunlock(uv_rwlock_t* rwlock);
1469
1706
 
1707
+ /*
1708
+ * Same goes for the semaphore functions.
1709
+ */
1710
+ UV_EXTERN int uv_sem_init(uv_sem_t* sem, unsigned int value);
1711
+ UV_EXTERN void uv_sem_destroy(uv_sem_t* sem);
1712
+ UV_EXTERN void uv_sem_post(uv_sem_t* sem);
1713
+ UV_EXTERN void uv_sem_wait(uv_sem_t* sem);
1714
+ UV_EXTERN int uv_sem_trywait(uv_sem_t* sem);
1715
+
1470
1716
  /* Runs a function once and only once. Concurrent calls to uv_once() with the
1471
1717
  * same guard will block all callers except one (it's unspecified which one).
1472
1718
  * The guard should be initialized statically with the UV_ONCE_INIT macro.
@@ -1479,6 +1725,8 @@ UV_EXTERN int uv_thread_join(uv_thread_t *tid);
1479
1725
 
1480
1726
  /* the presence of these unions force similar struct layout */
1481
1727
  union uv_any_handle {
1728
+ uv_handle_t handle;
1729
+ uv_stream_t stream;
1482
1730
  uv_tcp_t tcp;
1483
1731
  uv_pipe_t pipe;
1484
1732
  uv_prepare_t prepare;
@@ -1486,8 +1734,12 @@ union uv_any_handle {
1486
1734
  uv_idle_t idle;
1487
1735
  uv_async_t async;
1488
1736
  uv_timer_t timer;
1489
- uv_getaddrinfo_t getaddrinfo;
1490
1737
  uv_fs_event_t fs_event;
1738
+ uv_fs_poll_t fs_poll;
1739
+ uv_poll_t poll;
1740
+ uv_process_t process;
1741
+ uv_tty_t tty;
1742
+ uv_udp_t udp;
1491
1743
  };
1492
1744
 
1493
1745
  union uv_any_req {
@@ -1497,36 +1749,49 @@ union uv_any_req {
1497
1749
  uv_shutdown_t shutdown;
1498
1750
  uv_fs_t fs_req;
1499
1751
  uv_work_t work_req;
1752
+ uv_udp_send_t udp_send_req;
1753
+ uv_getaddrinfo_t getaddrinfo_req;
1500
1754
  };
1501
1755
 
1502
1756
 
1503
1757
  struct uv_counters_s {
1758
+ uint64_t async_init;
1759
+ uint64_t check_init;
1504
1760
  uint64_t eio_init;
1505
- uint64_t req_init;
1761
+ uint64_t fs_event_init;
1762
+ uint64_t fs_poll_init;
1506
1763
  uint64_t handle_init;
1507
- uint64_t stream_init;
1508
- uint64_t tcp_init;
1509
- uint64_t udp_init;
1764
+ uint64_t idle_init;
1510
1765
  uint64_t pipe_init;
1511
- uint64_t tty_init;
1766
+ uint64_t poll_init;
1512
1767
  uint64_t prepare_init;
1513
- uint64_t check_init;
1514
- uint64_t idle_init;
1515
- uint64_t async_init;
1516
- uint64_t timer_init;
1517
1768
  uint64_t process_init;
1518
- uint64_t fs_event_init;
1769
+ uint64_t req_init;
1770
+ uint64_t stream_init;
1771
+ uint64_t tcp_init;
1772
+ uint64_t timer_init;
1773
+ uint64_t tty_init;
1774
+ uint64_t udp_init;
1519
1775
  };
1520
1776
 
1521
1777
 
1522
1778
  struct uv_loop_s {
1523
1779
  UV_LOOP_PRIVATE_FIELDS
1780
+ ares_channel channel;
1781
+ /* While the channel is active this timer is called once per second to be */
1782
+ /* sure that we're always calling ares_process. See the warning above the */
1783
+ /* definition of ares_timeout(). */
1784
+ uv_timer_t ares_timer; \
1524
1785
  /* RB_HEAD(uv__ares_tasks, uv_ares_task_t) */
1525
- struct uv__ares_tasks { uv_ares_task_t* rbh_root; } uv_ares_handles_;
1786
+ struct uv__ares_tasks { uv_ares_task_t* rbh_root; } ares_handles;
1526
1787
  /* Diagnostic counters */
1527
1788
  uv_counters_t counters;
1528
1789
  /* The last error */
1529
1790
  uv_err_t last_err;
1791
+ /* Loop reference counting */
1792
+ unsigned int active_handles;
1793
+ ngx_queue_t handle_queue;
1794
+ ngx_queue_t active_reqs;
1530
1795
  /* User data - use this for whatever. */
1531
1796
  void* data;
1532
1797
  };