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
@@ -0,0 +1,54 @@
1
+ #include <ruby.h>
2
+ #include <ruby/encoding.h>
3
+ #include "debug.h"
4
+ #include "rb_utilities.h"
5
+
6
+
7
+ void init_rb_utilities(void)
8
+ {
9
+ AE_TRACE();
10
+
11
+ symbol_encoding_external = ID2SYM(rb_intern("external"));
12
+ symbol_encoding_utf8 = ID2SYM(rb_intern("utf8"));
13
+ symbol_encoding_ascii = ID2SYM(rb_intern("ascii"));
14
+ }
15
+
16
+
17
+ VALUE ae_rb_str_new(char* s, long len, enum_string_encoding enc, int tainted)
18
+ {
19
+ AE_TRACE();
20
+
21
+ switch(enc) {
22
+ case string_encoding_external:
23
+ return ( tainted ? AE_RB_STR_TAINTED_EXTERNAL_NEW(s, len) : AE_RB_STR_EXTERNAL_NEW(s, len) );
24
+ break;
25
+ case string_encoding_utf8:
26
+ return ( tainted ? AE_RB_STR_TAINTED_UTF8_NEW(s, len) : AE_RB_STR_UTF8_NEW(s, len) );
27
+ break;
28
+ case string_encoding_ascii:
29
+ return ( tainted ? AE_RB_STR_TAINTED_ASCII_NEW(s, len) : AE_RB_STR_ASCII_NEW(s, len) );
30
+ break;
31
+ default:
32
+ AE_ABORT("invalid enum_string_encoding %d", enc);
33
+ }
34
+ }
35
+
36
+
37
+ VALUE ae_encoding_to_rb_symbol(enum_string_encoding enc)
38
+ {
39
+ AE_TRACE();
40
+
41
+ switch(enc) {
42
+ case string_encoding_external:
43
+ return symbol_encoding_external;
44
+ break;
45
+ case string_encoding_utf8:
46
+ return symbol_encoding_utf8;
47
+ break;
48
+ case string_encoding_ascii:
49
+ return symbol_encoding_ascii;
50
+ break;
51
+ default:
52
+ AE_ABORT("invalid enum_string_encoding %d", enc);
53
+ }
54
+ }
@@ -0,0 +1,63 @@
1
+ #ifndef _AE_RB_UTILITIES_H
2
+ #define _AE_RB_UTILITIES_H
3
+
4
+
5
+ /*
6
+ * Macros for checking variable arguments number in Ruby C methods.
7
+ * NOTE: These macros assume that the Ruby C method is defined as:
8
+ * VALUE xxx(int argc, VALUE *argv, VALUE self)
9
+ */
10
+ #define AE_RB_CHECK_NUM_ARGS(min,max) \
11
+ if (argc < min || argc > max) \
12
+ rb_raise(rb_eArgError, "wrong number of arguments")
13
+
14
+ #define AE_RB_GET_BLOCK_OR_PROC(num_arg, target_proc) \
15
+ if (rb_block_given_p()) \
16
+ target_proc = rb_block_proc(); \
17
+ else if (argc >= num_arg) { \
18
+ target_proc = argv[num_arg-1]; \
19
+ if (! rb_obj_is_proc(target_proc)) \
20
+ rb_raise(rb_eTypeError, "argument %d is not a Proc", num_arg); \
21
+ } \
22
+ else \
23
+ target_proc = Qnil;
24
+
25
+ #define AE_RB_ENSURE_BLOCK_OR_PROC(num_arg, save_to) \
26
+ AE_RB_GET_BLOCK_OR_PROC(num_arg, save_to); \
27
+ if (NIL_P(save_to)) \
28
+ rb_raise(rb_eArgError, "no block or proc given");
29
+
30
+ /*
31
+ * Macros for generating Ruby strings with specified encoding.
32
+ */
33
+ #define AE_RB_STR_EXTERNAL_NEW(s, len) (rb_enc_str_new(s, len, rb_default_external_encoding()))
34
+ #define AE_RB_STR_TAINTED_EXTERNAL_NEW(s, len) (rb_external_str_new_with_enc(s, len, rb_default_external_encoding()))
35
+ #define AE_RB_STR_UTF8_NEW(s, len) (rb_enc_str_new(s, len, rb_utf8_encoding()))
36
+ #define AE_RB_STR_TAINTED_UTF8_NEW(s, len) (rb_external_str_new_with_enc(s, len, rb_utf8_encoding()))
37
+ #define AE_RB_STR_ASCII_NEW(s, len) (rb_enc_str_new(s, len, rb_ascii8bit_encoding()))
38
+ #define AE_RB_STR_TAINTED_ASCII_NEW(s, len) (rb_external_str_new_with_enc(s, len, rb_ascii8bit_encoding()))
39
+
40
+
41
+ /* Exported C variables. */
42
+
43
+ typedef enum {
44
+ string_encoding_external = 0,
45
+ string_encoding_utf8,
46
+ string_encoding_ascii
47
+ } enum_string_encoding;
48
+
49
+
50
+ /* Exported Ruby symbols. */
51
+
52
+ VALUE symbol_encoding_external;
53
+ VALUE symbol_encoding_utf8;
54
+ VALUE symbol_encoding_ascii;
55
+
56
+
57
+ void init_rb_utilities(void);
58
+
59
+ VALUE ae_rb_str_new(char* ptr, long len, enum_string_encoding enc, int tainted);
60
+ VALUE ae_encoding_to_rb_symbol(enum_string_encoding encoding);
61
+
62
+
63
+ #endif /* _AE_RB_UTILITIES_H */
@@ -1,65 +1,72 @@
1
- # AsyncEngine native C extension.
2
- require "asyncengine/asyncengine_ext.so"
1
+ unless RUBY_VERSION >= "1.9.2"
2
+ raise LoadError, "AsyncEngine requires Ruby version >= 1.9.2 (current version is #{RUBY_VERSION})"
3
+ end
3
4
 
