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
@@ -2,19 +2,46 @@
2
2
  #define AE_HANDLE_COMMON_H
3
3
 
4
4
 
5
- VALUE cAsyncEngineCData;
6
- ID att_cdata;
7
- ID att_handle_terminated;
8
- ID id_method_call;
9
-
10
- void init_ae_handle_common();
11
-
12
- VALUE ae_store_block(VALUE);
13
- VALUE ae_get_block(VALUE);
14
- VALUE ae_remove_block(VALUE);
15
- void ae_manage_exception(int);
16
- void ae_handle_close_callback_0(uv_handle_t*);
17
- int ae_protect_block_call_0(VALUE);
5
+ #define AE_CLOSE_UV_HANDLE(handle) \
6
+ uv_close((uv_handle_t *)handle, ae_uv_handle_close_callback);
7
+
8
+ #define GET_CDATA_FROM_SELF \
9
+ struct_cdata* cdata; \
10
+ Data_Get_Struct(self, struct_cdata, cdata)
11
+
12
+ #define CHECK_UV_HANDLE_IS_OPEN \
13
+ if (! (cdata->_uv_handle)) \
14
+ return Qfalse;
15
+
16
+ #define GET_CDATA_FROM_SELF_AND_CHECK_UV_HANDLE_IS_OPEN \
17
+ GET_CDATA_FROM_SELF; \
18
+ CHECK_UV_HANDLE_IS_OPEN
19
+
20
+
21
+ void init_ae_handle_common(void);
22
+
23
+ VALUE ae_store_handle(VALUE);
24
+ VALUE ae_get_handle(VALUE);
25
+ VALUE ae_remove_handle(VALUE);
26
+
27
+ VALUE ae_store_proc(VALUE);
28
+ VALUE ae_get_proc(VALUE);
29
+ VALUE ae_remove_proc(VALUE);
30
+
31
+ void ae_uv_handle_close_callback(uv_handle_t*);
32
+ int ae_get_last_uv_error_int(void);
33
+ VALUE ae_get_uv_error(int uv_errno);
34
+ VALUE ae_get_last_uv_error(void);
35
+ void ae_raise_uv_error(int uv_errno);
36
+ void ae_raise_last_uv_error(void);
37
+
38
+ VALUE ae_proc_call_0(VALUE proc);
39
+ VALUE ae_proc_call_1(VALUE proc, VALUE param);
40
+ VALUE ae_proc_call_2(VALUE proc, VALUE param1, VALUE param2);
41
+ VALUE ae_proc_call_3(VALUE proc, VALUE param1, VALUE param2, VALUE param3);
42
+
43
+ VALUE ae_run_with_error_handler(void* function, VALUE param);
44
+ VALUE ae_take_gvl_and_run_with_error_handler(void* function);
18
45
 
19
46
 
20
47
  #endif /* AE_HANDLE_COMMON_H */
