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
@@ -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
+ }