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
|
@@ -27,36 +27,39 @@
|
|
|
27
27
|
#ifndef UV_COMMON_H_
|
|
28
28
|
#define UV_COMMON_H_
|
|
29
29
|
|
|
30
|
+
#include <assert.h>
|
|
31
|
+
#include <stddef.h>
|
|
32
|
+
#include <stdint.h>
|
|
33
|
+
|
|
30
34
|
#include "uv.h"
|
|
31
35
|
#include "tree.h"
|
|
32
36
|
|
|
37
|
+
|
|
33
38
|
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
|
|
34
39
|
|
|
40
|
+
#define container_of(ptr, type, member) \
|
|
41
|
+
((type *) ((char *) (ptr) - offsetof(type, member)))
|
|
35
42
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
#
|
|
39
|
-
struct uv_req_s ares_req;
|
|
40
|
-
SOCKET sock;
|
|
41
|
-
HANDLE h_wait;
|
|
42
|
-
WSAEVENT h_event;
|
|
43
|
-
HANDLE h_close_event;
|
|
43
|
+
#ifdef _MSC_VER
|
|
44
|
+
# define UNUSED /* empty */
|
|
45
|
+
# define INLINE __inline
|
|
44
46
|
#else
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
ev_io write_watcher;
|
|
47
|
+
# define UNUSED __attribute__((unused))
|
|
48
|
+
# define INLINE inline
|
|
48
49
|
#endif
|
|
49
|
-
RB_ENTRY(uv_ares_task_s) node;
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
void uv_remove_ares_handle(uv_ares_task_t* handle);
|
|
54
|
-
uv_ares_task_t* uv_find_ares_handle(uv_loop_t*, ares_socket_t sock);
|
|
55
50
|
|
|
56
|
-
/* TODO Rename to uv_ares_task_init? */
|
|
57
|
-
void uv_add_ares_handle(uv_loop_t* loop, uv_ares_task_t* handle);
|
|
58
51
|
|
|
59
|
-
|
|
52
|
+
#ifndef _WIN32
|
|
53
|
+
enum {
|
|
54
|
+
UV__HANDLE_INTERNAL = 0x8000,
|
|
55
|
+
UV__HANDLE_ACTIVE = 0x4000,
|
|
56
|
+
UV__HANDLE_REF = 0x2000
|
|
57
|
+
};
|
|
58
|
+
#else
|
|
59
|
+
# define UV__HANDLE_INTERNAL 0x80
|
|
60
|
+
# define UV__HANDLE_ACTIVE 0x40
|
|
61
|
+
# define UV__HANDLE_REF 0x20
|
|
62
|
+
#endif
|
|
60
63
|
|
|
61
64
|
extern const uv_err_t uv_ok_;
|
|
62
65
|
|
|
@@ -83,5 +86,86 @@ int uv__tcp_connect6(uv_connect_t* req,
|
|
|
83
86
|
struct sockaddr_in6 address,
|
|
84
87
|
uv_connect_cb cb);
|
|
85
88
|
|
|
89
|
+
void uv__fs_poll_close(uv_fs_poll_t* handle);
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
UNUSED static int uv__has_active_reqs(const uv_loop_t* loop) {
|
|
93
|
+
return !ngx_queue_empty(&loop->active_reqs);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
UNUSED static void uv__req_register(uv_loop_t* loop, uv_req_t* req) {
|
|
97
|
+
ngx_queue_insert_tail(&loop->active_reqs, &req->active_queue);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
UNUSED static void uv__req_unregister(uv_loop_t* loop, uv_req_t* req) {
|
|
101
|
+
assert(uv__has_active_reqs(loop));
|
|
102
|
+
ngx_queue_remove(&req->active_queue);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
UNUSED static int uv__has_active_handles(const uv_loop_t* loop) {
|
|
107
|
+
return loop->active_handles > 0;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
UNUSED static void uv__active_handle_add(uv_handle_t* h) {
|
|
111
|
+
h->loop->active_handles++;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
UNUSED static void uv__active_handle_rm(uv_handle_t* h) {
|
|
115
|
+
h->loop->active_handles--;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
#define uv__active_handle_add(h) uv__active_handle_add((uv_handle_t*)(h))
|
|
120
|
+
#define uv__active_handle_rm(h) uv__active_handle_rm((uv_handle_t*)(h))
|
|
121
|
+
|
|
122
|
+
#define uv__req_register(loop, req) uv__req_register((loop), (uv_req_t*)(req))
|
|
123
|
+
#define uv__req_unregister(loop, req) uv__req_unregister((loop), (uv_req_t*)(req))
|
|
124
|
+
|
|
125
|
+
UNUSED static int uv__is_active(const uv_handle_t* h) {
|
|
126
|
+
return !!(h->flags & UV__HANDLE_ACTIVE);
|
|
127
|
+
}
|
|
128
|
+
#define uv__is_active(h) uv__is_active((const uv_handle_t*)(h))
|
|
129
|
+
|
|
130
|
+
UNUSED static void uv__handle_start(uv_handle_t* h) {
|
|
131
|
+
if (h->flags & UV__HANDLE_ACTIVE) return;
|
|
132
|
+
if (h->flags & UV__HANDLE_REF) uv__active_handle_add(h);
|
|
133
|
+
h->flags |= UV__HANDLE_ACTIVE;
|
|
134
|
+
}
|
|
135
|
+
#define uv__handle_start(h) uv__handle_start((uv_handle_t*)(h))
|
|
136
|
+
|
|
137
|
+
UNUSED static void uv__handle_stop(uv_handle_t* h) {
|
|
138
|
+
if (!(h->flags & UV__HANDLE_ACTIVE)) return;
|
|
139
|
+
if (h->flags & UV__HANDLE_REF) uv__active_handle_rm(h);
|
|
140
|
+
h->flags &= ~UV__HANDLE_ACTIVE;
|
|
141
|
+
}
|
|
142
|
+
#define uv__handle_stop(h) uv__handle_stop((uv_handle_t*)(h))
|
|
143
|
+
|
|
144
|
+
UNUSED static void uv__handle_ref(uv_handle_t* h) {
|
|
145
|
+
if (h->flags & UV__HANDLE_REF) return;
|
|
146
|
+
if (h->flags & UV__HANDLE_ACTIVE) uv__active_handle_add(h);
|
|
147
|
+
h->flags |= UV__HANDLE_REF;
|
|
148
|
+
}
|
|
149
|
+
#define uv__handle_ref(h) uv__handle_ref((uv_handle_t*)(h))
|
|
150
|
+
|
|
151
|
+
UNUSED static void uv__handle_unref(uv_handle_t* h) {
|
|
152
|
+
if (!(h->flags & UV__HANDLE_REF)) return;
|
|
153
|
+
if (h->flags & UV__HANDLE_ACTIVE) uv__active_handle_rm(h);
|
|
154
|
+
h->flags &= ~UV__HANDLE_REF;
|
|
155
|
+
}
|
|
156
|
+
#define uv__handle_unref(h) uv__handle_unref((uv_handle_t*)(h))
|
|
157
|
+
|
|
158
|
+
UNUSED static void uv__handle_init(uv_loop_t* loop,
|
|
159
|
+
uv_handle_t* handle,
|
|
160
|
+
uv_handle_type type) {
|
|
161
|
+
loop->counters.handle_init++;
|
|
162
|
+
handle->loop = loop;
|
|
163
|
+
handle->type = type;
|
|
164
|
+
handle->flags = UV__HANDLE_REF; /* ref the loop when active */
|
|
165
|
+
ngx_queue_insert_tail(&loop->handle_queue, &handle->handle_queue);
|
|
166
|
+
#ifndef _WIN32
|
|
167
|
+
handle->next_closing = NULL;
|
|
168
|
+
#endif
|
|
169
|
+
}
|
|
86
170
|
|
|
87
171
|
#endif /* UV_COMMON_H_ */
|
|
Binary file
|
|
@@ -23,6 +23,8 @@
|
|
|
23
23
|
|
|
24
24
|
#include "uv.h"
|
|
25
25
|
#include "internal.h"
|
|
26
|
+
#include "handle-inl.h"
|
|
27
|
+
#include "req-inl.h"
|
|
26
28
|
|
|
27
29
|
|
|
28
30
|
/* Atomic set operation on char */
|
|
@@ -58,13 +60,8 @@ void uv_async_endgame(uv_loop_t* loop, uv_async_t* handle) {
|
|
|
58
60
|
if (handle->flags & UV_HANDLE_CLOSING &&
|
|
59
61
|
!handle->async_sent) {
|
|
60
62
|
assert(!(handle->flags & UV_HANDLE_CLOSED));
|
|
61
|
-
handle
|
|
62
|
-
|
|
63
|
-
if (handle->close_cb) {
|
|
64
|
-
handle->close_cb((uv_handle_t*)handle);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
uv_unref(loop);
|
|
63
|
+
uv__handle_stop(handle);
|
|
64
|
+
uv__handle_close(handle);
|
|
68
65
|
}
|
|
69
66
|
}
|
|
70
67
|
|
|
@@ -72,12 +69,7 @@ void uv_async_endgame(uv_loop_t* loop, uv_async_t* handle) {
|
|
|
72
69
|
int uv_async_init(uv_loop_t* loop, uv_async_t* handle, uv_async_cb async_cb) {
|
|
73
70
|
uv_req_t* req;
|
|
74
71
|
|
|
75
|
-
loop
|
|
76
|
-
loop->counters.async_init++;
|
|
77
|
-
|
|
78
|
-
handle->type = UV_ASYNC;
|
|
79
|
-
handle->loop = loop;
|
|
80
|
-
handle->flags = 0;
|
|
72
|
+
uv__handle_init(loop, (uv_handle_t*) handle, UV_ASYNC);
|
|
81
73
|
handle->async_sent = 0;
|
|
82
74
|
handle->async_cb = async_cb;
|
|
83
75
|
|
|
@@ -86,12 +78,23 @@ int uv_async_init(uv_loop_t* loop, uv_async_t* handle, uv_async_cb async_cb) {
|
|
|
86
78
|
req->type = UV_WAKEUP;
|
|
87
79
|
req->data = handle;
|
|
88
80
|
|
|
89
|
-
|
|
81
|
+
loop->counters.async_init++;
|
|
82
|
+
|
|
83
|
+
uv__handle_start(handle);
|
|
90
84
|
|
|
91
85
|
return 0;
|
|
92
86
|
}
|
|
93
87
|
|
|
94
88
|
|
|
89
|
+
void uv_async_close(uv_loop_t* loop, uv_async_t* handle) {
|
|
90
|
+
if (!((uv_async_t*)handle)->async_sent) {
|
|
91
|
+
uv_want_endgame(loop, (uv_handle_t*) handle);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
uv__handle_start(handle);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
|
|
95
98
|
int uv_async_send(uv_async_t* handle) {
|
|
96
99
|
uv_loop_t* loop = handle->loop;
|
|
97
100
|
|
|
@@ -118,10 +121,10 @@ void uv_process_async_wakeup_req(uv_loop_t* loop, uv_async_t* handle,
|
|
|
118
121
|
assert(req->type == UV_WAKEUP);
|
|
119
122
|
|
|
120
123
|
handle->async_sent = 0;
|
|
121
|
-
|
|
124
|
+
|
|
125
|
+
if (!(handle->flags & UV_HANDLE_CLOSING)) {
|
|
122
126
|
handle->async_cb((uv_async_t*) handle, 0);
|
|
123
|
-
}
|
|
124
|
-
if (handle->flags & UV_HANDLE_CLOSING) {
|
|
127
|
+
} else {
|
|
125
128
|
uv_want_endgame(loop, (uv_handle_t*)handle);
|
|
126
129
|
}
|
|
127
130
|
}
|
|
@@ -27,8 +27,9 @@
|
|
|
27
27
|
#include <string.h>
|
|
28
28
|
|
|
29
29
|
#include "uv.h"
|
|
30
|
-
#include "../uv-common.h"
|
|
31
30
|
#include "internal.h"
|
|
31
|
+
#include "handle-inl.h"
|
|
32
|
+
#include "req-inl.h"
|
|
32
33
|
|
|
33
34
|
|
|
34
35
|
/* The only event loop we support right now */
|
|
@@ -44,17 +45,21 @@ static void uv_init(void) {
|
|
|
44
45
|
SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX |
|
|
45
46
|
SEM_NOOPENFILEERRORBOX);
|
|
46
47
|
|
|
48
|
+
/* Fetch winapi function pointers. This must be done first because other */
|
|
49
|
+
/* intialization code might need these function pointers to be loaded. */
|
|
50
|
+
uv_winapi_init();
|
|
51
|
+
|
|
47
52
|
/* Initialize winsock */
|
|
48
53
|
uv_winsock_init();
|
|
49
54
|
|
|
50
|
-
/* Fetch winapi function pointers */
|
|
51
|
-
uv_winapi_init();
|
|
52
|
-
|
|
53
55
|
/* Initialize FS */
|
|
54
56
|
uv_fs_init();
|
|
55
57
|
|
|
56
58
|
/* Initialize console */
|
|
57
59
|
uv_console_init();
|
|
60
|
+
|
|
61
|
+
/* Initialize utilities */
|
|
62
|
+
uv__util_init();
|
|
58
63
|
}
|
|
59
64
|
|
|
60
65
|
|
|
@@ -65,16 +70,17 @@ static void uv_loop_init(uv_loop_t* loop) {
|
|
|
65
70
|
uv_fatal_error(GetLastError(), "CreateIoCompletionPort");
|
|
66
71
|
}
|
|
67
72
|
|
|
68
|
-
loop->refs = 0;
|
|
69
|
-
|
|
70
73
|
uv_update_time(loop);
|
|
71
74
|
|
|
75
|
+
ngx_queue_init(&loop->handle_queue);
|
|
76
|
+
ngx_queue_init(&loop->active_reqs);
|
|
77
|
+
loop->active_handles = 0;
|
|
78
|
+
|
|
72
79
|
loop->pending_reqs_tail = NULL;
|
|
73
80
|
|
|
74
81
|
loop->endgame_handles = NULL;
|
|
75
82
|
|
|
76
83
|
RB_INIT(&loop->timers);
|
|
77
|
-
RB_INIT(&loop->uv_ares_handles_);
|
|
78
84
|
|
|
79
85
|
loop->check_handles = NULL;
|
|
80
86
|
loop->prepare_handles = NULL;
|
|
@@ -84,25 +90,34 @@ static void uv_loop_init(uv_loop_t* loop) {
|
|
|
84
90
|
loop->next_check_handle = NULL;
|
|
85
91
|
loop->next_idle_handle = NULL;
|
|
86
92
|
|
|
87
|
-
loop->
|
|
88
|
-
|
|
93
|
+
memset(&loop->poll_peer_sockets, 0, sizeof loop->poll_peer_sockets);
|
|
94
|
+
|
|
95
|
+
loop->channel = NULL;
|
|
96
|
+
RB_INIT(&loop->ares_handles);
|
|
89
97
|
|
|
90
98
|
loop->active_tcp_streams = 0;
|
|
91
99
|
loop->active_udp_streams = 0;
|
|
92
100
|
|
|
93
101
|
loop->last_err = uv_ok_;
|
|
102
|
+
|
|
103
|
+
memset(&loop->counters, 0, sizeof loop->counters);
|
|
94
104
|
}
|
|
95
105
|
|
|
96
106
|
|
|
97
107
|
static void uv_default_loop_init(void) {
|
|
98
108
|
/* Initialize libuv itself first */
|
|
99
|
-
|
|
109
|
+
uv__once_init();
|
|
100
110
|
|
|
101
111
|
/* Initialize the main loop */
|
|
102
112
|
uv_loop_init(&uv_default_loop_);
|
|
103
113
|
}
|
|
104
114
|
|
|
105
115
|
|
|
116
|
+
void uv__once_init(void) {
|
|
117
|
+
uv_once(&uv_init_guard_, uv_init);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
|
|
106
121
|
uv_loop_t* uv_default_loop(void) {
|
|
107
122
|
uv_once(&uv_default_loop_init_guard_, uv_default_loop_init);
|
|
108
123
|
return &uv_default_loop_;
|
|
@@ -113,7 +128,7 @@ uv_loop_t* uv_loop_new(void) {
|
|
|
113
128
|
uv_loop_t* loop;
|
|
114
129
|
|
|
115
130
|
/* Initialize libuv itself first */
|
|
116
|
-
|
|
131
|
+
uv__once_init();
|
|
117
132
|
|
|
118
133
|
loop = (uv_loop_t*)malloc(sizeof(uv_loop_t));
|
|
119
134
|
|
|
@@ -128,26 +143,19 @@ uv_loop_t* uv_loop_new(void) {
|
|
|
128
143
|
|
|
129
144
|
void uv_loop_delete(uv_loop_t* loop) {
|
|
130
145
|
if (loop != &uv_default_loop_) {
|
|
146
|
+
int i;
|
|
147
|
+
for (i = 0; i < ARRAY_SIZE(loop->poll_peer_sockets); i++) {
|
|
148
|
+
SOCKET sock = loop->poll_peer_sockets[i];
|
|
149
|
+
if (sock != 0 && sock != INVALID_SOCKET) {
|
|
150
|
+
closesocket(sock);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
131
154
|
free(loop);
|
|
132
155
|
}
|
|
133
156
|
}
|
|
134
157
|
|
|
135
158
|
|
|
136
|
-
int uv_loop_refcount(const uv_loop_t* loop) {
|
|
137
|
-
return loop->refs;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
void uv_ref(uv_loop_t* loop) {
|
|
142
|
-
loop->refs++;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
void uv_unref(uv_loop_t* loop) {
|
|
147
|
-
loop->refs--;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
|
|
151
159
|
static void uv_poll(uv_loop_t* loop, int block) {
|
|
152
160
|
BOOL success;
|
|
153
161
|
DWORD bytes, timeout;
|
|
@@ -214,6 +222,11 @@ static void uv_poll_ex(uv_loop_t* loop, int block) {
|
|
|
214
222
|
}
|
|
215
223
|
}
|
|
216
224
|
|
|
225
|
+
#define UV_LOOP_ALIVE(loop) \
|
|
226
|
+
((loop)->active_handles > 0 || \
|
|
227
|
+
!ngx_queue_empty(&(loop)->active_reqs) || \
|
|
228
|
+
(loop)->endgame_handles != NULL)
|
|
229
|
+
|
|
217
230
|
#define UV_LOOP_ONCE(loop, poll) \
|
|
218
231
|
do { \
|
|
219
232
|
uv_update_time((loop)); \
|
|
@@ -228,7 +241,7 @@ static void uv_poll_ex(uv_loop_t* loop, int block) {
|
|
|
228
241
|
uv_process_reqs((loop)); \
|
|
229
242
|
uv_process_endgames((loop)); \
|
|
230
243
|
\
|
|
231
|
-
if ((loop)
|
|
244
|
+
if (!UV_LOOP_ALIVE((loop))) { \
|
|
232
245
|
break; \
|
|
233
246
|
} \
|
|
234
247
|
\
|
|
@@ -237,13 +250,13 @@ static void uv_poll_ex(uv_loop_t* loop, int block) {
|
|
|
237
250
|
poll((loop), (loop)->idle_handles == NULL && \
|
|
238
251
|
(loop)->pending_reqs_tail == NULL && \
|
|
239
252
|
(loop)->endgame_handles == NULL && \
|
|
240
|
-
(loop)
|
|
253
|
+
UV_LOOP_ALIVE((loop))); \
|
|
241
254
|
\
|
|
242
255
|
uv_check_invoke((loop)); \
|
|
243
256
|
} while (0);
|
|
244
257
|
|
|
245
258
|
#define UV_LOOP(loop, poll) \
|
|
246
|
-
while ((loop)
|
|
259
|
+
while (UV_LOOP_ALIVE((loop))) { \
|
|
247
260
|
UV_LOOP_ONCE(loop, poll) \
|
|
248
261
|
}
|
|
249
262
|
|
|
@@ -254,7 +267,7 @@ int uv_run_once(uv_loop_t* loop) {
|
|
|
254
267
|
} else {
|
|
255
268
|
UV_LOOP_ONCE(loop, uv_poll);
|
|
256
269
|
}
|
|
257
|
-
return
|
|
270
|
+
return UV_LOOP_ALIVE(loop);
|
|
258
271
|
}
|
|
259
272
|
|
|
260
273
|
|
|
@@ -265,6 +278,6 @@ int uv_run(uv_loop_t* loop) {
|
|
|
265
278
|
UV_LOOP(loop, uv_poll);
|
|
266
279
|
}
|
|
267
280
|
|
|
268
|
-
assert(loop
|
|
281
|
+
assert(!UV_LOOP_ALIVE((loop)));
|
|
269
282
|
return 0;
|
|
270
283
|
}
|
|
@@ -22,61 +22,65 @@
|
|
|
22
22
|
#include "uv.h"
|
|
23
23
|
#include "internal.h"
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
static int uv__dlerror(uv_lib_t* lib, int errorno);
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
|
|
28
|
+
int uv_dlopen(const char* filename, uv_lib_t* lib) {
|
|
28
29
|
wchar_t filename_w[32768];
|
|
29
|
-
HMODULE handle;
|
|
30
30
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
return
|
|
31
|
+
lib->handle = NULL;
|
|
32
|
+
lib->errmsg = NULL;
|
|
33
|
+
|
|
34
|
+
if (!uv_utf8_to_utf16(filename, filename_w, ARRAY_SIZE(filename_w))) {
|
|
35
|
+
return uv__dlerror(lib, GetLastError());
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
-
handle =
|
|
39
|
-
if (handle == NULL) {
|
|
40
|
-
|
|
41
|
-
return uv__new_sys_error(saved_errno);
|
|
38
|
+
lib->handle = LoadLibraryExW(filename_w, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
|
|
39
|
+
if (lib->handle == NULL) {
|
|
40
|
+
return uv__dlerror(lib, GetLastError());
|
|
42
41
|
}
|
|
43
42
|
|
|
44
|
-
|
|
45
|
-
return uv_ok_;
|
|
43
|
+
return 0;
|
|
46
44
|
}
|
|
47
45
|
|
|
48
46
|
|
|
49
|
-
|
|
50
|
-
if (
|
|
51
|
-
|
|
52
|
-
|
|
47
|
+
void uv_dlclose(uv_lib_t* lib) {
|
|
48
|
+
if (lib->errmsg) {
|
|
49
|
+
LocalFree((void*)lib->errmsg);
|
|
50
|
+
lib->errmsg = NULL;
|
|
53
51
|
}
|
|
54
52
|
|
|
55
|
-
|
|
53
|
+
if (lib->handle) {
|
|
54
|
+
/* Ignore errors. No good way to signal them without leaking memory. */
|
|
55
|
+
FreeLibrary(lib->handle);
|
|
56
|
+
lib->handle = NULL;
|
|
57
|
+
}
|
|
56
58
|
}
|
|
57
59
|
|
|
58
60
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
saved_errno = GetLastError();
|
|
63
|
-
return uv__new_sys_error(saved_errno);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
*ptr = (void*) proc;
|
|
67
|
-
return uv_ok_;
|
|
61
|
+
int uv_dlsym(uv_lib_t* lib, const char* name, void** ptr) {
|
|
62
|
+
*ptr = (void*) GetProcAddress(lib->handle, name);
|
|
63
|
+
return uv__dlerror(lib, *ptr ? 0 : GetLastError());
|
|
68
64
|
}
|
|
69
65
|
|
|
70
66
|
|
|
71
|
-
const char
|
|
72
|
-
|
|
73
|
-
FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |
|
|
74
|
-
FORMAT_MESSAGE_IGNORE_INSERTS, NULL, saved_errno,
|
|
75
|
-
MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), (LPSTR)&buf, 0, NULL);
|
|
76
|
-
return buf;
|
|
67
|
+
const char* uv_dlerror(uv_lib_t* lib) {
|
|
68
|
+
return lib->errmsg ? lib->errmsg : "no error";
|
|
77
69
|
}
|
|
78
70
|
|
|
79
71
|
|
|
80
|
-
|
|
81
|
-
|
|
72
|
+
static int uv__dlerror(uv_lib_t* lib, int errorno) {
|
|
73
|
+
if (lib->errmsg) {
|
|
74
|
+
LocalFree((void*)lib->errmsg);
|
|
75
|
+
lib->errmsg = NULL;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
if (errorno) {
|
|
79
|
+
FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |
|
|
80
|
+
FORMAT_MESSAGE_IGNORE_INSERTS, NULL, errorno,
|
|
81
|
+
MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
|
|
82
|
+
(LPSTR)&lib->errmsg, 0, NULL);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return errorno ? -1 : 0;
|
|
82
86
|
}
|