@@ -0,0 +1,246 @@
1
+ #include "asyncengine_ruby.h"
2
+ #include "ae_handle_common.h"
3
+ #include "ae_ip_utils.h"
4
+
5
+
6
+ /* TODO: Temporary hack: libuv should provide uv_inet_pton and uv_inet_ntop. */
7
+ #ifdef AE_OS_WINDOWS
8
+ #include <inet_net_pton.h>
9
+ #include <inet_ntop.h>
10
+ #define ae_inet_pton ares_inet_pton
11
+ #define ae_inet_ntop ares_inet_ntop
12
+ #else /* AE_OS_UNIX */
13
+ #include <arpa/inet.h>
14
+ #define ae_inet_pton inet_pton
15
+ #define ae_inet_ntop inet_ntop
16
+ #endif
17
+
18
+
19
+ static VALUE mAsyncEngineIpUtils;
20
+
21
+
22
+ void init_ae_ip_utils()
23
+ {
24
+ AE_TRACE();
25
+
26
+ mAsyncEngineIpUtils = rb_define_module_under(mAsyncEngine, "IpUtils");
27
+
28
+ rb_define_module_function(mAsyncEngineIpUtils, "ip_type", AsyncEngineIpUtils_ip_type, 1);
29
+ rb_define_module_function(mAsyncEngineIpUtils, "compare_ips", AsyncEngineIpUtils_compare_ips, -1);
30
+
31
+ symbol_ipv4 = ID2SYM(rb_intern("ipv4"));
32
+ symbol_ipv6 = ID2SYM(rb_intern("ipv6"));
33
+ symbol_ipv6_reference = ID2SYM(rb_intern("ipv6_reference"));
34
+ }
35
+
36
+
37
+ VALUE AsyncEngineIpUtils_ip_type(VALUE self, VALUE _rb_str)
38
+ {
39
+ AE_TRACE();
40
+
41
+ char *str;
42
+ long len;
43
+
44
+ if (TYPE(_rb_str) != T_STRING)
45
+ rb_raise(rb_eTypeError, "argument must be a String");
46
+
47
+ str = RSTRING_PTR(_rb_str);
48
+ len = RSTRING_LEN(_rb_str);
49
+
50
+ switch(ae_ip_parser_execute(str, len)) {
51
+ case(ip_type_ipv4):
52
+ return symbol_ipv4;
53
+ break;
54
+ case(ip_type_ipv6):
55
+ return symbol_ipv6;
56
+ break;
57
+ case(ip_type_ipv6_reference):
58
+ return symbol_ipv6_reference;
59
+ break;
60
+ default:
61
+ return Qfalse;
62
+ break;
63
+ }
64
+ }
65
+
66
+
67
+ /*
68
+ * Return 1 if both pure IP's are equal, 0 otherwise.
69
+ */
70
+ static
71
+ int compare_pure_ips(char *ip1, size_t len1, enum_ip_type ip1_type, char *ip2, size_t len2, enum_ip_type ip2_type)
72
+ {
73
+ AE_TRACE();
74
+
75
+ struct in_addr in_addr1, in_addr2;
76
+ struct in6_addr in6_addr1, in6_addr2;
77
+ //INET6_ADDRSTRLEN = 46
78
+ char _ip1[46], _ip2[46];
79
+
80
+ // Not same IP type, return false.
81
+ if (ip1_type != ip2_type)
82
+ return 0;
83
+
84
+ memcpy(_ip1, ip1, len1);
85
+ _ip1[len1] = '\0';
86
+ memcpy(_ip2, ip2, len2);
87
+ _ip2[len2] = '\0';
88
+
89
+ switch(ip1_type) {
90
+ // Comparing IPv4 with IPv4.
91
+ case(ip_type_ipv4):
92
+ if (ae_inet_pton(AF_INET, _ip1, &in_addr1) == 0) return 0;
93
+ if (ae_inet_pton(AF_INET, _ip2, &in_addr2) == 0) return 0;
94
+ if (in_addr1.s_addr == in_addr2.s_addr)
95
+ return 1;
96
+ else
97
+ return 0;
98
+ break;
99
+ // Comparing IPv6 with IPv6.
100
+ case(ip_type_ipv6):
101
+ if (ae_inet_pton(AF_INET6, _ip1, &in6_addr1) != 1) return 0;
102
+ if (ae_inet_pton(AF_INET6, _ip2, &in6_addr2) != 1) return 0;
103
+ if (memcmp(in6_addr1.s6_addr, in6_addr2.s6_addr, sizeof(in6_addr1.s6_addr)) == 0)
104
+ return 1;
105
+ else
106
+ return 0;
107
+ break;
108
+ default:
109
+ return 0;
110
+ break;
111
+ }
112
+ }
113
+
114
+
115
+ /*
116
+ * Returns true if both IP's are equal (binary comparison). It allows comparison
117
+ * between IPv4, IPv6 and IPv6 references.
118
+ * Returns true when comparing an IPv6 with its IPv6 reference in case
119
+ * parameter _allow_ipv6_reference_ is set to true, it returns false otherwise.
120
+ *
121
+ * Returns nil if at least one of the IP's is not valid IPv4, IPv6 or IPv6 reference.
122
+ */
123
+ VALUE AsyncEngineIpUtils_compare_ips(int argc, VALUE *argv, VALUE self)
124
+ {
125
+ AE_TRACE();
126
+
127
+ char *str1, *str2;
128
+ long len1, len2;
129
+ enum_ip_type ip1_type, ip2_type;
130
+ int allow_ipv6_reference = 0;
131
+ int ipv6_references_found = 0;
132
+
133
+ AE_RB_CHECK_NUM_ARGS(2,3);
134
+
135
+ if (! RB_TYPE_P(argv[0], T_STRING) || ! RB_TYPE_P(argv[1], T_STRING))
136
+ rb_raise(rb_eTypeError, "first and second arguments must be String");
137
+
138
+ if (argc == 3 && RB_TYPE_P(argv[2], T_TRUE))
139
+ allow_ipv6_reference = 1;
140
+
141
+ str1 = RSTRING_PTR(argv[0]);
142
+ len1 = RSTRING_LEN(argv[0]);
143
+ str2 = RSTRING_PTR(argv[1]);
144
+ len2 = RSTRING_LEN(argv[1]);
145
+
146
+ switch(ip1_type = ae_ip_parser_execute(str1, len1)) {
147
+ case(ip_type_no_ip):
148
+ return Qnil;
149
+ break;
150
+ case(ip_type_ipv6_reference):
151
+ ipv6_references_found++;
152
+ str1 += 1;
153
+ len1 -= 2;
154
+ ip1_type = ip_type_ipv6;
155
+ break;
156
+ default:
157
+ break;
158
+ }
159
+ switch(ip2_type = ae_ip_parser_execute(str2, len2)) {
160
+ case(ip_type_no_ip):
161
+ return Qnil;
162
+ break;
163
+ case(ip_type_ipv6_reference):
164
+ ipv6_references_found++;
165
+ str2 += 1;
166
+ len2 -= 2;
167
+ ip2_type = ip_type_ipv6;
168
+ break;
169
+ default:
170
+ break;
171
+ }
172
+
173
+ if (ipv6_references_found == 1 && allow_ipv6_reference == 0)
174
+ return Qfalse;
175
+
176
+ if (compare_pure_ips(str1, len1, ip1_type, str2, len2, ip2_type))
177
+ return Qtrue;
178
+ else
179
+ return Qfalse;
180
+ }
181
+
182
+
183
+ int ae_ip_utils_is_valid_port(int port)
184
+ {
185
+ AE_TRACE();
186
+
187
+ if (port >= 0 && port <= 65535)
188
+ return 1;
189
+ else
190
+ return 0;
191
+ }
192
+
193
+
194
+ VALUE ae_ip_utils_get_ip_port(struct sockaddr_storage *addr, enum_ip_type ip_type)
195
+ {
196
+ AE_TRACE();
197
+
198
+ struct sockaddr_in *addr4;
199
+ struct sockaddr_in6 *addr6;
200
+ char ip[INET6_ADDRSTRLEN + 1];
201
+ int port;
202
+ VALUE _rb_array_ip_port;
203
+
204
+ switch(ip_type) {
205
+ case ip_type_ipv4:
206
+ addr4 = (struct sockaddr_in*)addr;
207
+ AE_ASSERT(ae_inet_ntop(AF_INET, &addr4->sin_addr, ip, INET_ADDRSTRLEN));
208
+ port = (int)htons(addr4->sin_port);
209
+ break;
210
+ case ip_type_ipv6:
211
+ addr6 = (struct sockaddr_in6*)addr;
212
+ AE_ASSERT(ae_inet_ntop(AF_INET6, &addr6->sin6_addr, ip, INET6_ADDRSTRLEN));
213
+ port = (int)htons(addr6->sin6_port);
214
+ break;
215
+ default:
216
+ AE_ASSERT("invalid ip_type");
217
+ }
218
+
219
+ _rb_array_ip_port = rb_ary_new2(2);
220
+ rb_ary_store(_rb_array_ip_port, 0, rb_str_new2(ip));
221
+ rb_ary_store(_rb_array_ip_port, 1, INT2FIX(port));
222
+
223
+ return _rb_array_ip_port;
224
+ }
225
+
226
+
227
+ VALUE ae_ip_type_to_rb_symbol(enum_ip_type ip_type)
228
+ {
229
+ AE_TRACE();
230
+
231
+ switch(ip_type) {
232
+ case ip_type_ipv4:
233
+ return symbol_ipv4;
234
+ break;
235
+ case ip_type_ipv6:
236
+ return symbol_ipv6;
237
+ break;
238
+ case ip_type_ipv6_reference:
239
+ return symbol_ipv6_reference;
240
+ break;
241
+ case ip_type_no_ip:
242
+ return Qnil;
243
+ default:
244
+ AE_ABORT("invalid enum_ip_type %d", ip_type);
245
+ }
246
+ }
@@ -0,0 +1,25 @@
1
+ #ifndef AE_IP_UTILS_H
2
+ #define AE_IP_UTILS_H
3
+
4
+
5
+ #include "ip_parser.h"
6
+
7
+
8
+ /* Exported Ruby symbols. */
9
+
10
+ VALUE symbol_ipv4;
11
+ VALUE symbol_ipv6;
12
+ VALUE symbol_ipv6_reference;
13
+
14
+
15
+ void init_ae_ip_utils(void);
16
+
17
+ VALUE AsyncEngineIpUtils_ip_type(VALUE self, VALUE _rb_str);
18
+ VALUE AsyncEngineIpUtils_compare_ips(int argc, VALUE *argv, VALUE self);
19
+
20
+ int ae_ip_utils_is_valid_port(int port);
21
+ VALUE ae_ip_utils_get_ip_port(struct sockaddr_storage *addr, enum_ip_type ip_type);
22
+ VALUE ae_ip_type_to_rb_symbol(enum_ip_type ip_type);
23
+
24
+
25
+ #endif /* AE_IP_UTILS_H */
@@ -3,49 +3,109 @@
3
3
  #include "ae_next_tick.h"