4
- # AsyncEngine Ruby library files.
5
+
6
+ require "asyncengine/uv_error.rb"
7
+ require "asyncengine/asyncengine_ext.so"
5
8
  require "asyncengine/version.rb"
6
- require "asyncengine/errors.rb"
9
+ require "asyncengine/handle.rb"
7
10
  require "asyncengine/timer.rb"
8
- require "asyncengine/next_tick.rb"
9
11
  require "asyncengine/udp.rb"
12
+ require "asyncengine/tcp.rb"
13
+ require "asyncengine/utils.rb"
14
+ require "asyncengine/debug.rb" # TODO: Temporal.
10
15
 
16
+ require "socket"
11
17
 
12
- module AsyncEngine
13
18
 
14
- @_is_running = false
15
- @_exception_manager = nil
16
- @_blocks = {}
17
- @_next_ticks = []
19
+ module AsyncEngine
18
20
 
19
- def self.run
20
- #raise AsyncEngine::Error, "AsyncEngine already running" if @_is_running
21
- @_is_running = true
21
+ @_handles = {}
22
+ @_procs = {}
23
+ @_next_tick_procs = []
24
+ @_call_from_other_thread_procs = []
25
+ @_user_error_handler = nil
26
+ @_exit_error = nil
27
+ @_on_exit_procs = []
22
28
 
23
- yield if block_given?
29
+ def self.stop
30
+ return false unless check_status()
24
31
 
25
- if _c_run
26
- # _c_run does not terminate (it blocks) until all the handles end.
27
- # If so, let's set again @_is_running to false and return true.
28
- @_is_running = false
29
- return true
32
+ if running_thread?
33
+ next_tick { release_loop() }
30
34
  else
31
- raise AsyncEngine::Error, "AsyncEngine failed to run"
35
+ call_from_other_thread { release_loop() }
32
36
  end
37
+ true
33
38
  end
34
39
 
35
- def self.running?
36
- @_is_running
40
+ def self.on_error pr=nil, &bl
41
+ block = pr || bl
42
+ raise ::ArgumentError, "no block given" unless block.is_a? ::Proc
43
+
44
+ @_user_error_handler = block
37
45
  end
38
46
 
39
- def self.exception_manager block1=nil, &block2
40
- if (block = block1 || block2)
41
- raise AsyncEngine::Error, "no block provided" unless block.respond_to? :call
42
- @_exception_manager = block
43
- else
44
- @_exception_manager = nil
45
- end
47
+ def self.unset_on_error
48
+ @_user_error_handler = nil
46
49
  end
47
50
 
48
- def self.manage_exception e
49
- if @_exception_manager
50
- @_exception_manager.call e
51
- else
52
- raise e
53
- end
51
+ def self.on_exit pr=nil, &bl
52
+ block = pr || bl
53
+ raise ::ArgumentError, "no block given" unless block.is_a? ::Proc
54
+
55
+ @_on_exit_procs << block
54
56
  end
55
57
 
58
+ def self.unset_on_exit
59
+ @_on_exit_procs.clear
60
+ end
61
+
62
+
56
63
  class << self
