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
@@ -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 */
|
data/lib/asyncengine.rb
CHANGED
@@ -1,65 +1,72 @@
|
|
1
|
-
|
2
|
-
|
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
|
-
|
5
|
+
|
6
|
+
require "asyncengine/uv_error.rb"
|
7
|
+
require "asyncengine/asyncengine_ext.so"
|
5
8
|
require "asyncengine/version.rb"
|
6
|
-
require "asyncengine/
|
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
|
-
|
15
|
-
@_exception_manager = nil
|
16
|
-
@_blocks = {}
|
17
|
-
@_next_ticks = []
|
19
|
+
module AsyncEngine
|
18
20
|
|
19
|
-
|
20
|
-
|
21
|
-
|
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
|
-
|
29
|
+
def self.stop
|
30
|
+
return false unless check_status()
|
24
31
|
|
25
|
-
if
|
26
|
-
|
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
|
-
|
35
|
+
call_from_other_thread { release_loop() }
|
32
36
|
end
|
37
|
+
true
|
33
38
|
end
|
34
39
|
|
35
|
-
def self.
|
36
|
-
|
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.
|
40
|
-
|
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.
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
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 :
|
58
|
-
private :
|
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
|
Binary file
|
@@ -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,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
|
data/lib/asyncengine/timer.rb
CHANGED
@@ -1,46 +1,36 @@
|
|
1
1
|
module AsyncEngine
|
2
2
|
|
3
|
-
def self.add_timer
|
4
|
-
|
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
|
9
|
-
|
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
|
-
|
25
|
-
|
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
|
32
|
-
if
|
33
|
-
|
26
|
+
def to_s
|
27
|
+
if alive?
|
28
|
+
"#{orig_to_s} (delay: #{delay()}, interval: #{interval()})"
|
34
29
|
else
|
35
|
-
|
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
|
data/lib/asyncengine/udp.rb
CHANGED
@@ -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
|