4
4
 
5
5
 
6
- // C variable indicating whether there are pending next_ticks.
7
- static int pending_next_ticks;
6
+ static ID att_next_tick_procs;
8
7
 
9
- static ID id_method_execute_next_ticks;
8
+ static uv_idle_t* ae_next_tick_uv_idle;
10
9
 
11
10
 
12
- void init_ae_next_tick()
11
+ /** Pre-declaration of static functions. */
12
+
13
+ static void _uv_idle_callback(uv_idle_t* handle, int status);
14
+ static VALUE _ae_idle_callback(void);
15
+
16
+
17
+ void init_ae_next_tick(void)
13
18
  {
14
- pending_next_ticks = 0;
19
+ AE_TRACE();
20
+
21
+ rb_define_module_function(mAsyncEngine, "next_tick", AsyncEngine_next_tick, -1);
15
22
 
16
- rb_define_module_function(mAsyncEngine, "_c_next_tick", AsyncEngine_c_next_tick, 0);
23
+ att_next_tick_procs = rb_intern("@_next_tick_procs");
17
24
 
18
- id_method_execute_next_ticks = rb_intern("execute_next_ticks");
25
+ ae_next_tick_uv_idle = NULL;
26
+ }
27
+
28
+
29
+ void load_ae_next_tick_uv_idle(void)
30
+ {
31
+ AE_TRACE();
32
+ int r;
33
+
34
+ AE_ASSERT(ae_next_tick_uv_idle == NULL);
35
+
36
+ ae_next_tick_uv_idle = ALLOC(uv_idle_t);
37
+ r = uv_idle_init(AE_uv_loop, ae_next_tick_uv_idle);
38
+ AE_ASSERT(r == 0);
39
+ }
40
+
41
+
42
+ void unload_ae_next_tick_uv_idle(void)
43
+ {
44
+ AE_TRACE();
45
+
46
+ AE_ASSERT(ae_next_tick_uv_idle != NULL);
47
+
48
+ AE_CLOSE_UV_HANDLE(ae_next_tick_uv_idle);
49
+ ae_next_tick_uv_idle = NULL;
19
50
  }
