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.
- data/README.markdown +3 -0
- data/Rakefile +38 -0
- data/asyncengine.gemspec +8 -4
- data/ext/asyncengine/ae_call_from_other_thread.c +106 -0
- data/ext/asyncengine/ae_call_from_other_thread.h +12 -0
- data/ext/asyncengine/ae_handle_common.c +193 -48
- data/ext/asyncengine/ae_handle_common.h +40 -13
- data/ext/asyncengine/ae_ip_utils.c +246 -0
- data/ext/asyncengine/ae_ip_utils.h +25 -0
- data/ext/asyncengine/ae_next_tick.c +81 -21
- data/ext/asyncengine/ae_next_tick.h +4 -2
- data/ext/asyncengine/ae_resolver.c +156 -0
- data/ext/asyncengine/ae_resolver.h +10 -0
- data/ext/asyncengine/ae_tcp.c +908 -0
- data/ext/asyncengine/ae_tcp.h +20 -0
- data/ext/asyncengine/ae_timer.c +355 -81
- data/ext/asyncengine/ae_timer.h +11 -4
- data/ext/asyncengine/ae_udp.c +579 -13
- data/ext/asyncengine/ae_udp.h +15 -2
- data/ext/asyncengine/ae_utils.c +192 -0
- data/ext/asyncengine/ae_utils.h +16 -0
- data/ext/asyncengine/asyncengine_ruby.c +469 -26
- data/ext/asyncengine/asyncengine_ruby.h +49 -11
- data/ext/asyncengine/debug.h +68 -0
- data/ext/asyncengine/extconf.rb +26 -2
- data/ext/asyncengine/ip_parser.c +5954 -0
- data/ext/asyncengine/ip_parser.h +16 -0
- data/ext/asyncengine/libuv/AUTHORS +16 -0
- data/ext/asyncengine/libuv/common.gypi +4 -4
- data/ext/asyncengine/libuv/config-mingw.mk +6 -6
- data/ext/asyncengine/libuv/config-unix.mk +13 -13
- data/ext/asyncengine/libuv/gyp_uv +5 -1
- data/ext/asyncengine/libuv/ibc_tests/exec_test.sh +8 -0
- data/ext/asyncengine/libuv/ibc_tests/uv_shutdown_write_issue.c +171 -0
- data/ext/asyncengine/libuv/ibc_tests/uv_tcp_close_while_connecting.c +102 -0
- data/ext/asyncengine/libuv/include/uv-private/ngx-queue.h +3 -1
- data/ext/asyncengine/libuv/include/uv-private/uv-unix.h +103 -50
- data/ext/asyncengine/libuv/include/uv-private/uv-win.h +76 -24
- data/ext/asyncengine/libuv/include/uv.h +353 -88
- data/ext/asyncengine/libuv/src/ares/ares__close_sockets.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares__get_hostent.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares__read_line.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares__timeval.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_cancel.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_data.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_destroy.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_expand_name.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_expand_string.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_fds.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_free_hostent.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_free_string.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_gethostbyaddr.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_gethostbyname.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_getnameinfo.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_getopt.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_getsock.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_init.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_library_init.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_llist.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_mkquery.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_nowarn.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_options.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_parse_a_reply.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_parse_aaaa_reply.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_parse_mx_reply.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_parse_ns_reply.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_parse_ptr_reply.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_parse_srv_reply.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_parse_txt_reply.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_process.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_query.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_search.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_send.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_strcasecmp.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_strdup.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_strerror.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_timeout.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_version.o +0 -0
- data/ext/asyncengine/libuv/src/ares/ares_writev.o +0 -0
- data/ext/asyncengine/libuv/src/ares/bitncmp.o +0 -0
- data/ext/asyncengine/libuv/src/ares/inet_net_pton.o +0 -0
- data/ext/asyncengine/libuv/src/ares/inet_ntop.o +0 -0
- data/ext/asyncengine/libuv/src/cares.c +225 -0
- data/ext/asyncengine/libuv/src/cares.o +0 -0
- data/ext/asyncengine/libuv/src/fs-poll.c +237 -0
- data/ext/asyncengine/libuv/src/fs-poll.o +0 -0
- data/ext/asyncengine/libuv/src/unix/async.c +78 -17
- data/ext/asyncengine/libuv/src/unix/async.o +0 -0
- data/ext/asyncengine/libuv/src/unix/core.c +305 -213
- data/ext/asyncengine/libuv/src/unix/core.o +0 -0
- data/ext/asyncengine/libuv/src/unix/cygwin.c +1 -1
- data/ext/asyncengine/libuv/src/unix/darwin.c +2 -1
- data/ext/asyncengine/libuv/src/unix/dl.c +36 -44
- data/ext/asyncengine/libuv/src/unix/dl.o +0 -0
- data/ext/asyncengine/libuv/src/unix/eio/eio.o +0 -0
- data/ext/asyncengine/libuv/src/unix/error.c +6 -0
- data/ext/asyncengine/libuv/src/unix/error.o +0 -0
- data/ext/asyncengine/libuv/src/unix/ev/ev.c +8 -4
- data/ext/asyncengine/libuv/src/unix/ev/ev.o +0 -0
- data/ext/asyncengine/libuv/src/unix/freebsd.c +1 -1
- data/ext/asyncengine/libuv/src/unix/fs.c +25 -33
- data/ext/asyncengine/libuv/src/unix/fs.o +0 -0
- data/ext/asyncengine/libuv/src/unix/internal.h +50 -31
- data/ext/asyncengine/libuv/src/unix/kqueue.c +2 -7
- data/ext/asyncengine/libuv/src/unix/linux/core.o +0 -0
- data/ext/asyncengine/libuv/src/unix/linux/inotify.c +12 -14
- data/ext/asyncengine/libuv/src/unix/linux/inotify.o +0 -0
- data/ext/asyncengine/libuv/src/unix/linux/{core.c → linux-core.c} +1 -1
- data/ext/asyncengine/libuv/src/unix/linux/linux-core.o +0 -0
- data/ext/asyncengine/libuv/src/unix/linux/syscalls.c +147 -1
- data/ext/asyncengine/libuv/src/unix/linux/syscalls.h +39 -2
- data/ext/asyncengine/libuv/src/unix/linux/syscalls.o +0 -0
- data/ext/asyncengine/libuv/src/unix/loop-watcher.c +63 -0
- data/ext/asyncengine/libuv/src/unix/loop-watcher.o +0 -0
- data/ext/asyncengine/libuv/src/unix/loop.c +29 -6
- data/ext/asyncengine/libuv/src/unix/loop.o +0 -0
- data/ext/asyncengine/libuv/src/unix/netbsd.c +1 -1
- data/ext/asyncengine/libuv/src/unix/openbsd.c +1 -1
- data/ext/asyncengine/libuv/src/unix/pipe.c +31 -36
- data/ext/asyncengine/libuv/src/unix/pipe.o +0 -0
- data/ext/asyncengine/libuv/src/unix/poll.c +116 -0
- data/ext/asyncengine/libuv/src/unix/poll.o +0 -0
- data/ext/asyncengine/libuv/src/unix/process.c +193 -115
- data/ext/asyncengine/libuv/src/unix/process.o +0 -0
- data/ext/asyncengine/libuv/src/unix/stream.c +146 -153
- data/ext/asyncengine/libuv/src/unix/stream.o +0 -0
- data/ext/asyncengine/libuv/src/unix/sunos.c +45 -36
- data/ext/asyncengine/libuv/src/unix/tcp.c +6 -5
- data/ext/asyncengine/libuv/src/unix/tcp.o +0 -0
- data/ext/asyncengine/libuv/src/unix/thread.c +82 -25
- data/ext/asyncengine/libuv/src/unix/thread.o +0 -0
- data/ext/asyncengine/libuv/src/unix/timer.c +69 -58
- data/ext/asyncengine/libuv/src/unix/timer.o +0 -0
- data/ext/asyncengine/libuv/src/unix/tty.c +3 -3
- data/ext/asyncengine/libuv/src/unix/tty.o +0 -0
- data/ext/asyncengine/libuv/src/unix/udp.c +57 -66
- data/ext/asyncengine/libuv/src/unix/udp.o +0 -0
- data/ext/asyncengine/libuv/src/unix/uv-eio.c +33 -50
- data/ext/asyncengine/libuv/src/unix/uv-eio.o +0 -0
- data/ext/asyncengine/libuv/src/uv-common.c +68 -38
- data/ext/asyncengine/libuv/src/uv-common.h +104 -20
- data/ext/asyncengine/libuv/src/uv-common.o +0 -0
- data/ext/asyncengine/libuv/src/win/async.c +20 -17
- data/ext/asyncengine/libuv/src/win/core.c +44 -31
- data/ext/asyncengine/libuv/src/win/dl.c +40 -36
- data/ext/asyncengine/libuv/src/win/error.c +21 -1
- data/ext/asyncengine/libuv/src/win/fs-event.c +19 -21
- data/ext/asyncengine/libuv/src/win/fs.c +541 -189
- data/ext/asyncengine/libuv/src/win/getaddrinfo.c +56 -63
- data/ext/asyncengine/libuv/src/win/handle-inl.h +145 -0
- data/ext/asyncengine/libuv/src/win/handle.c +26 -101
- data/ext/asyncengine/libuv/src/win/internal.h +92 -107
- data/ext/asyncengine/libuv/src/win/loop-watcher.c +6 -14
- data/ext/asyncengine/libuv/src/win/pipe.c +78 -64
- data/ext/asyncengine/libuv/src/win/poll.c +618 -0
- data/ext/asyncengine/libuv/src/win/process-stdio.c +479 -0
- data/ext/asyncengine/libuv/src/win/process.c +147 -274
- data/ext/asyncengine/libuv/src/win/req-inl.h +225 -0
- data/ext/asyncengine/libuv/src/win/req.c +0 -149
- data/ext/asyncengine/libuv/src/{unix/check.c → win/stream-inl.h} +31 -42
- data/ext/asyncengine/libuv/src/win/stream.c +9 -43
- data/ext/asyncengine/libuv/src/win/tcp.c +200 -82
- data/ext/asyncengine/libuv/src/win/thread.c +42 -2
- data/ext/asyncengine/libuv/src/win/threadpool.c +3 -2
- data/ext/asyncengine/libuv/src/win/timer.c +13 -63
- data/ext/asyncengine/libuv/src/win/tty.c +26 -20
- data/ext/asyncengine/libuv/src/win/udp.c +26 -17
- data/ext/asyncengine/libuv/src/win/util.c +312 -167
- data/ext/asyncengine/libuv/src/win/winapi.c +16 -1
- data/ext/asyncengine/libuv/src/win/winapi.h +33 -9
- data/ext/asyncengine/libuv/src/win/winsock.c +88 -1
- data/ext/asyncengine/libuv/src/win/winsock.h +36 -3
- data/ext/asyncengine/libuv/test/benchmark-ares.c +16 -17
- data/ext/asyncengine/libuv/test/benchmark-fs-stat.c +164 -0
- data/ext/asyncengine/libuv/test/benchmark-list.h +9 -0
- data/ext/asyncengine/libuv/{src/unix/prepare.c → test/benchmark-loop-count.c} +42 -33
- data/ext/asyncengine/libuv/test/benchmark-million-timers.c +65 -0
- data/ext/asyncengine/libuv/test/benchmark-pound.c +1 -1
- data/ext/asyncengine/libuv/test/benchmark-sizes.c +2 -0
- data/ext/asyncengine/libuv/test/benchmark-spawn.c +7 -1
- data/ext/asyncengine/libuv/test/benchmark-udp-packet-storm.c +1 -1
- data/ext/asyncengine/libuv/test/echo-server.c +8 -0
- data/ext/asyncengine/libuv/test/run-tests.c +30 -0
- data/ext/asyncengine/libuv/test/runner-unix.c +6 -26
- data/ext/asyncengine/libuv/test/runner-win.c +5 -63
- data/ext/asyncengine/libuv/test/runner.c +10 -1
- data/ext/asyncengine/libuv/test/task.h +0 -8
- data/ext/asyncengine/libuv/test/test-async.c +43 -141
- data/ext/asyncengine/libuv/test/test-callback-order.c +76 -0
- data/ext/asyncengine/libuv/test/test-counters-init.c +2 -3
- data/ext/asyncengine/libuv/test/test-dlerror.c +17 -8
- data/ext/asyncengine/libuv/test/test-fs-event.c +31 -39
- data/ext/asyncengine/libuv/test/test-fs-poll.c +146 -0
- data/ext/asyncengine/libuv/test/test-fs.c +114 -2
- data/ext/asyncengine/libuv/test/test-gethostbyname.c +8 -8
- data/ext/asyncengine/libuv/test/test-hrtime.c +18 -15
- data/ext/asyncengine/libuv/test/test-ipc.c +8 -2
- data/ext/asyncengine/libuv/test/test-list.h +59 -9
- data/ext/asyncengine/libuv/test/test-loop-handles.c +2 -25
- data/ext/asyncengine/libuv/{src/unix/idle.c → test/test-poll-close.c} +37 -39
- data/ext/asyncengine/libuv/test/test-poll.c +573 -0
- data/ext/asyncengine/libuv/test/test-ref.c +79 -63
- data/ext/asyncengine/libuv/test/test-run-once.c +15 -11
- data/ext/asyncengine/libuv/test/test-semaphore.c +111 -0
- data/ext/asyncengine/libuv/test/test-spawn.c +368 -20
- data/ext/asyncengine/libuv/test/test-stdio-over-pipes.c +25 -35
- data/ext/asyncengine/libuv/test/test-tcp-close-while-connecting.c +80 -0
- data/ext/asyncengine/libuv/test/test-tcp-close.c +1 -1
- data/ext/asyncengine/libuv/test/test-tcp-connect-error-after-write.c +95 -0
- data/ext/asyncengine/libuv/test/test-tcp-connect-timeout.c +85 -0
- data/ext/asyncengine/libuv/test/test-tcp-shutdown-after-write.c +131 -0
- data/ext/asyncengine/libuv/test/test-tcp-write-error.c +2 -2
- data/ext/asyncengine/libuv/test/test-tcp-writealot.c +29 -54
- data/ext/asyncengine/libuv/test/test-timer-again.c +1 -1
- data/ext/asyncengine/libuv/test/test-timer.c +23 -1
- data/ext/asyncengine/libuv/test/test-udp-options.c +1 -1
- data/ext/asyncengine/libuv/test/{test-eio-overflow.c → test-walk-handles.c} +31 -44
- data/ext/asyncengine/libuv/uv.gyp +26 -9
- data/ext/asyncengine/rb_utilities.c +54 -0
- data/ext/asyncengine/rb_utilities.h +63 -0
- data/lib/asyncengine.rb +45 -38
- data/lib/asyncengine/asyncengine_ext.so +0 -0
- data/lib/asyncengine/debug.rb +37 -0
- data/lib/asyncengine/handle.rb +9 -0
- data/lib/asyncengine/tcp.rb +28 -0
- data/lib/asyncengine/timer.rb +18 -28
- data/lib/asyncengine/udp.rb +29 -0
- data/lib/asyncengine/utils.rb +32 -0
- data/lib/asyncengine/uv_error.rb +17 -0
- data/lib/asyncengine/version.rb +9 -1
- data/test/ae_test_helper.rb +62 -0
- data/test/test_basic.rb +169 -0
- data/test/test_call_from_other_thread.rb +55 -0
- data/test/test_error.rb +92 -0
- data/test/test_ip_utils.rb +44 -0
- data/test/test_next_tick.rb +37 -0
- data/test/test_resolver.rb +51 -0
- data/test/test_threads.rb +69 -0
- data/test/test_timer.rb +95 -0
- data/test/test_udp.rb +216 -0
- data/test/test_utils.rb +49 -0
- metadata +84 -57
- data/ext/asyncengine/libuv/mkmf.log +0 -24
- data/ext/asyncengine/libuv/src/unix/cares.c +0 -194
- data/ext/asyncengine/libuv/src/unix/cares.o +0 -0
- data/ext/asyncengine/libuv/src/unix/check.o +0 -0
- data/ext/asyncengine/libuv/src/unix/idle.o +0 -0
- data/ext/asyncengine/libuv/src/unix/prepare.o +0 -0
- data/ext/asyncengine/libuv/src/win/cares.c +0 -290
- data/lib/asyncengine/errors.rb +0 -5
- data/lib/asyncengine/next_tick.rb +0 -24
|
@@ -2,19 +2,46 @@
|
|
|
2
2
|
#define AE_HANDLE_COMMON_H
|
|
3
3
|
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
-
|
|
7
|
-
static int pending_next_ticks;
|
|
6
|
+
static ID att_next_tick_procs;
|
|
8
7
|
|
|
9
|
-
static
|
|
8
|
+
static uv_idle_t* ae_next_tick_uv_idle;
|
|
10
9
|
|
|
11
10
|
|
|
12
|
-
|
|
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
|
-
|
|
19
|
+
AE_TRACE();
|
|
20
|
+
|
|
21
|
+
rb_define_module_function(mAsyncEngine, "next_tick", AsyncEngine_next_tick, -1);
|
|
15
22
|
|
|
16
|
-
|
|
23
|
+
att_next_tick_procs = rb_intern("@_next_tick_procs");
|
|
17
24
|
|
|
18
|
-
|
|
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
|
-
|
|
54
|
+
VALUE AsyncEngine_next_tick(int argc, VALUE *argv, VALUE self)
|
|
24
55
|
{
|
|
25
56
|
AE_TRACE();
|
|
26
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
86
|
+
static
|
|
87
|
+
VALUE _ae_idle_callback(void)
|
|
42
88
|
{
|
|
43
89
|
AE_TRACE();
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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
|
-
|
|
51
|
-
|
|
108
|
+
procs = Qnil;
|
|
109
|
+
|
|
110
|
+
return Qnil;
|
|
111
|
+
}
|