asyncengine 0.0.1.testing1 → 0.0.2.alpha1

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -100,7 +100,7 @@ static void connect_cb(uv_connect_t* req, int status) {
100
100
  r = uv_write(&(wr->req), req->handle, &wr->buf, 1, write_cb);
101
101
  ASSERT(r == 0);
102
102
 
103
- if (req->handle->write_queue_size > 0) {
103
+ if (req->handle->write_queue_size >= size * 2) {
104
104
  break;
105
105
  }
106
106
  }
@@ -161,7 +161,7 @@ TEST_IMPL(tcp_write_error) {
161
161
  ASSERT(r == 0);
162
162
 
163
163
  ASSERT(write_cb_called > 0);
164
- ASSERT(write_cb_error_called == 1);
164
+ ASSERT(write_cb_error_called >= 1);
165
165
  ASSERT(tcp_client.write_queue_size == 0);
166
166
 
167
167
  return 0;
@@ -31,32 +31,28 @@
31
31
 
32
32
  #define TOTAL_BYTES (WRITES * CHUNKS_PER_WRITE * CHUNK_SIZE)
33
33
 
34
-
35
34
  static char* send_buffer;
36
35
 
37
-
38
36
  static int shutdown_cb_called = 0;
39
37
  static int connect_cb_called = 0;
40
38
  static int write_cb_called = 0;
41
39
  static int close_cb_called = 0;
42
- static int bytes_sent = 0;
43
- static int bytes_sent_done = 0;
44
- static int bytes_received_done = 0;
40
+ static size_t bytes_sent = 0;
41
+ static size_t bytes_sent_done = 0;
42
+ static size_t bytes_received_done = 0;
43
+
44
+ static uv_connect_t connect_req;
45
+ static uv_shutdown_t shutdown_req;
46
+ static uv_write_t write_reqs[WRITES];
45
47
 
46
48
 
47
49
  static uv_buf_t alloc_cb(uv_handle_t* handle, size_t size) {
48
- uv_buf_t buf;
49
- buf.base = (char*)malloc(size);
50
- buf.len = size;
51
- return buf;
50
+ return uv_buf_init(malloc(size), size);
52
51
  }
53
52
 
54
53
 
55
54
  static void close_cb(uv_handle_t* handle) {
56
55
  ASSERT(handle != NULL);
57
-
58
- free(handle);
59
-
60
56
  close_cb_called++;
61
57
  }
62
58
 
@@ -64,7 +60,7 @@ static void close_cb(uv_handle_t* handle) {
64
60
  static void shutdown_cb(uv_shutdown_t* req, int status) {
65
61
  uv_tcp_t* tcp;
66
62
 
67
- ASSERT(req);
63
+ ASSERT(req == &shutdown_req);
68
64
  ASSERT(status == 0);
69
65
 
70
66
  tcp = (uv_tcp_t*)(req->handle);
@@ -77,28 +73,21 @@ static void shutdown_cb(uv_shutdown_t* req, int status) {
77
73
 
78
74
  /* We should have had all the writes called already. */
79
75
  ASSERT(write_cb_called == WRITES);
80
-
81
- free(req);
82
76
  }
83
77
 
84
78
 
85
79
  static void read_cb(uv_stream_t* tcp, ssize_t nread, uv_buf_t buf) {
86
80
  ASSERT(tcp != NULL);
87
81
 
88
- if (nread < 0) {
82
+ if (nread >= 0) {
83
+ bytes_received_done += nread;
84
+ }
85
+ else {
89
86
  ASSERT(uv_last_error(uv_default_loop()).code == UV_EOF);
90
87
  printf("GOT EOF\n");
91
-
92
- if (buf.base) {
93
- free(buf.base);
94
- }
95
-
96
88
  uv_close((uv_handle_t*)tcp, close_cb);
97
- return;
98
89
  }
99
90
 
100
- bytes_received_done += nread;
101
-
102
91
  free(buf.base);
103
92
  }
104
93
 
@@ -114,71 +103,55 @@ static void write_cb(uv_write_t* req, int status) {
114
103
 
115
104
  bytes_sent_done += CHUNKS_PER_WRITE * CHUNK_SIZE;
116
105
  write_cb_called++;
117
-
118
- free(req);
119
106
  }
120
107
 
121
108
 
122
109
  static void connect_cb(uv_connect_t* req, int status) {
123
110
  uv_buf_t send_bufs[CHUNKS_PER_WRITE];
124
- uv_tcp_t* tcp;
125
- uv_write_t* write_req;
126
- uv_shutdown_t* shutdown_req;
111
+ uv_stream_t* stream;
127
112
  int i, j, r;
128
113
 
129
- ASSERT(req != NULL);
114
+ ASSERT(req == &connect_req);
130
115
  ASSERT(status == 0);
131
116
 
132
- tcp = (uv_tcp_t*)req->handle;
133
-
117
+ stream = req->handle;
134
118
  connect_cb_called++;
135
- free(req);
136
119
 
137
120
  /* Write a lot of data */
138
121
  for (i = 0; i < WRITES; i++) {
122
+ uv_write_t* write_req = write_reqs + i;
123
+
139
124
  for (j = 0; j < CHUNKS_PER_WRITE; j++) {
140
- send_bufs[j].len = CHUNK_SIZE;
141
- send_bufs[j].base = send_buffer + bytes_sent;
125
+ send_bufs[j] = uv_buf_init(send_buffer + bytes_sent, CHUNK_SIZE);
142
126
  bytes_sent += CHUNK_SIZE;
143
127
  }
144
128
 
145
- write_req = malloc(sizeof(uv_write_t));
146
- ASSERT(write_req != NULL);
147
-
148
- r = uv_write(write_req, (uv_stream_t*) tcp, (uv_buf_t*)&send_bufs,
149
- CHUNKS_PER_WRITE, write_cb);
129
+ r = uv_write(write_req, stream, send_bufs, CHUNKS_PER_WRITE, write_cb);
150
130
  ASSERT(r == 0);
151
131
  }
152
132
 
153
- /* Shutdown on drain. FIXME: dealloc req? */
154
- shutdown_req = malloc(sizeof(uv_shutdown_t));
155
- ASSERT(shutdown_req != NULL);
156
- r = uv_shutdown(shutdown_req, (uv_stream_t*)tcp, shutdown_cb);
133
+ /* Shutdown on drain. */
134
+ r = uv_shutdown(&shutdown_req, stream, shutdown_cb);
157
135
  ASSERT(r == 0);
158
136
 
159
137
  /* Start reading */
160
- r = uv_read_start((uv_stream_t*)tcp, alloc_cb, read_cb);
138
+ r = uv_read_start(stream, alloc_cb, read_cb);
161
139
  ASSERT(r == 0);
162
140
  }
163
141
 
164
142
 
165
143
  TEST_IMPL(tcp_writealot) {
166
144
  struct sockaddr_in addr = uv_ip4_addr("127.0.0.1", TEST_PORT);
167
- uv_tcp_t* client = (uv_tcp_t*)malloc(sizeof *client);
168
- uv_connect_t* connect_req = malloc(sizeof(uv_connect_t));
145
+ uv_tcp_t client;
169
146
  int r;
170
147
 
171
- ASSERT(client != NULL);
172
- ASSERT(connect_req != NULL);
173
-
174
- send_buffer = (char*)malloc(TOTAL_BYTES + 1);
175
-
148
+ send_buffer = malloc(TOTAL_BYTES);
176
149
  ASSERT(send_buffer != NULL);
177
150
 
178
- r = uv_tcp_init(uv_default_loop(), client);
151
+ r = uv_tcp_init(uv_default_loop(), &client);
179
152
  ASSERT(r == 0);
180
153
 
181
- r = uv_tcp_connect(connect_req, client, addr, connect_cb);
154
+ r = uv_tcp_connect(&connect_req, &client, addr, connect_cb);
182
155
  ASSERT(r == 0);
183
156
 
184
157
  uv_run(uv_default_loop());
@@ -191,5 +164,7 @@ TEST_IMPL(tcp_writealot) {
191
164
  ASSERT(bytes_sent_done == TOTAL_BYTES);
192
165
  ASSERT(bytes_received_done == TOTAL_BYTES);
193
166
 
167
+ free(send_buffer);
168
+
194
169
  return 0;
195
170
  }
@@ -104,7 +104,7 @@ TEST_IMPL(timer_again) {
104
104
  r = uv_timer_again(&dummy);
105
105
  ASSERT(r == -1);
106
106
  ASSERT(uv_last_error(uv_default_loop()).code == UV_EINVAL);
107
- uv_unref(uv_default_loop());
107
+ uv_unref((uv_handle_t*)&dummy);
108
108
 
109
109
  /* Start timer repeat_1. */
110
110
  r = uv_timer_init(uv_default_loop(), &repeat_1);
@@ -35,6 +35,7 @@ static void once_close_cb(uv_handle_t* handle) {
35
35
  printf("ONCE_CLOSE_CB\n");
36
36
 
37
37
  ASSERT(handle != NULL);
38
+ ASSERT(!uv_is_active(handle));
38
39
 
39
40
  once_close_cb_called++;
40
41
  }
@@ -45,6 +46,7 @@ static void once_cb(uv_timer_t* handle, int status) {
45
46
 
46
47
  ASSERT(handle != NULL);
47
48
  ASSERT(status == 0);
49
+ ASSERT(!uv_is_active((uv_handle_t*)handle));
48
50
 
49
51
  once_cb_called++;
50
52
 
@@ -69,6 +71,7 @@ static void repeat_cb(uv_timer_t* handle, int status) {
69
71
 
70
72
  ASSERT(handle != NULL);
71
73
  ASSERT(status == 0);
74
+ ASSERT(uv_is_active((uv_handle_t*)handle));
72
75
 
73
76
  repeat_cb_called++;
74
77
 
@@ -114,7 +117,7 @@ TEST_IMPL(timer) {
114
117
  ASSERT(r == 0);
115
118
  r = uv_timer_stop(&never);
116
119
  ASSERT(r == 0);
117
- uv_unref(uv_default_loop());
120
+ uv_unref((uv_handle_t*)&never);
118
121
 
119
122
  uv_run(uv_default_loop());
120
123
 
@@ -128,3 +131,22 @@ TEST_IMPL(timer) {
128
131
 
129
132
  return 0;
130
133
  }
134
+
135
+
136
+ TEST_IMPL(timer_start_twice) {
137
+ uv_timer_t once;
138
+ int r;
139
+
140
+ r = uv_timer_init(uv_default_loop(), &once);
141
+ ASSERT(r == 0);
142
+ r = uv_timer_start(&once, never_cb, 86400 * 1000, 0);
143
+ ASSERT(r == 0);
144
+ r = uv_timer_start(&once, once_cb, 10, 0);
145
+ ASSERT(r == 0);
146
+ r = uv_run(uv_default_loop());
147
+ ASSERT(r == 0);
148
+
149
+ ASSERT(once_cb_called == 1);
150
+
151
+ return 0;
152
+ }
@@ -38,7 +38,7 @@ TEST_IMPL(udp_options) {
38
38
  r = uv_udp_init(loop, &h);
39
39
  ASSERT(r == 0);
40
40
 
41
- uv_unref(loop); /* don't keep the loop alive */
41
+ uv_unref((uv_handle_t*)&h); /* don't keep the loop alive */
42
42
 
43
43
  r = uv_udp_bind(&h, uv_ip4_addr("0.0.0.0", TEST_PORT), 0);
44
44
  ASSERT(r == 0);
@@ -21,70 +21,57 @@
21
21
 
22
22
  #include "uv.h"
23
23
  #include "task.h"
24
+
24
25
  #include <stdio.h>
25
26
  #include <stdlib.h>
26
27
 
28
+ static char magic_cookie[] = "magic cookie";
29
+ static int seen_timer_handle;
30
+ static uv_timer_t timer;
27
31
 
28
- static uv_idle_t idle;
29
-
30
- static const int max_opened = 10000;
31
- static const int max_delta = 4000;
32
-
33
- static int opened = 0;
34
- static int closed = 0;
35
-
36
-
37
- void work_cb(uv_work_t* work) {
38
- /* continue as fast as possible */
39
- }
40
-
41
-
42
- void after_work_cb(uv_work_t* work) {
43
- free(work);
44
- closed++;
45
- }
46
-
47
-
48
- void make_eio_req(void) {
49
- uv_work_t* w;
50
-
51
- opened++;
52
32
 
53
- w = (uv_work_t*) malloc(sizeof(*w));
54
- ASSERT(w != NULL);
33
+ static void walk_cb(uv_handle_t* handle, void* arg) {
34
+ ASSERT(arg == (void*)magic_cookie);
55
35
 
56
- uv_queue_work(uv_default_loop(), w, work_cb, after_work_cb);
36
+ if (handle == (uv_handle_t*)&timer) {
37
+ seen_timer_handle++;
38
+ } else {
39
+ ASSERT(0 && "unexpected handle");
40
+ }
57
41
  }
58
42
 
59
43
 
60
- void idle_cb(uv_idle_t* idle, int status) {
61
- ASSERT(opened - closed < max_delta);
62
- if (opened <= max_opened) {
63
- int i;
64
- for (i = 0; i < 30; i++) {
65
- make_eio_req();
66
- }
67
- } else {
68
- int r;
44
+ static void timer_cb(uv_timer_t* handle, int status) {
45
+ ASSERT(handle == &timer);
46
+ ASSERT(status == 0);
69
47
 
70
- r = uv_idle_stop(idle);
71
- uv_unref(uv_default_loop());
72
- ASSERT(r == 0);
73
- }
48
+ uv_walk(handle->loop, walk_cb, magic_cookie);
49
+ uv_close((uv_handle_t*)handle, NULL);
74
50
  }
75
51
 
76
52
 
77
- TEST_IMPL(eio_overflow) {
53
+ TEST_IMPL(walk_handles) {
54
+ uv_loop_t* loop;
78
55
  int r;
79
56
 
80
- r = uv_idle_init(uv_default_loop(), &idle);
57
+ loop = uv_default_loop();
58
+
59
+ r = uv_timer_init(loop, &timer);
81
60
  ASSERT(r == 0);
82
61
 
83
- r = uv_idle_start(&idle, idle_cb);
62
+ r = uv_timer_start(&timer, timer_cb, 1, 0);
84
63
  ASSERT(r == 0);
85
64
 
86
- r = uv_run(uv_default_loop());
65
+ /* Start event loop, expect to see the timer handle in walk_cb. */
66
+ ASSERT(seen_timer_handle == 0);
67
+ r = uv_run(loop);
87
68
  ASSERT(r == 0);
69
+ ASSERT(seen_timer_handle == 1);
70
+
71
+ /* Loop is finished, walk_cb should not see our timer handle. */
72
+ seen_timer_handle = 0;
73
+ uv_walk(loop, walk_cb, magic_cookie);
74
+ ASSERT(seen_timer_handle == 0);
88
75
 
89
76
  return 0;
90
77
  }
@@ -47,6 +47,10 @@
47
47
  'include/ares.h',
48
48
  'include/ares_version.h',
49
49
  'include/uv.h',
50
+ 'include/uv-private/ngx-queue.h',
51
+ 'include/uv-private/tree.h',
52
+ 'src/cares.c',
53
+ 'src/fs-poll.c',
50
54
  'src/uv-common.c',
51
55
  'src/uv-common.h',
52
56
  'src/ares/ares_cancel.c',
@@ -125,7 +129,6 @@
125
129
  '_GNU_SOURCE',
126
130
  ],
127
131
  'sources': [
128
- 'include/uv-private/tree.h',
129
132
  'include/uv-private/uv-win.h',
130
133
  'src/ares/config_win32/ares_config.h',
131
134
  'src/ares/windows_port.c',
@@ -133,7 +136,6 @@
133
136
  'src/ares/ares_iphlpapi.h',
134
137
  'src/ares/ares_platform.c',
135
138
  'src/win/async.c',
136
- 'src/win/cares.c',
137
139
  'src/win/core.c',
138
140
  'src/win/dl.c',
139
141
  'src/win/error.c',
@@ -141,13 +143,18 @@
141
143
  'src/win/fs-event.c',
142
144
  'src/win/getaddrinfo.c',
143
145
  'src/win/handle.c',
146
+ 'src/win/handle-inl.h',
144
147
  'src/win/internal.h',
145
148
  'src/win/loop-watcher.c',
146
149
  'src/win/pipe.c',
147
150
  'src/win/thread.c',
151
+ 'src/win/poll.c',
148
152
  'src/win/process.c',
153
+ 'src/win/process-stdio.c',
149
154
  'src/win/req.c',
155
+ 'src/win/req-inl.h',
150
156
  'src/win/stream.c',
157
+ 'src/win/stream-inl.h',
151
158
  'src/win/tcp.c',
152
159
  'src/win/tty.c',
153
160
  'src/win/threadpool.c',
@@ -178,11 +185,8 @@
178
185
  'sources': [
179
186
  'include/uv-private/eio.h',
180
187
  'include/uv-private/ev.h',
181
- 'include/uv-private/ngx-queue.h',
182
188
  'include/uv-private/uv-unix.h',
183
189
  'src/unix/async.c',
184
- 'src/unix/cares.c',
185
- 'src/unix/check.c',
186
190
  'src/unix/core.c',
187
191
  'src/unix/dl.c',
188
192
  'src/unix/eio/ecb.h',
@@ -194,11 +198,11 @@
194
198
  'src/unix/ev/ev_wrap.h',
195
199
  'src/unix/ev/event.h',
196
200
  'src/unix/fs.c',
197
- 'src/unix/idle.c',
198
201
  'src/unix/internal.h',
199
202
  'src/unix/loop.c',
203
+ 'src/unix/loop-watcher.c',
200
204
  'src/unix/pipe.c',
201
- 'src/unix/prepare.c',
205
+ 'src/unix/poll.c',
202
206
  'src/unix/process.c',
203
207
  'src/unix/stream.c',
204
208
  'src/unix/tcp.c',
@@ -229,7 +233,7 @@
229
233
  [ 'OS=="linux"', {
230
234
  'include_dirs': [ 'src/ares/config_linux' ],
231
235
  'sources': [
232
- 'src/unix/linux/core.c',
236
+ 'src/unix/linux/linux-core.c',
233
237
  'src/unix/linux/inotify.c',
234
238
  'src/unix/linux/syscalls.c',
235
239
  'src/unix/linux/syscalls.h',
@@ -302,10 +306,10 @@
302
306
  'test/test-async.c',
303
307
  'test/test-error.c',
304
308
  'test/test-callback-stack.c',
309
+ 'test/test-callback-order.c',
305
310
  'test/test-connection-fail.c',
306
311
  'test/test-cwd-and-chdir.c',
307
312
  'test/test-delayed-accept.c',
308
- 'test/test-eio-overflow.c',
309
313
  'test/test-fail-always.c',
310
314
  'test/test-fs.c',
311
315
  'test/test-fs-event.c',
@@ -320,23 +324,33 @@
320
324
  'test/test-ipc-send-recv.c',
321
325
  'test/test-list.h',
322
326
  'test/test-loop-handles.c',
327
+ 'test/test-walk-handles.c',
323
328
  'test/test-multiple-listen.c',
324
329
  'test/test-pass-always.c',
325
330
  'test/test-ping-pong.c',
326
331
  'test/test-pipe-bind-error.c',
327
332
  'test/test-pipe-connect-error.c',
328
333
  'test/test-platform-output.c',
334
+ 'test/test-poll.c',
335
+ 'test/test-poll-close.c',
329
336
  'test/test-process-title.c',
330
337
  'test/test-ref.c',
338
+ 'test/test-run-once.c',
339
+ 'test/test-semaphore.c',
331
340
  'test/test-shutdown-close.c',
332
341
  'test/test-shutdown-eof.c',
333
342
  'test/test-spawn.c',
343
+ 'test/test-fs-poll.c',
334
344
  'test/test-stdio-over-pipes.c',
335
345
  'test/test-tcp-bind-error.c',
336
346
  'test/test-tcp-bind6-error.c',
337
347
  'test/test-tcp-close.c',
348
+ 'test/test-tcp-close-while-connecting.c',
349
+ 'test/test-tcp-connect-error-after-write.c',
350
+ 'test/test-tcp-shutdown-after-write.c',
338
351
  'test/test-tcp-flags.c',
339
352
  'test/test-tcp-connect-error.c',
353
+ 'test/test-tcp-connect-timeout.c',
340
354
  'test/test-tcp-connect6-error.c',
341
355
  'test/test-tcp-write-error.c',
342
356
  'test/test-tcp-write-to-half-open-connection.c',
@@ -390,8 +404,11 @@
390
404
  'dependencies': [ 'uv' ],
391
405
  'sources': [
392
406
  'test/benchmark-ares.c',
407
+ 'test/benchmark-fs-stat.c',
393
408
  'test/benchmark-getaddrinfo.c',
394
409
  'test/benchmark-list.h',
410
+ 'test/benchmark-loop-count.c',
411
+ 'test/benchmark-million-timers.c',
395
412
  'test/benchmark-ping-pongs.c',
396
413
  'test/benchmark-pound.c',
397
414
  'test/benchmark-pump.c',