20
51
 
21
52
 
22
53
  static
23
- void execute_next_tick_with_gvl()
54
+ VALUE AsyncEngine_next_tick(int argc, VALUE *argv, VALUE self)
24
55
  {
25
56
  AE_TRACE();
26
- rb_funcall(mAsyncEngine, id_method_execute_next_ticks, 0, 0);
57
+ VALUE proc;
58
+ int r;
59
+
60
+ AE_ASSERT(ae_next_tick_uv_idle != NULL);
61
+
62
+ AE_CHECK_STATUS();
63
+ AE_RB_CHECK_NUM_ARGS(0,1);
64
+ AE_RB_ENSURE_BLOCK_OR_PROC(1, proc);
65
+
66
+ rb_ary_push(rb_ivar_get(mAsyncEngine, att_next_tick_procs), proc);
67
+ if (! uv_is_active((uv_handle_t *)ae_next_tick_uv_idle)) {
68
+ r = uv_idle_start(ae_next_tick_uv_idle, _uv_idle_callback);
69
+ AE_ASSERT(r == 0);
70
+ }
71
+
72
+ return Qtrue;
27
73
  }
28
74
 
29
75
 
30
76
  static
31
- void next_tick_callback(uv_idle_t* handle, int status)
77
+ void _uv_idle_callback(uv_idle_t* handle, int status)
32
78
  {
33
79
  AE_TRACE();
80
+
34
81
  uv_idle_stop(handle);
35
- uv_close((uv_handle_t *)handle, ae_handle_close_callback_0);
36
- pending_next_ticks = 0;
37
- rb_thread_call_with_gvl(execute_next_tick_with_gvl, NULL);
82
+ ae_take_gvl_and_run_with_error_handler(_ae_idle_callback);
38
83
  }
