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
@@ -32,30 +32,50 @@ static uv_connect_t connect_req;
32
32
 
33
33
  static char buffer[32767];
34
34
 
35
+ static int req_cb_called;
36
+ static int connect_cb_called;
37
+ static int write_cb_called;
38
+ static int shutdown_cb_called;
39
+
35
40
 
36
41
  static void fail_cb(void) {
37
42
  FATAL("fail_cb should not have been called");
38
43
  }
39
44
 
40
45
 
41
- static void write_unref_cb(uv_connect_t* req, int status) {
42
- uv_buf_t buf = uv_buf_init(buffer, sizeof buffer);
46
+ static void req_cb(uv_handle_t* req, int status) {
47
+ req_cb_called++;
48
+ }
43
49
 
44
- ASSERT(req == &connect_req);
45
- ASSERT(status == 0);
46
50
 
47
- uv_write(&write_req, req->handle, &buf, 1, (uv_write_cb) fail_cb);
48
- uv_unref(uv_default_loop()); /* uv_write refs the loop */
51
+ static void shutdown_cb(uv_shutdown_t* req, int status) {
52
+ ASSERT(req == &shutdown_req);
53
+ shutdown_cb_called++;
49
54
  }
50
55
 
51
56
 
57
+ static void write_cb(uv_write_t* req, int status) {
58
+ ASSERT(req == &write_req);
59
+ uv_shutdown(&shutdown_req, req->handle, shutdown_cb);
60
+ write_cb_called++;
61
+ }
62
+
52
63
 
53
- static void shutdown_unref_cb(uv_connect_t* req, int status) {
64
+ static void connect_and_write(uv_connect_t* req, int status) {
65
+ uv_buf_t buf = uv_buf_init(buffer, sizeof buffer);
54
66
  ASSERT(req == &connect_req);
55
67
  ASSERT(status == 0);
68
+ uv_write(&write_req, req->handle, &buf, 1, write_cb);
69
+ connect_cb_called++;
70
+ }
56
71
 
57
- uv_shutdown(&shutdown_req, req->handle, (uv_shutdown_cb) fail_cb);
58
- uv_unref(uv_default_loop()); /* uv_shutdown refs the loop */
72
+
73
+
74
+ static void connect_and_shutdown(uv_connect_t* req, int status) {
75
+ ASSERT(req == &connect_req);
76
+ ASSERT(status == 0);
77
+ uv_shutdown(&shutdown_req, req->handle, shutdown_cb);
78
+ connect_cb_called++;
59
79
  }
60
80
 
61
81
 
@@ -69,7 +89,7 @@ TEST_IMPL(idle_ref) {
69
89
  uv_idle_t h;
70
90
  uv_idle_init(uv_default_loop(), &h);
71
91
  uv_idle_start(&h, NULL);
72
- uv_unref(uv_default_loop());
92
+ uv_unref((uv_handle_t*)&h);
73
93
  uv_run(uv_default_loop());
74
94
  return 0;
75
95
  }
@@ -78,7 +98,7 @@ TEST_IMPL(idle_ref) {
78
98
  TEST_IMPL(async_ref) {
79
99
  uv_async_t h;
80
100
  uv_async_init(uv_default_loop(), &h, NULL);
81
- uv_unref(uv_default_loop());
101
+ uv_unref((uv_handle_t*)&h);
82
102
  uv_run(uv_default_loop());
83
103
  return 0;
84
104
  }
@@ -88,7 +108,7 @@ TEST_IMPL(prepare_ref) {
88
108
  uv_prepare_t h;
89
109
  uv_prepare_init(uv_default_loop(), &h);
90
110
  uv_prepare_start(&h, NULL);
91
- uv_unref(uv_default_loop());
111
+ uv_unref((uv_handle_t*)&h);
92
112
  uv_run(uv_default_loop());
93
113
  return 0;
94
114
  }
@@ -98,17 +118,16 @@ TEST_IMPL(check_ref) {
98
118
  uv_check_t h;
99
119
  uv_check_init(uv_default_loop(), &h);
100
120
  uv_check_start(&h, NULL);
101
- uv_unref(uv_default_loop());
121
+ uv_unref((uv_handle_t*)&h);
102
122
  uv_run(uv_default_loop());
103
123
  return 0;
104
124
  }
105
125
 
106
126
 
107
- static void prepare_cb(uv_prepare_t* handle, int status) {
108
- ASSERT(handle != NULL);
127
+ static void prepare_cb(uv_prepare_t* h, int status) {
128
+ ASSERT(h != NULL);
109
129
  ASSERT(status == 0);
110
-
111
- uv_unref(uv_default_loop());
130
+ uv_unref((uv_handle_t*)h);
112
131
  }
113
132
 
114
133
 
@@ -124,7 +143,7 @@ TEST_IMPL(unref_in_prepare_cb) {
124
143
  TEST_IMPL(timer_ref) {
125
144
  uv_timer_t h;
126
145
  uv_timer_init(uv_default_loop(), &h);
127
- uv_unref(uv_default_loop());
146
+ uv_unref((uv_handle_t*)&h);
128
147
  uv_run(uv_default_loop());
129
148
  return 0;
130
149
  }
@@ -133,8 +152,8 @@ TEST_IMPL(timer_ref) {
133
152
  TEST_IMPL(timer_ref2) {
134
153
  uv_timer_t h;
135
154
  uv_timer_init(uv_default_loop(), &h);
136
- uv_timer_start(&h, (uv_timer_cb) fail_cb, 42, 42);
137
- uv_unref(uv_default_loop());
155
+ uv_timer_start(&h, (uv_timer_cb)fail_cb, 42, 42);
156
+ uv_unref((uv_handle_t*)&h);
138
157
  uv_run(uv_default_loop());
139
158
  return 0;
140
159
  }
@@ -142,62 +161,65 @@ TEST_IMPL(timer_ref2) {
142
161
 
143
162
  TEST_IMPL(fs_event_ref) {
144
163
  uv_fs_event_t h;
145
- uv_fs_event_init(uv_default_loop(), &h, ".", (uv_fs_event_cb) fail_cb, 0);
146
- uv_unref(uv_default_loop());
164
+ uv_fs_event_init(uv_default_loop(), &h, ".", (uv_fs_event_cb)fail_cb, 0);
165
+ uv_unref((uv_handle_t*)&h);
147
166
  uv_run(uv_default_loop());
148
167
  return 0;
149
168
  }
150
169
 
151
170
 
152
- TEST_IMPL(tcp_ref) {
153
- uv_tcp_t h;
154
- uv_tcp_init(uv_default_loop(), &h);
155
- uv_unref(uv_default_loop());
171
+ TEST_IMPL(fs_poll_ref) {
172
+ uv_fs_poll_t h;
173
+ uv_fs_poll_init(uv_default_loop(), &h);
174
+ uv_fs_poll_start(&h, NULL, ".", 999);
175
+ uv_unref((uv_handle_t*)&h);
156
176
  uv_run(uv_default_loop());
157
177
  return 0;
158
178
  }
159
179
 
160
180
 
161
- TEST_IMPL(tcp_ref2) {
181
+ TEST_IMPL(tcp_ref) {
162
182
  uv_tcp_t h;
163
183
  uv_tcp_init(uv_default_loop(), &h);
164
- uv_listen((uv_stream_t*)&h, 128, (uv_connection_cb)fail_cb);
165
- uv_unref(uv_default_loop());
184
+ uv_unref((uv_handle_t*)&h);
166
185
  uv_run(uv_default_loop());
167
186
  return 0;
168
187
  }
169
188
 
170
189
 
171
- TEST_IMPL(tcp_ref3) {
172
- struct sockaddr_in addr = uv_ip4_addr("127.0.0.1", TEST_PORT);
190
+ TEST_IMPL(tcp_ref2) {
173
191
  uv_tcp_t h;
174
192
  uv_tcp_init(uv_default_loop(), &h);
175
- uv_tcp_connect(&connect_req, &h, addr, (uv_connect_cb)fail_cb);
176
- uv_unref(uv_default_loop());
177
- uv_unref(uv_default_loop()); /* connect req refs the loop */
193
+ uv_listen((uv_stream_t*)&h, 128, (uv_connection_cb)fail_cb);
194
+ uv_unref((uv_handle_t*)&h);
178
195
  uv_run(uv_default_loop());
179
196
  return 0;
180
197
  }
181
198
 
182
199
 
183
- TEST_IMPL(tcp_ref4) {
200
+ TEST_IMPL(tcp_ref3) {
184
201
  struct sockaddr_in addr = uv_ip4_addr("127.0.0.1", TEST_PORT);
185
202
  uv_tcp_t h;
186
203
  uv_tcp_init(uv_default_loop(), &h);
187
- uv_tcp_connect(&connect_req, &h, addr, write_unref_cb);
188
- uv_unref(uv_default_loop());
204
+ uv_tcp_connect(&connect_req, &h, addr, connect_and_shutdown);
205
+ uv_unref((uv_handle_t*)&h);
189
206
  uv_run(uv_default_loop());
207
+ ASSERT(connect_cb_called == 1);
208
+ ASSERT(shutdown_cb_called == 1);
190
209
  return 0;
191
210
  }
192
211
 
193
212
 
194
- TEST_IMPL(tcp_ref5) {
213
+ TEST_IMPL(tcp_ref4) {
195
214
  struct sockaddr_in addr = uv_ip4_addr("127.0.0.1", TEST_PORT);
196
215
  uv_tcp_t h;
197
216
  uv_tcp_init(uv_default_loop(), &h);
198
- uv_tcp_connect(&connect_req, &h, addr, shutdown_unref_cb);
199
- uv_unref(uv_default_loop());
217
+ uv_tcp_connect(&connect_req, &h, addr, connect_and_write);
218
+ uv_unref((uv_handle_t*)&h);
200
219
  uv_run(uv_default_loop());
220
+ ASSERT(connect_cb_called == 1);
221
+ ASSERT(write_cb_called == 1);
222
+ ASSERT(shutdown_cb_called == 1);
201
223
  return 0;
202
224
  }
203
225
 
@@ -205,7 +227,7 @@ TEST_IMPL(tcp_ref5) {
205
227
  TEST_IMPL(udp_ref) {
206
228
  uv_udp_t h;
207
229
  uv_udp_init(uv_default_loop(), &h);
208
- uv_unref(uv_default_loop());
230
+ uv_unref((uv_handle_t*)&h);
209
231
  uv_run(uv_default_loop());
210
232
  return 0;
211
233
  }
@@ -217,7 +239,7 @@ TEST_IMPL(udp_ref2) {
217
239
  uv_udp_init(uv_default_loop(), &h);
218
240
  uv_udp_bind(&h, addr, 0);
219
241
  uv_udp_recv_start(&h, (uv_alloc_cb)fail_cb, (uv_udp_recv_cb)fail_cb);
220
- uv_unref(uv_default_loop());
242
+ uv_unref((uv_handle_t*)&h);
221
243
  uv_run(uv_default_loop());
222
244
  return 0;
223
245
  }
@@ -230,10 +252,10 @@ TEST_IMPL(udp_ref3) {
230
252
  uv_udp_t h;
231
253
 
232
254
  uv_udp_init(uv_default_loop(), &h);
233
- uv_udp_send(&req, &h, &buf, 1, addr, (uv_udp_send_cb)fail_cb);
234
- uv_unref(uv_default_loop());
235
- uv_unref(uv_default_loop()); /* send req refs the loop */
255
+ uv_udp_send(&req, &h, &buf, 1, addr, (uv_udp_send_cb)req_cb);
256
+ uv_unref((uv_handle_t*)&h);
236
257
  uv_run(uv_default_loop());
258
+ ASSERT(req_cb_called == 1);
237
259
 
238
260
  return 0;
239
261
  }
@@ -242,7 +264,7 @@ TEST_IMPL(udp_ref3) {
242
264
  TEST_IMPL(pipe_ref) {
243
265
  uv_pipe_t h;
244
266
  uv_pipe_init(uv_default_loop(), &h, 0);
245
- uv_unref(uv_default_loop());
267
+ uv_unref((uv_handle_t*)&h);
246
268
  uv_run(uv_default_loop());
247
269
  return 0;
248
270
  }
@@ -252,7 +274,7 @@ TEST_IMPL(pipe_ref2) {
252
274
  uv_pipe_t h;
253
275
  uv_pipe_init(uv_default_loop(), &h, 0);
254
276
  uv_listen((uv_stream_t*)&h, 128, (uv_connection_cb)fail_cb);
255
- uv_unref(uv_default_loop());
277
+ uv_unref((uv_handle_t*)&h);
256
278
  uv_run(uv_default_loop());
257
279
  return 0;
258
280
  }
@@ -261,10 +283,11 @@ TEST_IMPL(pipe_ref2) {
261
283
  TEST_IMPL(pipe_ref3) {
262
284
  uv_pipe_t h;
263
285
  uv_pipe_init(uv_default_loop(), &h, 0);
264
- uv_pipe_connect(&connect_req, &h, TEST_PIPENAME, (uv_connect_cb)fail_cb);
265
- uv_unref(uv_default_loop());
266
- uv_unref(uv_default_loop()); /* connect req refs the loop */
286
+ uv_pipe_connect(&connect_req, &h, TEST_PIPENAME, connect_and_shutdown);
287
+ uv_unref((uv_handle_t*)&h);
267
288
  uv_run(uv_default_loop());
289
+ ASSERT(connect_cb_called == 1);
290
+ ASSERT(shutdown_cb_called == 1);
268
291
  return 0;
269
292
  }
270
293
 
@@ -272,19 +295,12 @@ TEST_IMPL(pipe_ref3) {
272
295
  TEST_IMPL(pipe_ref4) {
273
296
  uv_pipe_t h;
274
297
  uv_pipe_init(uv_default_loop(), &h, 0);
275
- uv_pipe_connect(&connect_req, &h, TEST_PIPENAME, write_unref_cb);
276
- uv_unref(uv_default_loop());
277
- uv_run(uv_default_loop());
278
- return 0;
279
- }
280
-
281
-
282
- TEST_IMPL(pipe_ref5) {
283
- uv_pipe_t h;
284
- uv_pipe_init(uv_default_loop(), &h, 0);
285
- uv_pipe_connect(&connect_req, &h, TEST_PIPENAME, shutdown_unref_cb);
286
- uv_unref(uv_default_loop());
298
+ uv_pipe_connect(&connect_req, &h, TEST_PIPENAME, connect_and_write);
299
+ uv_unref((uv_handle_t*)&h);
287
300
  uv_run(uv_default_loop());
301
+ ASSERT(connect_cb_called == 1);
302
+ ASSERT(write_cb_called == 1);
303
+ ASSERT(shutdown_cb_called == 1);
288
304
  return 0;
289
305
  }
290
306
 
@@ -312,7 +328,7 @@ TEST_IMPL(process_ref) {
312
328
  r = uv_spawn(uv_default_loop(), &h, options);
313
329
  ASSERT(r == 0);
314
330
 
315
- uv_unref(uv_default_loop());
331
+ uv_unref((uv_handle_t*)&h);
316
332
  uv_run(uv_default_loop());
317
333
 
318
334
  r = uv_process_kill(&h, /* SIGTERM */ 15);
@@ -22,23 +22,27 @@
22
22
  #include "uv.h"
23
23
  #include "task.h"
24
24
 
25
- static idle_counter = 0;
25
+ #define NUM_TICKS 64
26
+
27
+ static uv_idle_t idle_handle;
28
+ static int idle_counter;
29
+
26
30
 
27
31
  static void idle_cb(uv_idle_t* handle, int status) {
28
- ASSERT(handle != NULL);
32
+ ASSERT(handle == &idle_handle);
29
33
  ASSERT(status == 0);
30
- idle_counter ++;
34
+
35
+ if (++idle_counter == NUM_TICKS)
36
+ uv_idle_stop(handle);
31
37
  }
32
38
 
33
39
 
34
40
  TEST_IMPL(run_once) {
35
- int n;
36
- uv_idle_t h;
37
- uv_idle_init(uv_default_loop(), &h);
38
- uv_idle_start(&h, idle_cb);
39
- for (n = 0; n < 500; n++) {
40
- uv_run_once(uv_default_loop());
41
- }
42
- ASSERT(n == 500);
41
+ uv_idle_init(uv_default_loop(), &idle_handle);
42
+ uv_idle_start(&idle_handle, idle_cb);
43
+
44
+ while (uv_run_once(uv_default_loop()));
45
+ ASSERT(idle_counter == NUM_TICKS);
46
+
43
47
  return 0;
44
48
  }
@@ -0,0 +1,111 @@
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
+ #include "uv.h"
23
+ #include "task.h"
24
+
25
+ #include <stdlib.h>
26
+ #include <string.h>
27
+
28
+ typedef struct {
29
+ uv_mutex_t mutex;
30
+ uv_sem_t sem;
31
+ int delay;
32
+ volatile int posted;
33
+ } worker_config;
34
+
35
+
36
+ static void worker(void* arg) {
37
+ worker_config* c = arg;
38
+
39
+ if (c->delay)
40
+ uv_sleep(c->delay);
41
+
42
+ uv_mutex_lock(&c->mutex);
43
+ ASSERT(c->posted == 0);
44
+ uv_sem_post(&c->sem);
45
+ c->posted = 1;
46
+ uv_mutex_unlock(&c->mutex);
47
+ }
48
+
49
+
50
+ TEST_IMPL(semaphore_1) {
51
+ uv_thread_t thread;
52
+ worker_config wc;
53
+
54
+ memset(&wc, 0, sizeof(wc));
55
+
56
+ ASSERT(0 == uv_sem_init(&wc.sem, 0));
57
+ ASSERT(0 == uv_mutex_init(&wc.mutex));
58
+ ASSERT(0 == uv_thread_create(&thread, worker, &wc));
59
+
60
+ uv_sleep(100);
61
+ uv_mutex_lock(&wc.mutex);
62
+ ASSERT(wc.posted == 1);
63
+ uv_sem_wait(&wc.sem); /* should not block */
64
+ uv_mutex_unlock(&wc.mutex); /* ergo, it should be ok to unlock after wait */
65
+
66
+ ASSERT(0 == uv_thread_join(&thread));
67
+ uv_mutex_destroy(&wc.mutex);
68
+ uv_sem_destroy(&wc.sem);
69
+
70
+ return 0;
71
+ }
72
+
73
+
74
+ TEST_IMPL(semaphore_2) {
75
+ uv_thread_t thread;
76
+ worker_config wc;
77
+
78
+ memset(&wc, 0, sizeof(wc));
79
+ wc.delay = 100;
80
+
81
+ ASSERT(0 == uv_sem_init(&wc.sem, 0));
82
+ ASSERT(0 == uv_mutex_init(&wc.mutex));
83
+ ASSERT(0 == uv_thread_create(&thread, worker, &wc));
84
+
85
+ uv_sem_wait(&wc.sem);
86
+
87
+ ASSERT(0 == uv_thread_join(&thread));
88
+ uv_mutex_destroy(&wc.mutex);
89
+ uv_sem_destroy(&wc.sem);
90
+
91
+ return 0;
92
+ }
93
+
94
+
95
+ TEST_IMPL(semaphore_3) {
96
+ uv_sem_t sem;
97
+
98
+ ASSERT(0 == uv_sem_init(&sem, 3));
99
+ uv_sem_wait(&sem); /* should not block */
100
+ uv_sem_wait(&sem); /* should not block */
101
+ ASSERT(0 == uv_sem_trywait(&sem));
102
+ ASSERT(-1 == uv_sem_trywait(&sem));
103
+
104
+ uv_sem_post(&sem);
105
+ ASSERT(0 == uv_sem_trywait(&sem));
106
+ ASSERT(-1 == uv_sem_trywait(&sem));
107
+
108
+ uv_sem_destroy(&sem);
109
+
110
+ return 0;
111
+ }