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
@@ -29,7 +29,7 @@
29
29
  #include <time.h>
30
30
 
31
31
  #undef NANOSEC
32
- #define NANOSEC 1000000000
32
+ #define NANOSEC ((uint64_t) 1e9)
33
33
 
34
34
 
35
35
  uint64_t uv_hrtime() {
@@ -211,7 +211,8 @@ uv_err_t uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) {
211
211
  uv_cpu_info_t* cpu_info;
212
212
 
213
213
  size = sizeof(model);
214
- if (sysctlbyname("hw.model", &model, &size, NULL, 0) < 0) {
214
+ if (sysctlbyname("machdep.cpu.brand_string", &model, &size, NULL, 0) < 0 &&
215
+ sysctlbyname("hw.model", &model, &size, NULL, 0) < 0) {
215
216
  return uv__new_sys_error(errno);
216
217
  }
217
218
  size = sizeof(cpuspeed);
@@ -27,65 +27,57 @@
27
27
  #include <string.h>
28
28
  #include <locale.h>
29
29
 
30
- /* The dl family of functions don't set errno. We need a good way to communicate
31
- * errors to the caller but there is only dlerror() and that returns a string -
32
- * a string that may or may not be safe to keep a reference to...
33
- */
34
- static const uv_err_t uv_inval_ = { UV_EINVAL, EINVAL };
35
-
30
+ static int uv__dlerror(uv_lib_t* lib);
36
31
 
37
- uv_err_t uv_dlopen(const char* filename, uv_lib_t* library) {
38
- void* handle = dlopen(filename, RTLD_LAZY);
39
- if (handle == NULL) {
40
- return uv_inval_;
41
- }
42
32
 
43
- *library = handle;
44
- return uv_ok_;
33
+ int uv_dlopen(const char* filename, uv_lib_t* lib) {
34
+ dlerror(); /* Reset error status. */
35
+ lib->errmsg = NULL;
36
+ lib->handle = dlopen(filename, RTLD_LAZY);
37
+ return uv__dlerror(lib);
45
38
  }
46
39
 
47
40
 
48
- uv_err_t uv_dlclose(uv_lib_t library) {
49
- if (dlclose(library) != 0) {
50
- return uv_inval_;
41
+ void uv_dlclose(uv_lib_t* lib) {
42
+ if (lib->errmsg) {
43
+ free(lib->errmsg);
44
+ lib->errmsg = NULL;
51
45
  }
52
46
 
53
- return uv_ok_;
47
+ if (lib->handle) {
48
+ /* Ignore errors. No good way to signal them without leaking memory. */
49
+ dlclose(lib->handle);
50
+ lib->handle = NULL;
51
+ }
54
52
  }
55
53
 
56
54
 
57
- uv_err_t uv_dlsym(uv_lib_t library, const char* name, void** ptr) {
58
- void* address;
59
-
60
- /* Reset error status. */
61
- dlerror();
55
+ int uv_dlsym(uv_lib_t* lib, const char* name, void** ptr) {
56
+ dlerror(); /* Reset error status. */
57
+ *ptr = dlsym(lib->handle, name);
58
+ return uv__dlerror(lib);
59
+ }
62
60
 
63
- address = dlsym(library, name);
64
61
 
65
- if (dlerror()) {
66
- return uv_inval_;
67
- }
68
-
69
- *ptr = (void*) address;
70
- return uv_ok_;
62
+ const char* uv_dlerror(uv_lib_t* lib) {
63
+ return lib->errmsg ? lib->errmsg : "no error";
71
64
  }
72
65
 
73
66
 
74
- const char *uv_dlerror(uv_lib_t library) {
75
- const char* buf = NULL;
76
- /* Make uv_dlerror() be independent of locale */
77
- char* loc = setlocale(LC_MESSAGES, NULL);
78
- if(strcmp(loc, "C") == 0) {
79
- return strdup(dlerror());
80
- } else {
81
- setlocale(LC_MESSAGES, "C");
82
- buf = dlerror();
83
- setlocale(LC_MESSAGES, loc);
84
- return strdup(buf);
85
- }
86
- }
67
+ static int uv__dlerror(uv_lib_t* lib) {
68
+ char* errmsg;
87
69
 
70
+ if (lib->errmsg)
71
+ free(lib->errmsg);
88
72
 
89
- void uv_dlerror_free(uv_lib_t library, const char *msg) {
90
- free((void*)msg);
73
+ errmsg = dlerror();
74
+
75
+ if (errmsg) {
76
+ lib->errmsg = strdup(errmsg);
77
+ return -1;
78
+ }
79
+ else {
80
+ lib->errmsg = NULL;
81
+ return 0;
82
+ }
91
83
  }
@@ -59,6 +59,7 @@ void uv_fatal_error(const int errorno, const char* syscall) {
59
59
  uv_err_code uv_translate_sys_error(int sys_errno) {
60
60
  switch (sys_errno) {
61
61
  case 0: return UV_OK;
62
+ case EIO: return UV_EIO;
62
63
  case EPERM: return UV_EPERM;
63
64
  case ENOSYS: return UV_ENOSYS;
64
65
  case ENOTSOCK: return UV_ENOTSOCK;
@@ -68,6 +69,9 @@ uv_err_code uv_translate_sys_error(int sys_errno) {
68
69
  case EBADF: return UV_EBADF;
69
70
  case EPIPE: return UV_EPIPE;
70
71
  case EAGAIN: return UV_EAGAIN;
72
+ #if EWOULDBLOCK != EAGAIN
73
+ case EWOULDBLOCK: return UV_EAGAIN;
74
+ #endif
71
75
  case ECONNRESET: return UV_ECONNRESET;
72
76
  case EFAULT: return UV_EFAULT;
73
77
  case EMFILE: return UV_EMFILE;
@@ -92,6 +96,8 @@ uv_err_code uv_translate_sys_error(int sys_errno) {
92
96
  case EBUSY: return UV_EBUSY;
93
97
  case ENOTEMPTY: return UV_ENOTEMPTY;
94
98
  case ENOSPC: return UV_ENOSPC;
99
+ case EROFS: return UV_EROFS;
100
+ case ENOMEM: return UV_ENOMEM;
95
101
  default: return UV_UNKNOWN;
96
102
  }
97
103
  UNREACHABLE();
@@ -608,9 +608,6 @@ ev_syserr (const char *msg)
608
608
  static void *
609
609
  ev_realloc_emul (void *ptr, long size)
610
610
  {
611
- #if __GLIBC__
612
- return realloc (ptr, size);
613
- #else
614
611
  /* some systems, notably openbsd and darwin, fail to properly
615
612
  * implement realloc (x, 0) (as required by both ansi c-89 and
616
613
  * the single unix specification, so work around them here.
@@ -621,7 +618,6 @@ ev_realloc_emul (void *ptr, long size)
621
618
 
622
619
  free (ptr);
623
620
  return 0;
624
- #endif
625
621
  }
626
622
 
627
623
  static void *(*alloc)(void *ptr, long size) = ev_realloc_emul;
@@ -2538,6 +2534,14 @@ ev_run (EV_P_ int flags)
2538
2534
  #endif
2539
2535
  }
2540
2536
 
2537
+ /* libuv special */
2538
+ void
2539
+ ev__run (EV_P_ ev_tstamp waittime)
2540
+ {
2541
+ fd_reify (EV_A);
2542
+ backend_poll (EV_A_ waittime);
2543
+ }
2544
+
2541
2545
  void
2542
2546
  ev_break (EV_P_ int how)
2543
2547
  {
@@ -38,7 +38,7 @@
38
38
  #include <fcntl.h>
39
39
 
40
40
  #undef NANOSEC
41
- #define NANOSEC 1000000000
41
+ #define NANOSEC ((uint64_t) 1e9)
42
42
 
43
43
  #ifndef CPUSTATES
44
44
  # define CPUSTATES 5U
@@ -49,7 +49,6 @@
49
49
  uv__set_sys_error(loop, ENOMEM); \
50
50
  return -1; \
51
51
  } \
52
- uv_ref(loop); \
53
52
  } else { \
54
53
  /* sync */ \
55
54
  req->result = func(args); \
@@ -66,8 +65,7 @@ static void uv_fs_req_init(uv_loop_t* loop, uv_fs_t* req, uv_fs_type fs_type,
66
65
  /* Make sure the thread pool is initialized. */
67
66
  uv_eio_init(loop);
68
67
 
69
- uv__req_init(loop, (uv_req_t*)req);
70
- req->type = UV_FS;
68
+ uv__req_init(loop, req, UV_FS);
71
69
  req->loop = loop;
72
70
  req->fs_type = fs_type;
73
71
  req->cb = cb;
@@ -76,10 +74,17 @@ static void uv_fs_req_init(uv_loop_t* loop, uv_fs_t* req, uv_fs_type fs_type,
76
74
  req->path = path ? strdup(path) : NULL;
77
75
  req->errorno = 0;
78
76
  req->eio = NULL;
77
+
78
+ /* synchronous requests don't increase the reference count */
79
+ if (!req->cb)
80
+ uv__req_unregister(req->loop, req);
79
81
  }
80
82
 
81
83
 
82
84
  void uv_fs_req_cleanup(uv_fs_t* req) {
85
+ if (req->cb)
86
+ uv__req_unregister(req->loop, req);
87
+
83
88
  free(req->path);
84
89
  req->path = NULL;
85
90
 
@@ -170,10 +175,9 @@ static int uv__fs_after(eio_req* eio) {
170
175
  break;
171
176
  }
172
177
 
173
- uv_unref(req->loop);
174
178
  req->eio = NULL; /* Freed by libeio */
175
-
176
179
  req->cb(req);
180
+
177
181
  return 0;
178
182
  }
179
183
 
@@ -190,7 +194,6 @@ int uv_fs_open(uv_loop_t* loop, uv_fs_t* req, const char* path, int flags,
190
194
 
191
195
  if (cb) {
192
196
  /* async */
193
- uv_ref(loop);
194
197
  req->eio = eio_open(path, flags, mode, EIO_PRI_DEFAULT, uv__fs_after, req, &loop->uv_eio_channel);
195
198
  if (!req->eio) {
196
199
  uv__set_sys_error(loop, ENOMEM);
@@ -215,12 +218,11 @@ int uv_fs_open(uv_loop_t* loop, uv_fs_t* req, const char* path, int flags,
215
218
 
216
219
 
217
220
  int uv_fs_read(uv_loop_t* loop, uv_fs_t* req, uv_file fd, void* buf,
218
- size_t length, off_t offset, uv_fs_cb cb) {
221
+ size_t length, int64_t offset, uv_fs_cb cb) {
219
222
  uv_fs_req_init(loop, req, UV_FS_READ, NULL, cb);
220
223
 
221
224
  if (cb) {
222
225
  /* async */
223
- uv_ref(loop);
224
226
  req->eio = eio_read(fd, buf, length, offset, EIO_PRI_DEFAULT,
225
227
  uv__fs_after, req, &loop->uv_eio_channel);
226
228
 
@@ -253,12 +255,11 @@ int uv_fs_unlink(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) {
253
255
 
254
256
 
255
257
  int uv_fs_write(uv_loop_t* loop, uv_fs_t* req, uv_file file, void* buf,
256
- size_t length, off_t offset, uv_fs_cb cb) {
258
+ size_t length, int64_t offset, uv_fs_cb cb) {
257
259
  uv_fs_req_init(loop, req, UV_FS_WRITE, NULL, cb);
258
260
 
259
261
  if (cb) {
260
262
  /* async */
261
- uv_ref(loop);
262
263
  req->eio = eio_write(file, buf, length, offset, EIO_PRI_DEFAULT,
263
264
  uv__fs_after, req, &loop->uv_eio_channel);
264
265
  if (!req->eio) {
@@ -306,7 +307,6 @@ int uv_fs_readdir(uv_loop_t* loop, uv_fs_t* req, const char* path, int flags,
306
307
 
307
308
  if (cb) {
308
309
  /* async */
309
- uv_ref(loop);
310
310
  req->eio = eio_readdir(path, flags, EIO_PRI_DEFAULT, uv__fs_after, req, &loop->uv_eio_channel);
311
311
  if (!req->eio) {
312
312
  uv__set_sys_error(loop, ENOMEM);
@@ -376,7 +376,6 @@ int uv_fs_stat(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) {
376
376
 
377
377
  if (cb) {
378
378
  /* async */
379
- uv_ref(loop);
380
379
  req->eio = eio_stat(pathdup, EIO_PRI_DEFAULT, uv__fs_after, req, &loop->uv_eio_channel);
381
380
 
382
381
  free(pathdup);
@@ -410,7 +409,6 @@ int uv_fs_fstat(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb) {
410
409
 
411
410
  if (cb) {
412
411
  /* async */
413
- uv_ref(loop);
414
412
  req->eio = eio_fstat(file, EIO_PRI_DEFAULT, uv__fs_after, req, &loop->uv_eio_channel);
415
413
 
416
414
  if (!req->eio) {
@@ -461,7 +459,7 @@ int uv_fs_fdatasync(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb) {
461
459
  }
462
460
 
463
461
 
464
- int uv_fs_ftruncate(uv_loop_t* loop, uv_fs_t* req, uv_file file, off_t offset,
462
+ int uv_fs_ftruncate(uv_loop_t* loop, uv_fs_t* req, uv_file file, int64_t offset,
465
463
  uv_fs_cb cb) {
466
464
  char* path = NULL;
467
465
  WRAP_EIO(UV_FS_FTRUNCATE, eio_ftruncate, ftruncate, ARGS2(file, offset))
@@ -469,7 +467,7 @@ int uv_fs_ftruncate(uv_loop_t* loop, uv_fs_t* req, uv_file file, off_t offset,
469
467
 
470
468
 
471
469
  int uv_fs_sendfile(uv_loop_t* loop, uv_fs_t* req, uv_file out_fd, uv_file in_fd,
472
- off_t in_offset, size_t length, uv_fs_cb cb) {
470
+ int64_t in_offset, size_t length, uv_fs_cb cb) {
473
471
  char* path = NULL;
474
472
  WRAP_EIO(UV_FS_SENDFILE, eio_sendfile, eio_sendfile_sync,
475
473
  ARGS4(out_fd, in_fd, in_offset, length))
@@ -496,7 +494,6 @@ int uv_fs_utime(uv_loop_t* loop, uv_fs_t* req, const char* path, double atime,
496
494
  }
497
495
 
498
496
 
499
- #if HAVE_FUTIMES
500
497
  static int _futime(const uv_file fd, double atime, double mtime) {
501
498
  #if __linux__
502
499
  /* utimesat() has nanosecond resolution but we stick to microseconds
@@ -508,30 +505,24 @@ static int _futime(const uv_file fd, double atime, double mtime) {
508
505
  ts[1].tv_sec = mtime;
509
506
  ts[1].tv_nsec = (unsigned long)(mtime * 1000000) % 1000000 * 1000;
510
507
  return uv__utimesat(fd, NULL, ts, 0);
511
- #else
508
+ #elif HAVE_FUTIMES
512
509
  struct timeval tv[2];
513
510
  tv[0].tv_sec = atime;
514
511
  tv[0].tv_usec = (unsigned long)(atime * 1000000) % 1000000;
515
512
  tv[1].tv_sec = mtime;
516
513
  tv[1].tv_usec = (unsigned long)(mtime * 1000000) % 1000000;
517
514
  return futimes(fd, tv);
518
- #endif /* __linux__ */
515
+ #else /* !HAVE_FUTIMES */
516
+ errno = ENOSYS;
517
+ return -1;
518
+ #endif
519
519
  }
520
- #endif /* HAVE_FUTIMES */
521
520
 
522
521
 
523
522
  int uv_fs_futime(uv_loop_t* loop, uv_fs_t* req, uv_file file, double atime,
524
523
  double mtime, uv_fs_cb cb) {
525
524
  const char* path = NULL;
526
-
527
- uv_fs_req_init(loop, req, UV_FS_FUTIME, path, cb);
528
-
529
- #if HAVE_FUTIMES
530
525
  WRAP_EIO(UV_FS_FUTIME, eio_futime, _futime, ARGS3(file, atime, mtime))
531
- #else
532
- uv__set_sys_error(loop, ENOSYS);
533
- return -1;
534
- #endif
535
526
  }
536
527
 
537
528
 
@@ -553,7 +544,6 @@ int uv_fs_lstat(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) {
553
544
 
554
545
  if (cb) {
555
546
  /* async */
556
- uv_ref(loop);
557
547
  req->eio = eio_lstat(pathdup, EIO_PRI_DEFAULT, uv__fs_after, req, &loop->uv_eio_channel);
558
548
 
559
549
  free(pathdup);
@@ -603,7 +593,6 @@ int uv_fs_readlink(uv_loop_t* loop, uv_fs_t* req, const char* path,
603
593
 
604
594
  if (cb) {
605
595
  if ((req->eio = eio_readlink(path, EIO_PRI_DEFAULT, uv__fs_after, req, &loop->uv_eio_channel))) {
606
- uv_ref(loop);
607
596
  return 0;
608
597
  } else {
609
598
  uv__set_sys_error(loop, ENOMEM);
@@ -675,7 +664,7 @@ static void uv__work(eio_req* eio) {
675
664
 
676
665
  static int uv__after_work(eio_req *eio) {
677
666
  uv_work_t* req = eio->data;
678
- uv_unref(req->loop);
667
+ uv__req_unregister(req->loop, req);
679
668
  if (req->after_work_cb) {
680
669
  req->after_work_cb(req);
681
670
  }
@@ -689,14 +678,17 @@ int uv_queue_work(uv_loop_t* loop, uv_work_t* req, uv_work_cb work_cb,
689
678
 
690
679
  uv_eio_init(loop);
691
680
 
692
- uv__req_init(loop, (uv_req_t*)req);
693
- uv_ref(loop);
681
+ uv__req_init(loop, req, UV_WORK);
694
682
  req->loop = loop;
695
683
  req->data = data;
696
684
  req->work_cb = work_cb;
697
685
  req->after_work_cb = after_work_cb;
698
686
 
699
- req->eio = eio_custom(uv__work, EIO_PRI_DEFAULT, uv__after_work, req, &loop->uv_eio_channel);
687
+ req->eio = eio_custom(uv__work,
688
+ EIO_PRI_DEFAULT,
689
+ uv__after_work,
690
+ req,
691
+ &loop->uv_eio_channel);
700
692
 
701
693
  if (!req->eio) {
702
694
  uv__set_sys_error(loop, ENOMEM);
@@ -27,7 +27,6 @@
27
27
 
28
28
  #include <assert.h>
29
29
  #include <stdlib.h> /* abort */
30
- #include <stddef.h> /* offsetof */
31
30
 
32
31
  #if __STRICT_ANSI__
33
32
  # define inline __inline
@@ -64,9 +63,6 @@
64
63
  # define HAVE_KQUEUE 1
65
64
  #endif
66
65
 
67
- #define container_of(ptr, type, member) \
68
- ((type *) ((char *) (ptr) - offsetof(type, member)))
69
-
70
66
  #define UNREACHABLE() \
71
67
  do { \
72
68
  assert(0 && "unreachable code"); \
@@ -82,47 +78,67 @@
82
78
  } \
83
79
  while (0)
84
80
 
81
+ #define UV__IO_READ EV_READ
82
+ #define UV__IO_WRITE EV_WRITE
83
+ #define UV__IO_ERROR EV_ERROR
84
+
85
85
  /* flags */
86
86
  enum {
87
- UV_CLOSING = 0x01, /* uv_close() called but not finished. */
88
- UV_CLOSED = 0x02, /* close(2) finished. */
89
- UV_READING = 0x04, /* uv_read_start() called. */
90
- UV_SHUTTING = 0x08, /* uv_shutdown() called but not complete. */
91
- UV_SHUT = 0x10, /* Write side closed. */
92
- UV_READABLE = 0x20, /* The stream is readable */
93
- UV_WRITABLE = 0x40, /* The stream is writable */
94
- UV_TCP_NODELAY = 0x080, /* Disable Nagle. */
95
- UV_TCP_KEEPALIVE = 0x100, /* Turn on keep-alive. */
96
- UV_TIMER_ACTIVE = 0x080,
97
- UV_TIMER_REPEAT = 0x100
87
+ UV_CLOSING = 0x01, /* uv_close() called but not finished. */
88
+ UV_CLOSED = 0x02, /* close(2) finished. */
89
+ UV_STREAM_READING = 0x04, /* uv_read_start() called. */
90
+ UV_STREAM_SHUTTING = 0x08, /* uv_shutdown() called but not complete. */
91
+ UV_STREAM_SHUT = 0x10, /* Write side closed. */
92
+ UV_STREAM_READABLE = 0x20, /* The stream is readable */
93
+ UV_STREAM_WRITABLE = 0x40, /* The stream is writable */
94
+ UV_STREAM_BLOCKING = 0x80, /* Synchronous writes. */
95
+ UV_TCP_NODELAY = 0x100, /* Disable Nagle. */
96
+ UV_TCP_KEEPALIVE = 0x200 /* Turn on keep-alive. */
98
97
  };
99
98
 
99
+ inline static void uv__req_init(uv_loop_t* loop,
100
+ uv_req_t* req,
101
+ uv_req_type type) {
102
+ loop->counters.req_init++;
103
+ req->type = type;
104
+ uv__req_register(loop, req);
105
+ }
106
+ #define uv__req_init(loop, req, type) \
107
+ uv__req_init((loop), (uv_req_t*)(req), (type))
108
+
100
109
  /* core */
101
110
  void uv__handle_init(uv_loop_t* loop, uv_handle_t* handle, uv_handle_type type);
102
- int uv__nonblock(int fd, int set) __attribute__((unused));
103
- int uv__cloexec(int fd, int set) __attribute__((unused));
111
+ int uv__nonblock(int fd, int set);
112
+ int uv__cloexec(int fd, int set);
104
113
  int uv__socket(int domain, int type, int protocol);
105
114
  int uv__dup(int fd);
115
+ int uv_async_stop(uv_async_t* handle);
116
+
117
+ void uv__io_init(uv__io_t* handle, uv__io_cb cb, int fd, int events);
118
+ void uv__io_set(uv__io_t* handle, uv__io_cb cb, int fd, int events);
119
+ void uv__io_start(uv_loop_t* loop, uv__io_t* handle);
120
+ void uv__io_stop(uv_loop_t* loop, uv__io_t* handle);
121
+ void uv__io_feed(uv_loop_t* loop, uv__io_t* handle, int event);
122
+ int uv__io_active(uv__io_t* handle);
106
123
 
107
124
  /* loop */
108
125
  int uv__loop_init(uv_loop_t* loop, int default_loop);
109
126
  void uv__loop_delete(uv_loop_t* loop);
127
+ void uv__run_idle(uv_loop_t* loop);
128
+ void uv__run_check(uv_loop_t* loop);
129
+ void uv__run_prepare(uv_loop_t* loop);
110
130
 
111
131
  /* error */
112
132
  uv_err_code uv_translate_sys_error(int sys_errno);
113
133
  void uv_fatal_error(const int errorno, const char* syscall);
114
134
 
115
- /* requests */
116
- void uv__req_init(uv_loop_t* loop, uv_req_t*);
117
-
118
135
  /* stream */
119
136
  void uv__stream_init(uv_loop_t* loop, uv_stream_t* stream,
120
137
  uv_handle_type type);
121
138
  int uv__stream_open(uv_stream_t*, int fd, int flags);
122
139
  void uv__stream_destroy(uv_stream_t* stream);
123
- void uv__stream_io(EV_P_ ev_io* watcher, int revents);
124
- void uv__server_io(EV_P_ ev_io* watcher, int revents);
125
- int uv__accept(int sockfd, struct sockaddr* saddr, socklen_t len);
140
+ void uv__server_io(uv_loop_t* loop, uv__io_t* watcher, int events);
141
+ int uv__accept(int sockfd);
126
142
  int uv__connect(uv_connect_t* req, uv_stream_t* stream, struct sockaddr* addr,
127
143
  socklen_t addrlen, uv_connect_cb cb);
128
144
 
@@ -133,19 +149,18 @@ int uv__tcp_keepalive(uv_tcp_t* handle, int enable, unsigned int delay);
133
149
 
134
150
  /* pipe */
135
151
  int uv_pipe_listen(uv_pipe_t* handle, int backlog, uv_connection_cb cb);
136
- void uv__pipe_accept(EV_P_ ev_io* watcher, int revents);
137
152
 
138
- /* various */
139
- int uv__check_active(const uv_check_t* handle);
140
- int uv__idle_active(const uv_idle_t* handle);
141
- int uv__prepare_active(const uv_prepare_t* handle);
142
- int uv__timer_active(const uv_timer_t* handle);
153
+ /* timer */
154
+ void uv__run_timers(uv_loop_t* loop);
155
+ unsigned int uv__next_timeout(uv_loop_t* loop);
143
156
 
157
+ /* various */
144
158
  void uv__async_close(uv_async_t* handle);
145
159
  void uv__check_close(uv_check_t* handle);
146
160
  void uv__fs_event_close(uv_fs_event_t* handle);
147
161
  void uv__idle_close(uv_idle_t* handle);
148
162
  void uv__pipe_close(uv_pipe_t* handle);
163
+ void uv__poll_close(uv_poll_t* handle);
149
164
  void uv__prepare_close(uv_prepare_t* handle);
150
165
  void uv__process_close(uv_process_t* handle);
151
166
  void uv__stream_close(uv_stream_t* handle);
@@ -153,8 +168,12 @@ void uv__timer_close(uv_timer_t* handle);
153
168
  void uv__udp_close(uv_udp_t* handle);
154
169
  void uv__udp_finish_close(uv_udp_t* handle);
155
170
 
156
- #define UV__F_IPC (1 << 0)
157
- #define UV__F_NONBLOCK (1 << 1)
171
+ #ifdef UV__O_NONBLOCK
172
+ # define UV__F_NONBLOCK UV__O_NONBLOCK
173
+ #else
174
+ # define UV__F_NONBLOCK 1
175
+ #endif
176
+
158
177
  int uv__make_socketpair(int fds[2], int flags);
159
178
  int uv__make_pipe(int fds[2], int flags);
160
179