57
- private :_c_run
58
- private :manage_exception
64
+ private :release_loop
65
+ private :check_status
59
66
  end
60
67
 
61
68
  end
62
69
 
63
70
 
64
71
  # Let's allow AE.xxxxx usage.
65
- AE = AsyncEngine
72
+ AE = AsyncEngine
@@ -0,0 +1,37 @@
1
+ module AsyncEngine
2
+
3
+ def self.ensure_released
4
+ raise AE::Error, "still running" if running?()
5
+ raise AE::Error, "num_uv_active_handles = #{num_uv_active_handles()} (> 0)" unless num_uv_active_handles() == 0
6
+ raise AE::Error, "num_uv_active_reqs = #{num_uv_active_reqs()} (> 0)" unless num_uv_active_reqs() == 0
7
+ raise AE::Error, "@_handles not empty" unless @_handles.empty?
8
+ raise AE::Error, "@_procs not empty" unless @_procs.empty?
9
+ raise AE::Error, "@_next_tick_procs not empty" unless @_next_tick_procs.empty?
10
+ raise AE::Error, "@_call_from_other_thread_procs not empty" unless @_call_from_other_thread_procs.empty?
11
+ @_call_from_other_thread_procs
12
+ true
13
+ end
14
+
15
+ def self.debug
16
+ puts "\nDBG: AsyncEngine debug:"
17
+ puts "- AE.running: #{running?}"
18
+ puts "- UV active handles: #{num_uv_active_handles()}"
19
+ puts "- UV active reqs: #{num_uv_active_reqs()}"
20
+ puts "- @_handles (#{@_handles.size}):\n"
21
+ @_handles.to_a[0..10].each {|k,v| puts " - #{k}: #{v.inspect}"}
22
+ puts "- @_procs (#{@_procs.size}):\n"
23
+ @_procs.to_a[0..10].each {|k,v| puts " - #{k}: #{v.inspect}"}
24
+ puts "- @_next_tick_procs (#{@_next_tick_procs.size}):\n"
25
+ @_next_tick_procs[0..10].each {|n| puts " - #{n.inspect}"}
26
+ puts "- @_call_from_other_thread_procs (#{@_call_from_other_thread_procs.size}):\n"
27
+ @_call_from_other_thread_procs[0..10].each {|n| puts " - #{n.inspect}"}
28
+ puts
29
+ end
30
+
31
+
32
+ class << self
33
+ private :num_uv_active_handles
34
+ private :num_uv_active_reqs
35
+ end
36
+
37
+ end
@@ -0,0 +1,9 @@
1
+ module AsyncEngine
2
+
3
+ class Handle
4
+ def closed?
5
+ ! alive?
6
+ end
7
+ end
8
+
9
+ end
@@ -0,0 +1,28 @@
1
+ module AsyncEngine
2
+
3
+ # TODO: Wrong, take a look to timer.rb.
4
+ def self.tcp_connect dest_ip, dest_port, bind_ip=nil, bind_port=nil, klass=AsyncEngine::TCPSocket
5
+ klass.new dest_ip, dest_port, bind_ip, bind_port
6
+ end
7
+
8
+ class TCPSocket < Handle
9
+ private
10
+
11
+ def on_connected
12
+ puts "#{inspect}: connected: local address: #{local_address().inspect}, peer address: #{peer_address().inspect}"
13
+ end
14
+
15
+ def on_connection_error error
16
+ puts "#{inspect}: connection error: #{error.inspect}"
17
+ end
18
+
19
+ def on_data_received data
20
+ puts "#{inspect}: received data: #{data.inspect}"
21
+ end
22
+
23
+ def on_disconnected error
24
+ puts "#{inspect}: disconnected: #{error.inspect}"
25
+ end
26
+ end # class TCPSocket
27
+
28
+ end
@@ -1,46 +1,36 @@
1
1
  module AsyncEngine
2
2
 
3
- def self.add_timer delay, block1=nil, &block2
4
- _c_add_timer((delay*1000).to_i, nil, block1 || block2, nil)
5
- true
3
+ def self.add_timer *params, &bl
4
+ Timer.new *params, &bl
6
5
  end
7
6
 
8
- def self.add_periodic_timer interval, delay=nil, block1=nil, &block2
9
- if delay
10
- _c_add_timer((delay*1000).to_i, (interval*1000).to_i, block1 || block2, nil)
11
- else
12
- interval = (interval*1000).to_i
13
- _c_add_timer(interval, interval, block1 || block2, nil)
14
- end
15
- true
16
- end
17
-
18
- class << self
19
- private :_c_add_timer
7
+ def self.add_periodic_timer *params, &bl
8
+ PeriodicTimer.new *params, &bl
20
9
  end
