asyncengine 0.0.1.testing1 → 0.0.2.alpha1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|