39
84
 
40
85
 
41
- VALUE AsyncEngine_c_next_tick(VALUE self)
86
+ static
87
+ VALUE _ae_idle_callback(void)
42
88
  {
43
89
  AE_TRACE();
44
- if (pending_next_ticks == 0) {
45
- uv_idle_t* _uv_handle = ALLOC(uv_idle_t);
46
- uv_idle_init(uv_default_loop(), _uv_handle);
47
- pending_next_ticks = 1;
48
- uv_idle_start(_uv_handle, next_tick_callback);
90
+ VALUE procs;
91
+ long i;
92
+
93
+ AE_ASSERT(AE_status == AE_RUNNING);
94
+
95
+ // procs = @_next_tick_procs
96
+ procs = rb_ivar_get(mAsyncEngine, att_next_tick_procs);
97
+ // @_next_tick_procs = []
98
+ rb_ivar_set(mAsyncEngine, att_next_tick_procs, rb_ary_new());
99
+
100
+ // Iterate procs Array and call each proc.
101
+ for(i=0 ; i<RARRAY_LEN(procs) ; i++) {
102
+ // It could occur that one of these procs is a release_loop() method, so
103
+ // stop iterating.
104
+ if (AE_status != AE_RUNNING)
105
+ break;
106
+ ae_run_with_error_handler(ae_proc_call_0, rb_ary_entry(procs, i));
49
107
  }
50
- return Qtrue;
51
- }
108
+ procs = Qnil;
109
+
110
+ return Qnil;
111
+ }