21
10
 
22
11
 
23
- class Timer
24
- def initialize delay, block1=nil, &block2
25
- @_cdata = AsyncEngine.send(:_c_add_timer, (delay*1000).to_i, nil, block1 || block2, self)
12
+ class Timer < Handle
13
+ alias orig_to_s to_s
14
+ def to_s
15
+ if alive?
16
+ "#{orig_to_s} (delay: #{delay()})"
17
+ else
18
+ "#{orig_to_s} (not alive)"
19
+ end
26
20
  end
21
+ alias :inspect :to_s
27
22
  end
28
23
 
29
24
 
30
25
  class PeriodicTimer < Timer
31
- def initialize interval, delay=nil, block1=nil, &block2
32
- if delay
33
- @_cdata = AsyncEngine.send(:_c_add_timer, (delay*1000).to_i, (interval*1000).to_i, block1 || block2, self)
26
+ def to_s
27
+ if alive?
28
+ "#{orig_to_s} (delay: #{delay()}, interval: #{interval()})"
34
29
  else
35
- interval = (interval*1000).to_i
36
- @_cdata = AsyncEngine.send(:_c_add_timer, interval, interval, block1 || block2, self)
30
+ "#{orig_to_s} (not alive)"
37
31
  end
38
32
  end
39
-
40
- def set_interval interval
41
- _c_set_interval (interval*1000).to_i
42
- end
43
- alias :interval= :set_interval
33
+ alias :inspect :to_s
44
34
  end
45
35
 
46
36
  end
@@ -1,5 +1,34 @@
1
1
  module AsyncEngine
2
2
 
3
+ def self.open_udp_socket *params
4
+ sock = UDPSocket.new *params
3
5
 
6
+ # Run the given block.
7
+ yield sock if block_given?
8
+
9
+ # Return the instance.
10
+ sock
11
+ end
12
+
13
+
14
+ class UDPSocket < Handle
15
+ alias orig_to_s to_s
16
+ def to_s
17
+ ip, port = local_address()
18
+ if alive?
19
+ "#{orig_to_s} (#{ip_type().inspect} : #{ip} : #{port})"
20
+ else
21
+ "#{orig_to_s} (not alive)"
22
+ end
23
+ end
24
+ alias :inspect :to_s
25
+
26
+
27
+ private
28
+
29
+ def on_datagram_received datagram, src_ip, src_port
30
+ puts "#{inspect}: received datagram from #{src_ip} : #{src_port}: #{datagram.inspect}"
31
+ end
32
+ end # class UDPSocket
4
33
 
5
34
  end
@@ -0,0 +1,32 @@
1
+ module AsyncEngine::Utils
2
+
3
+ class NetworkInterface
4
+ attr_reader :name, :ip_type, :ip
5
+
6
+ def internal?
7
+ @is_internal
8
+ end
9
+
10
+ alias :orig_to_s :to_s
11
+ def to_s
12
+ "#{self.orig_to_s} (name: #{@name}, internal?: #{@is_internal.inspect}, ip: #{@ip})"
13
+ end
14
+ alias :inspect :to_s
15
+ end
16
+
17
+ class CpuInfo
18
+ attr_reader :model, :speed
19
+ attr_reader :time_sys, :time_user, :time_idle, :time_irq, :time_nice
20
+
21
+ alias :orig_to_s :to_s
22
+ def to_s
23
+ "#{self.orig_to_s} (model: #{@model}, speed: #{speed} MHz)"
24
+ end
25
+
26
+ def inspect
27
+ sprintf("%s sys: %.2f%%, user: %.2f%%, idle: %.2f%%, irq: %.2f%%, nice: %.2f%%",
28
+ to_s, @time_sys, @time_user, @time_idle, @time_irq, @time_nice)
29
+ end
30
+ end
31
+
32
+ end
@@ -0,0 +1,17 @@
1
+ module AsyncEngine
2
+
3
+ class Error < StandardError ; end
4
+
5
+ class UvError < Error
6
+ attr_reader :errno, :type, :description
7
+
8
+ def initialize errno, type, description
9
+ @errno = errno
10
+ @type = type
11
+ @description = description
12
+
13
+ super "#{@type.inspect} (errno #{@errno}), #{@description}"
14
+ end
15
+ end
16
+
17
+ end