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
@@ -30,98 +30,66 @@
|
|
30
30
|
#include "winsock.h"
|
31
31
|
|
32
32
|
|
33
|
-
/*
|
34
|
-
* Timers
|
35
|
-
*/
|
36
|
-
void uv_timer_endgame(uv_loop_t* loop, uv_timer_t* handle);
|
37
|
-
|
38
|
-
DWORD uv_get_poll_timeout(uv_loop_t* loop);
|
39
|
-
void uv_process_timers(uv_loop_t* loop);
|
40
|
-
|
41
|
-
|
42
33
|
/*
|
43
34
|
* Handles
|
35
|
+
* (also see handle-inl.h)
|
44
36
|
*/
|
45
37
|
|
46
|
-
/*
|
38
|
+
/* Used by all handles. */
|
47
39
|
#define UV_HANDLE_CLOSING 0x00000001
|
48
40
|
#define UV_HANDLE_CLOSED 0x00000002
|
49
|
-
#define
|
50
|
-
#define
|
51
|
-
|
52
|
-
#define
|
53
|
-
#define
|
54
|
-
#define
|
55
|
-
|
56
|
-
|
57
|
-
#define
|
58
|
-
#define
|
59
|
-
#define UV_HANDLE_BIND_ERROR
|
60
|
-
#define
|
61
|
-
#define
|
62
|
-
#define
|
63
|
-
#define
|
64
|
-
#define
|
65
|
-
#define
|
66
|
-
#define
|
41
|
+
#define UV_HANDLE_ENDGAME_QUEUED 0x00000004
|
42
|
+
#define UV_HANDLE_ACTIVE 0x00000010
|
43
|
+
|
44
|
+
/* uv-common.h: #define UV__HANDLE_ACTIVE 0x00000040 */
|
45
|
+
/* uv-common.h: #define UV__HANDLE_REF 0x00000020 */
|
46
|
+
/* reserved: #define UV_HANDLE_INTERNAL 0x00000080 */
|
47
|
+
|
48
|
+
/* Used by streams and UDP handles. */
|
49
|
+
#define UV_HANDLE_READING 0x00000100
|
50
|
+
#define UV_HANDLE_BOUND 0x00000200
|
51
|
+
#define UV_HANDLE_BIND_ERROR 0x00000400
|
52
|
+
#define UV_HANDLE_LISTENING 0x00000800
|
53
|
+
#define UV_HANDLE_CONNECTION 0x00001000
|
54
|
+
#define UV_HANDLE_CONNECTED 0x00002000
|
55
|
+
#define UV_HANDLE_EOF 0x00004000
|
56
|
+
#define UV_HANDLE_SHUTTING 0x00008000
|
57
|
+
#define UV_HANDLE_SHUT 0x00010000
|
58
|
+
#define UV_HANDLE_READ_PENDING 0x00020000
|
59
|
+
#define UV_HANDLE_SYNC_BYPASS_IOCP 0x00040000
|
60
|
+
#define UV_HANDLE_ZERO_READ 0x00080000
|
67
61
|
#define UV_HANDLE_EMULATE_IOCP 0x00100000
|
68
|
-
|
69
|
-
|
70
|
-
#define
|
71
|
-
#define UV_HANDLE_SHARED_TCP_SOCKET 0x01000000
|
62
|
+
|
63
|
+
/* Only used by uv_tcp_t handles. */
|
64
|
+
#define UV_HANDLE_IPV6 0x01000000
|
72
65
|
#define UV_HANDLE_TCP_NODELAY 0x02000000
|
73
66
|
#define UV_HANDLE_TCP_KEEPALIVE 0x04000000
|
74
67
|
#define UV_HANDLE_TCP_SINGLE_ACCEPT 0x08000000
|
75
68
|
#define UV_HANDLE_TCP_ACCEPT_STATE_CHANGING 0x10000000
|
76
69
|
#define UV_HANDLE_TCP_SOCKET_CLOSED 0x20000000
|
70
|
+
#define UV_HANDLE_SHARED_TCP_SOCKET 0x40000000
|
77
71
|
|
78
|
-
|
79
|
-
|
72
|
+
/* Only used by uv_pipe_t handles. */
|
73
|
+
#define UV_HANDLE_NON_OVERLAPPED_PIPE 0x01000000
|
74
|
+
#define UV_HANDLE_PIPESERVER 0x02000000
|
80
75
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
\
|
86
|
-
if (handle->flags & UV_HANDLE_CLOSING && \
|
87
|
-
handle->reqs_pending == 0) { \
|
88
|
-
uv_want_endgame(loop, (uv_handle_t*)handle); \
|
89
|
-
} \
|
90
|
-
} while (0)
|
76
|
+
/* Only used by uv_tty_t handles. */
|
77
|
+
#define UV_HANDLE_TTY_RAW 0x01000000
|
78
|
+
#define UV_HANDLE_TTY_SAVED_POSITION 0x02000000
|
79
|
+
#define UV_HANDLE_TTY_SAVED_ATTRIBUTES 0x04000000
|
91
80
|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
#define UV_SUCCEEDED_WITH_IOCP(result) \
|
96
|
-
((result) || (GetLastError() == ERROR_IO_PENDING))
|
81
|
+
/* Only used by uv_poll_t handles. */
|
82
|
+
#define UV_HANDLE_POLL_SLOW 0x02000000
|
97
83
|
|
98
84
|
|
99
85
|
/*
|
100
|
-
* Requests
|
86
|
+
* Requests: see req-inl.h
|
101
87
|
*/
|
102
|
-
void uv_req_init(uv_loop_t* loop, uv_req_t* req);
|
103
|
-
|
104
|
-
uv_req_t* uv_overlapped_to_req(OVERLAPPED* overlapped);
|
105
|
-
|
106
|
-
void uv_insert_pending_req(uv_loop_t* loop, uv_req_t* req);
|
107
|
-
void uv_process_reqs(uv_loop_t* loop);
|
108
|
-
|
109
|
-
#define POST_COMPLETION_FOR_REQ(loop, req) \
|
110
|
-
if (!PostQueuedCompletionStatus((loop)->iocp, \
|
111
|
-
0, \
|
112
|
-
0, \
|
113
|
-
&((req)->overlapped))) { \
|
114
|
-
uv_fatal_error(GetLastError(), "PostQueuedCompletionStatus"); \
|
115
|
-
}
|
116
88
|
|
117
89
|
|
118
90
|
/*
|
119
|
-
* Streams
|
91
|
+
* Streams: see stream-inl.h
|
120
92
|
*/
|
121
|
-
void uv_stream_init(uv_loop_t* loop, uv_stream_t* handle);
|
122
|
-
void uv_connection_init(uv_stream_t* handle);
|
123
|
-
|
124
|
-
size_t uv_count_bufs(uv_buf_t bufs[], int count);
|
125
93
|
|
126
94
|
|
127
95
|
/*
|
@@ -142,6 +110,7 @@ void uv_process_tcp_accept_req(uv_loop_t* loop, uv_tcp_t* handle,
|
|
142
110
|
void uv_process_tcp_connect_req(uv_loop_t* loop, uv_tcp_t* handle,
|
143
111
|
uv_connect_t* req);
|
144
112
|
|
113
|
+
void uv_tcp_close(uv_loop_t* loop, uv_tcp_t* tcp);
|
145
114
|
void uv_tcp_endgame(uv_loop_t* loop, uv_tcp_t* handle);
|
146
115
|
|
147
116
|
int uv_tcp_import(uv_tcp_t* tcp, WSAPROTOCOL_INFOW* socket_protocol_info,
|
@@ -150,8 +119,6 @@ int uv_tcp_import(uv_tcp_t* tcp, WSAPROTOCOL_INFOW* socket_protocol_info,
|
|
150
119
|
int uv_tcp_duplicate_socket(uv_tcp_t* handle, int pid,
|
151
120
|
LPWSAPROTOCOL_INFOW protocol_info);
|
152
121
|
|
153
|
-
void uv_tcp_close(uv_tcp_t* tcp);
|
154
|
-
|
155
122
|
|
156
123
|
/*
|
157
124
|
* UDP
|
@@ -160,6 +127,7 @@ void uv_process_udp_recv_req(uv_loop_t* loop, uv_udp_t* handle, uv_req_t* req);
|
|
160
127
|
void uv_process_udp_send_req(uv_loop_t* loop, uv_udp_t* handle,
|
161
128
|
uv_udp_send_t* req);
|
162
129
|
|
130
|
+
void uv_udp_close(uv_loop_t* loop, uv_udp_t* handle);
|
163
131
|
void uv_udp_endgame(uv_loop_t* loop, uv_udp_t* handle);
|
164
132
|
|
165
133
|
|
@@ -168,8 +136,6 @@ void uv_udp_endgame(uv_loop_t* loop, uv_udp_t* handle);
|
|
168
136
|
*/
|
169
137
|
int uv_stdio_pipe_server(uv_loop_t* loop, uv_pipe_t* handle, DWORD access,
|
170
138
|
char* name, size_t nameSize);
|
171
|
-
void close_pipe(uv_pipe_t* handle, int* status, uv_err_t* err);
|
172
|
-
void uv_pipe_endgame(uv_loop_t* loop, uv_pipe_t* handle);
|
173
139
|
|
174
140
|
int uv_pipe_listen(uv_pipe_t* handle, int backlog, uv_connection_cb cb);
|
175
141
|
int uv_pipe_accept(uv_pipe_t* server, uv_stream_t* client);
|
@@ -193,6 +159,10 @@ void uv_process_pipe_connect_req(uv_loop_t* loop, uv_pipe_t* handle,
|
|
193
159
|
void uv_process_pipe_shutdown_req(uv_loop_t* loop, uv_pipe_t* handle,
|
194
160
|
uv_shutdown_t* req);
|
195
161
|
|
162
|
+
void uv_pipe_close(uv_loop_t* loop, uv_pipe_t* handle);
|
163
|
+
void uv_pipe_cleanup(uv_loop_t* loop, uv_pipe_t* handle);
|
164
|
+
void uv_pipe_endgame(uv_loop_t* loop, uv_pipe_t* handle);
|
165
|
+
|
196
166
|
|
197
167
|
/*
|
198
168
|
* TTY
|
@@ -220,6 +190,25 @@ void uv_process_tty_connect_req(uv_loop_t* loop, uv_tty_t* handle,
|
|
220
190
|
void uv_tty_endgame(uv_loop_t* loop, uv_tty_t* handle);
|
221
191
|
|
222
192
|
|
193
|
+
/*
|
194
|
+
* Poll watchers
|
195
|
+
*/
|
196
|
+
void uv_process_poll_req(uv_loop_t* loop, uv_poll_t* handle,
|
197
|
+
uv_req_t* req);
|
198
|
+
|
199
|
+
void uv_poll_close(uv_loop_t* loop, uv_poll_t* handle);
|
200
|
+
void uv_poll_endgame(uv_loop_t* loop, uv_poll_t* handle);
|
201
|
+
|
202
|
+
|
203
|
+
/*
|
204
|
+
* Timers
|
205
|
+
*/
|
206
|
+
void uv_timer_endgame(uv_loop_t* loop, uv_timer_t* handle);
|
207
|
+
|
208
|
+
DWORD uv_get_poll_timeout(uv_loop_t* loop);
|
209
|
+
void uv_process_timers(uv_loop_t* loop);
|
210
|
+
|
211
|
+
|
223
212
|
/*
|
224
213
|
* Loop watchers
|
225
214
|
*/
|
@@ -229,10 +218,13 @@ void uv_prepare_invoke(uv_loop_t* loop);
|
|
229
218
|
void uv_check_invoke(uv_loop_t* loop);
|
230
219
|
void uv_idle_invoke(uv_loop_t* loop);
|
231
220
|
|
221
|
+
void uv__once_init();
|
222
|
+
|
232
223
|
|
233
224
|
/*
|
234
225
|
* Async watcher
|
235
226
|
*/
|
227
|
+
void uv_async_close(uv_loop_t* loop, uv_async_t* handle);
|
236
228
|
void uv_async_endgame(uv_loop_t* loop, uv_async_t* handle);
|
237
229
|
|
238
230
|
void uv_process_async_wakeup_req(uv_loop_t* loop, uv_async_t* handle,
|
@@ -248,21 +240,10 @@ void uv_process_close(uv_loop_t* loop, uv_process_t* handle);
|
|
248
240
|
void uv_process_endgame(uv_loop_t* loop, uv_process_t* handle);
|
249
241
|
|
250
242
|
|
251
|
-
/*
|
252
|
-
* C-ares integration
|
253
|
-
*/
|
254
|
-
typedef struct uv_ares_action_s uv_ares_action_t;
|
255
|
-
|
256
|
-
void uv_process_ares_event_req(uv_loop_t* loop, uv_ares_action_t* handle,
|
257
|
-
uv_req_t* req);
|
258
|
-
void uv_process_ares_cleanup_req(uv_loop_t* loop, uv_ares_task_t* handle,
|
259
|
-
uv_req_t* req);
|
260
|
-
|
261
243
|
/*
|
262
244
|
* Getaddrinfo
|
263
245
|
*/
|
264
|
-
void uv_process_getaddrinfo_req(uv_loop_t* loop, uv_getaddrinfo_t*
|
265
|
-
uv_req_t* req);
|
246
|
+
void uv_process_getaddrinfo_req(uv_loop_t* loop, uv_getaddrinfo_t* req);
|
266
247
|
|
267
248
|
|
268
249
|
/*
|
@@ -281,37 +262,38 @@ void uv_process_work_req(uv_loop_t* loop, uv_work_t* req);
|
|
281
262
|
/*
|
282
263
|
* FS Event
|
283
264
|
*/
|
284
|
-
void uv_process_fs_event_req(uv_loop_t* loop, uv_req_t* req,
|
265
|
+
void uv_process_fs_event_req(uv_loop_t* loop, uv_req_t* req,
|
266
|
+
uv_fs_event_t* handle);
|
285
267
|
void uv_fs_event_close(uv_loop_t* loop, uv_fs_event_t* handle);
|
286
268
|
void uv_fs_event_endgame(uv_loop_t* loop, uv_fs_event_t* handle);
|
287
269
|
|
288
270
|
|
289
|
-
/*
|
290
|
-
|
291
|
-
|
292
|
-
void
|
293
|
-
uv_err_code uv_translate_sys_error(int sys_errno);
|
294
|
-
|
295
|
-
#define SET_REQ_STATUS(req, status) \
|
296
|
-
(req)->overlapped.Internal = (ULONG_PTR) (status)
|
297
|
-
|
298
|
-
#define SET_REQ_ERROR(req, error) \
|
299
|
-
SET_REQ_STATUS((req), NTSTATUS_FROM_WIN32((error)))
|
271
|
+
/*
|
272
|
+
* Stat poller.
|
273
|
+
*/
|
274
|
+
void uv__fs_poll_endgame(uv_loop_t* loop, uv_fs_poll_t* handle);
|
300
275
|
|
301
|
-
#define SET_REQ_SUCCESS(req) \
|
302
|
-
SET_REQ_STATUS((req), STATUS_SUCCESS)
|
303
276
|
|
304
|
-
|
305
|
-
|
277
|
+
/*
|
278
|
+
* Utilities.
|
279
|
+
*/
|
280
|
+
void uv__util_init();
|
306
281
|
|
307
|
-
|
308
|
-
|
282
|
+
int uv_parent_pid();
|
283
|
+
void uv_fatal_error(const int errorno, const char* syscall);
|
284
|
+
uv_err_code uv_translate_sys_error(int sys_errno);
|
309
285
|
|
310
|
-
#define GET_REQ_ERROR(req) \
|
311
|
-
(pRtlNtStatusToDosError(GET_REQ_STATUS((req))))
|
312
286
|
|
313
|
-
|
314
|
-
|
287
|
+
/*
|
288
|
+
* Process stdio handles.
|
289
|
+
*/
|
290
|
+
int uv__stdio_create(uv_loop_t* loop, uv_process_options_t* options,
|
291
|
+
BYTE** buffer_ptr);
|
292
|
+
void uv__stdio_destroy(BYTE* buffer);
|
293
|
+
void uv__stdio_noinherit(BYTE* buffer);
|
294
|
+
int uv__stdio_verify(BYTE* buffer, WORD size);
|
295
|
+
WORD uv__stdio_size(BYTE* buffer);
|
296
|
+
HANDLE uv__stdio_handle(BYTE* buffer, int fd);
|
315
297
|
|
316
298
|
|
317
299
|
/*
|
@@ -338,6 +320,9 @@ int WSAAPI uv_wsarecvfrom_workaround(SOCKET socket, WSABUF* buffers,
|
|
338
320
|
int* addr_len, WSAOVERLAPPED *overlapped,
|
339
321
|
LPWSAOVERLAPPED_COMPLETION_ROUTINE completion_routine);
|
340
322
|
|
323
|
+
int WSAAPI uv_msafd_poll(SOCKET socket, AFD_POLL_INFO* info,
|
324
|
+
OVERLAPPED* overlapped);
|
325
|
+
|
341
326
|
/* Whether ipv6 is supported */
|
342
327
|
extern int uv_allow_ipv6;
|
343
328
|
|
@@ -22,33 +22,23 @@
|
|
22
22
|
#include <assert.h>
|
23
23
|
|
24
24
|
#include "uv.h"
|
25
|
-
#include "../uv-common.h"
|
26
25
|
#include "internal.h"
|
26
|
+
#include "handle-inl.h"
|
27
27
|
|
28
28
|
|
29
29
|
void uv_loop_watcher_endgame(uv_loop_t* loop, uv_handle_t* handle) {
|
30
30
|
if (handle->flags & UV_HANDLE_CLOSING) {
|
31
31
|
assert(!(handle->flags & UV_HANDLE_CLOSED));
|
32
32
|
handle->flags |= UV_HANDLE_CLOSED;
|
33
|
-
|
34
|
-
|
35
|
-
handle->close_cb(handle);
|
36
|
-
}
|
37
|
-
|
38
|
-
uv_unref(loop);
|
33
|
+
uv__handle_stop(handle);
|
34
|
+
uv__handle_close(handle);
|
39
35
|
}
|
40
36
|
}
|
41
37
|
|
42
38
|
|
43
39
|
#define UV_LOOP_WATCHER_DEFINE(name, NAME) \
|
44
40
|
int uv_##name##_init(uv_loop_t* loop, uv_##name##_t* handle) { \
|
45
|
-
handle
|
46
|
-
handle->loop = loop; \
|
47
|
-
handle->flags = 0; \
|
48
|
-
\
|
49
|
-
uv_ref(loop); \
|
50
|
-
\
|
51
|
-
loop->counters.handle_init++; \
|
41
|
+
uv__handle_init(loop, (uv_handle_t*) handle, UV_##NAME); \
|
52
42
|
loop->counters.name##_init++; \
|
53
43
|
\
|
54
44
|
return 0; \
|
@@ -77,6 +67,7 @@ void uv_loop_watcher_endgame(uv_loop_t* loop, uv_handle_t* handle) {
|
|
77
67
|
\
|
78
68
|
handle->name##_cb = cb; \
|
79
69
|
handle->flags |= UV_HANDLE_ACTIVE; \
|
70
|
+
uv__handle_start(handle); \
|
80
71
|
\
|
81
72
|
return 0; \
|
82
73
|
} \
|
@@ -108,6 +99,7 @@ void uv_loop_watcher_endgame(uv_loop_t* loop, uv_handle_t* handle) {
|
|
108
99
|
} \
|
109
100
|
\
|
110
101
|
handle->flags &= ~UV_HANDLE_ACTIVE; \
|
102
|
+
uv__handle_stop(handle); \
|
111
103
|
\
|
112
104
|
return 0; \
|
113
105
|
} \
|
@@ -25,8 +25,10 @@
|
|
25
25
|
#include <stdio.h>
|
26
26
|
|
27
27
|
#include "uv.h"
|
28
|
-
#include "../uv-common.h"
|
29
28
|
#include "internal.h"
|
29
|
+
#include "handle-inl.h"
|
30
|
+
#include "stream-inl.h"
|
31
|
+
#include "req-inl.h"
|
30
32
|
|
31
33
|
|
32
34
|
/* A zero-size buffer for use by uv_pipe_read */
|
@@ -72,9 +74,8 @@ static void uv_unique_pipe_name(char* ptr, char* name, size_t size) {
|
|
72
74
|
|
73
75
|
|
74
76
|
int uv_pipe_init(uv_loop_t* loop, uv_pipe_t* handle, int ipc) {
|
75
|
-
uv_stream_init(loop, (uv_stream_t*)handle);
|
77
|
+
uv_stream_init(loop, (uv_stream_t*)handle, UV_NAMED_PIPE);
|
76
78
|
|
77
|
-
handle->type = UV_NAMED_PIPE;
|
78
79
|
handle->reqs_pending = 0;
|
79
80
|
handle->handle = INVALID_HANDLE_VALUE;
|
80
81
|
handle->name = NULL;
|
@@ -161,11 +162,11 @@ static HANDLE open_named_pipe(WCHAR* name, DWORD* duplex_flags) {
|
|
161
162
|
int uv_stdio_pipe_server(uv_loop_t* loop, uv_pipe_t* handle, DWORD access,
|
162
163
|
char* name, size_t nameSize) {
|
163
164
|
HANDLE pipeHandle;
|
164
|
-
int
|
165
|
+
int errorno;
|
165
166
|
int err;
|
166
167
|
char* ptr = (char*)handle;
|
167
168
|
|
168
|
-
|
169
|
+
for (;;) {
|
169
170
|
uv_unique_pipe_name(ptr, name, nameSize);
|
170
171
|
|
171
172
|
pipeHandle = CreateNamedPipeA(name,
|
@@ -178,9 +179,9 @@ int uv_stdio_pipe_server(uv_loop_t* loop, uv_pipe_t* handle, DWORD access,
|
|
178
179
|
break;
|
179
180
|
}
|
180
181
|
|
181
|
-
|
182
|
-
if (
|
183
|
-
uv__set_sys_error(loop,
|
182
|
+
errorno = GetLastError();
|
183
|
+
if (errorno != ERROR_PIPE_BUSY && errorno != ERROR_ACCESS_DENIED) {
|
184
|
+
uv__set_sys_error(loop, errorno);
|
184
185
|
err = -1;
|
185
186
|
goto done;
|
186
187
|
}
|
@@ -259,7 +260,6 @@ static int uv_set_pipe_handle(uv_loop_t* loop, uv_pipe_t* handle,
|
|
259
260
|
|
260
261
|
|
261
262
|
static DWORD WINAPI pipe_shutdown_thread_proc(void* parameter) {
|
262
|
-
int errno;
|
263
263
|
uv_loop_t* loop;
|
264
264
|
uv_pipe_t* handle;
|
265
265
|
uv_shutdown_t* req;
|
@@ -281,7 +281,6 @@ static DWORD WINAPI pipe_shutdown_thread_proc(void* parameter) {
|
|
281
281
|
|
282
282
|
|
283
283
|
void uv_pipe_endgame(uv_loop_t* loop, uv_pipe_t* handle) {
|
284
|
-
unsigned int uv_alloced;
|
285
284
|
DWORD result;
|
286
285
|
uv_shutdown_t* req;
|
287
286
|
NTSTATUS nt_status;
|
@@ -297,12 +296,14 @@ void uv_pipe_endgame(uv_loop_t* loop, uv_pipe_t* handle) {
|
|
297
296
|
handle->shutdown_req = NULL;
|
298
297
|
|
299
298
|
if (handle->flags & UV_HANDLE_CLOSING) {
|
299
|
+
UNREGISTER_HANDLE_REQ(loop, handle, req);
|
300
|
+
|
300
301
|
/* Already closing. Cancel the shutdown. */
|
301
302
|
if (req->cb) {
|
302
303
|
uv__set_sys_error(loop, WSAEINTR);
|
303
304
|
req->cb(req, -1);
|
304
305
|
}
|
305
|
-
|
306
|
+
|
306
307
|
DECREASE_PENDING_REQ_COUNT(handle);
|
307
308
|
return;
|
308
309
|
}
|
@@ -316,12 +317,14 @@ void uv_pipe_endgame(uv_loop_t* loop, uv_pipe_t* handle) {
|
|
316
317
|
|
317
318
|
if (nt_status != STATUS_SUCCESS) {
|
318
319
|
/* Failure */
|
320
|
+
UNREGISTER_HANDLE_REQ(loop, handle, req);
|
321
|
+
|
319
322
|
handle->flags &= ~UV_HANDLE_SHUTTING;
|
320
323
|
if (req->cb) {
|
321
324
|
uv__set_sys_error(loop, pRtlNtStatusToDosError(nt_status));
|
322
325
|
req->cb(req, -1);
|
323
326
|
}
|
324
|
-
|
327
|
+
|
325
328
|
DECREASE_PENDING_REQ_COUNT(handle);
|
326
329
|
return;
|
327
330
|
}
|
@@ -341,12 +344,14 @@ void uv_pipe_endgame(uv_loop_t* loop, uv_pipe_t* handle) {
|
|
341
344
|
|
342
345
|
} else {
|
343
346
|
/* Failure. */
|
347
|
+
UNREGISTER_HANDLE_REQ(loop, handle, req);
|
348
|
+
|
344
349
|
handle->flags &= ~UV_HANDLE_SHUTTING;
|
345
350
|
if (req->cb) {
|
346
351
|
uv__set_sys_error(loop, GetLastError());
|
347
352
|
req->cb(req, -1);
|
348
353
|
}
|
349
|
-
|
354
|
+
|
350
355
|
DECREASE_PENDING_REQ_COUNT(handle);
|
351
356
|
return;
|
352
357
|
}
|
@@ -355,7 +360,7 @@ void uv_pipe_endgame(uv_loop_t* loop, uv_pipe_t* handle) {
|
|
355
360
|
if (handle->flags & UV_HANDLE_CLOSING &&
|
356
361
|
handle->reqs_pending == 0) {
|
357
362
|
assert(!(handle->flags & UV_HANDLE_CLOSED));
|
358
|
-
handle
|
363
|
+
uv__handle_stop(handle);
|
359
364
|
|
360
365
|
if (handle->flags & UV_HANDLE_CONNECTION) {
|
361
366
|
if (handle->pending_ipc_info.socket_info) {
|
@@ -381,19 +386,7 @@ void uv_pipe_endgame(uv_loop_t* loop, uv_pipe_t* handle) {
|
|
381
386
|
handle->accept_reqs = NULL;
|
382
387
|
}
|
383
388
|
|
384
|
-
|
385
|
-
/* allowed to clobber or free the handle's memory */
|
386
|
-
uv_alloced = handle->flags & UV_HANDLE_UV_ALLOCED;
|
387
|
-
|
388
|
-
if (handle->close_cb) {
|
389
|
-
handle->close_cb((uv_handle_t*)handle);
|
390
|
-
}
|
391
|
-
|
392
|
-
if (uv_alloced) {
|
393
|
-
free(handle);
|
394
|
-
}
|
395
|
-
|
396
|
-
uv_unref(loop);
|
389
|
+
uv__handle_close(handle);
|
397
390
|
}
|
398
391
|
}
|
399
392
|
|
@@ -407,7 +400,7 @@ void uv_pipe_pending_instances(uv_pipe_t* handle, int count) {
|
|
407
400
|
/* Creates a pipe server. */
|
408
401
|
int uv_pipe_bind(uv_pipe_t* handle, const char* name) {
|
409
402
|
uv_loop_t* loop = handle->loop;
|
410
|
-
int i,
|
403
|
+
int i, errorno, nameSize;
|
411
404
|
uv_pipe_accept_t* req;
|
412
405
|
|
413
406
|
if (handle->flags & UV_HANDLE_BOUND) {
|
@@ -462,13 +455,13 @@ int uv_pipe_bind(uv_pipe_t* handle, const char* name) {
|
|
462
455
|
PIPE_UNLIMITED_INSTANCES, 65536, 65536, 0, NULL);
|
463
456
|
|
464
457
|
if (handle->accept_reqs[0].pipeHandle == INVALID_HANDLE_VALUE) {
|
465
|
-
|
466
|
-
if (
|
467
|
-
uv__set_error(loop, UV_EADDRINUSE,
|
468
|
-
} else if (
|
469
|
-
uv__set_error(loop, UV_EACCES,
|
458
|
+
errorno = GetLastError();
|
459
|
+
if (errorno == ERROR_ACCESS_DENIED) {
|
460
|
+
uv__set_error(loop, UV_EADDRINUSE, errorno);
|
461
|
+
} else if (errorno == ERROR_PATH_NOT_FOUND || errorno == ERROR_INVALID_NAME) {
|
462
|
+
uv__set_error(loop, UV_EACCES, errorno);
|
470
463
|
} else {
|
471
|
-
uv__set_sys_error(loop,
|
464
|
+
uv__set_sys_error(loop, errorno);
|
472
465
|
}
|
473
466
|
goto error;
|
474
467
|
}
|
@@ -500,7 +493,6 @@ error:
|
|
500
493
|
|
501
494
|
|
502
495
|
static DWORD WINAPI pipe_connect_thread_proc(void* parameter) {
|
503
|
-
int errno;
|
504
496
|
uv_loop_t* loop;
|
505
497
|
uv_pipe_t* handle;
|
506
498
|
uv_connect_t* req;
|
@@ -543,7 +535,7 @@ static DWORD WINAPI pipe_connect_thread_proc(void* parameter) {
|
|
543
535
|
void uv_pipe_connect(uv_connect_t* req, uv_pipe_t* handle,
|
544
536
|
const char* name, uv_connect_cb cb) {
|
545
537
|
uv_loop_t* loop = handle->loop;
|
546
|
-
int
|
538
|
+
int errorno, nameSize;
|
547
539
|
HANDLE pipeHandle = INVALID_HANDLE_VALUE;
|
548
540
|
DWORD duplex_flags;
|
549
541
|
|
@@ -560,7 +552,7 @@ void uv_pipe_connect(uv_connect_t* req, uv_pipe_t* handle,
|
|
560
552
|
}
|
561
553
|
|
562
554
|
if (!uv_utf8_to_utf16(name, handle->name, nameSize / sizeof(wchar_t))) {
|
563
|
-
|
555
|
+
errorno = GetLastError();
|
564
556
|
goto error;
|
565
557
|
}
|
566
558
|
|
@@ -571,17 +563,17 @@ void uv_pipe_connect(uv_connect_t* req, uv_pipe_t* handle,
|
|
571
563
|
if (!QueueUserWorkItem(&pipe_connect_thread_proc,
|
572
564
|
req,
|
573
565
|
WT_EXECUTELONGFUNCTION)) {
|
574
|
-
|
566
|
+
errorno = GetLastError();
|
575
567
|
goto error;
|
576
568
|
}
|
577
569
|
|
578
|
-
|
570
|
+
REGISTER_HANDLE_REQ(loop, handle, req);
|
579
571
|
handle->reqs_pending++;
|
580
572
|
|
581
573
|
return;
|
582
574
|
}
|
583
575
|
|
584
|
-
|
576
|
+
errorno = GetLastError();
|
585
577
|
goto error;
|
586
578
|
}
|
587
579
|
|
@@ -591,14 +583,14 @@ void uv_pipe_connect(uv_connect_t* req, uv_pipe_t* handle,
|
|
591
583
|
(uv_pipe_t*) req->handle,
|
592
584
|
pipeHandle,
|
593
585
|
duplex_flags)) {
|
594
|
-
|
586
|
+
errorno = GetLastError();
|
595
587
|
goto error;
|
596
588
|
}
|
597
589
|
|
598
590
|
SET_REQ_SUCCESS(req);
|
599
591
|
uv_insert_pending_req(loop, (uv_req_t*) req);
|
600
592
|
handle->reqs_pending++;
|
601
|
-
|
593
|
+
REGISTER_HANDLE_REQ(loop, handle, req);
|
602
594
|
return;
|
603
595
|
|
604
596
|
error:
|
@@ -612,17 +604,17 @@ error:
|
|
612
604
|
}
|
613
605
|
|
614
606
|
/* Make this req pending reporting an error. */
|
615
|
-
SET_REQ_ERROR(req,
|
607
|
+
SET_REQ_ERROR(req, errorno);
|
616
608
|
uv_insert_pending_req(loop, (uv_req_t*) req);
|
617
609
|
handle->reqs_pending++;
|
618
|
-
|
610
|
+
REGISTER_HANDLE_REQ(loop, handle, req);
|
619
611
|
return;
|
620
612
|
}
|
621
613
|
|
622
614
|
|
623
615
|
/* Cleans up uv_pipe_t (server or connection) and all resources associated */
|
624
616
|
/* with it. */
|
625
|
-
void
|
617
|
+
void uv_pipe_cleanup(uv_loop_t* loop, uv_pipe_t* handle) {
|
626
618
|
int i;
|
627
619
|
HANDLE pipeHandle;
|
628
620
|
|
@@ -654,6 +646,27 @@ void close_pipe(uv_pipe_t* handle, int* status, uv_err_t* err) {
|
|
654
646
|
}
|
655
647
|
|
656
648
|
|
649
|
+
void uv_pipe_close(uv_loop_t* loop, uv_pipe_t* handle) {
|
650
|
+
if (handle->flags & UV_HANDLE_READING) {
|
651
|
+
handle->flags &= ~UV_HANDLE_READING;
|
652
|
+
DECREASE_ACTIVE_COUNT(loop, handle);
|
653
|
+
}
|
654
|
+
|
655
|
+
if (handle->flags & UV_HANDLE_LISTENING) {
|
656
|
+
handle->flags &= ~UV_HANDLE_LISTENING;
|
657
|
+
DECREASE_ACTIVE_COUNT(loop, handle);
|
658
|
+
}
|
659
|
+
|
660
|
+
uv_pipe_cleanup(loop, handle);
|
661
|
+
|
662
|
+
if (handle->reqs_pending == 0) {
|
663
|
+
uv_want_endgame(loop, (uv_handle_t*) handle);
|
664
|
+
}
|
665
|
+
|
666
|
+
uv__handle_start(handle);
|
667
|
+
}
|
668
|
+
|
669
|
+
|
657
670
|
static void uv_pipe_queue_accept(uv_loop_t* loop, uv_pipe_t* handle,
|
658
671
|
uv_pipe_accept_t* req, BOOL firstInstance) {
|
659
672
|
assert(handle->flags & UV_HANDLE_LISTENING);
|
@@ -719,7 +732,7 @@ int uv_pipe_accept(uv_pipe_t* server, uv_stream_t* client) {
|
|
719
732
|
return -1;
|
720
733
|
}
|
721
734
|
|
722
|
-
return uv_tcp_import((uv_tcp_t*)client, server->pending_ipc_info.socket_info,
|
735
|
+
return uv_tcp_import((uv_tcp_t*)client, server->pending_ipc_info.socket_info,
|
723
736
|
server->pending_ipc_info.tcp_connection);
|
724
737
|
} else {
|
725
738
|
pipe_client = (uv_pipe_t*)client;
|
@@ -755,17 +768,19 @@ int uv_pipe_accept(uv_pipe_t* server, uv_stream_t* client) {
|
|
755
768
|
/* Starts listening for connections for the given pipe. */
|
756
769
|
int uv_pipe_listen(uv_pipe_t* handle, int backlog, uv_connection_cb cb) {
|
757
770
|
uv_loop_t* loop = handle->loop;
|
771
|
+
int i;
|
758
772
|
|
759
|
-
|
773
|
+
if (handle->flags & UV_HANDLE_LISTENING) {
|
774
|
+
handle->connection_cb = cb;
|
775
|
+
}
|
760
776
|
|
761
777
|
if (!(handle->flags & UV_HANDLE_BOUND)) {
|
762
778
|
uv__set_artificial_error(loop, UV_EINVAL);
|
763
779
|
return -1;
|
764
780
|
}
|
765
781
|
|
766
|
-
if (handle->flags &
|
767
|
-
|
768
|
-
uv__set_artificial_error(loop, UV_EALREADY);
|
782
|
+
if (handle->flags & UV_HANDLE_READING) {
|
783
|
+
uv__set_artificial_error(loop, UV_EISCONN);
|
769
784
|
return -1;
|
770
785
|
}
|
771
786
|
|
@@ -775,6 +790,7 @@ int uv_pipe_listen(uv_pipe_t* handle, int backlog, uv_connection_cb cb) {
|
|
775
790
|
}
|
776
791
|
|
777
792
|
handle->flags |= UV_HANDLE_LISTENING;
|
793
|
+
INCREASE_ACTIVE_COUNT(loop, handle);
|
778
794
|
handle->connection_cb = cb;
|
779
795
|
|
780
796
|
/* First pipe handle should have already been created in uv_pipe_bind */
|
@@ -957,17 +973,13 @@ static int uv_pipe_read_start_impl(uv_pipe_t* handle, uv_alloc_cb alloc_cb,
|
|
957
973
|
return -1;
|
958
974
|
}
|
959
975
|
|
960
|
-
if (handle->flags & UV_HANDLE_READING) {
|
961
|
-
uv__set_artificial_error(loop, UV_EALREADY);
|
962
|
-
return -1;
|
963
|
-
}
|
964
|
-
|
965
976
|
if (handle->flags & UV_HANDLE_EOF) {
|
966
977
|
uv__set_artificial_error(loop, UV_EOF);
|
967
978
|
return -1;
|
968
979
|
}
|
969
980
|
|
970
981
|
handle->flags |= UV_HANDLE_READING;
|
982
|
+
INCREASE_ACTIVE_COUNT(loop, handle);
|
971
983
|
handle->read_cb = read_cb;
|
972
984
|
handle->read2_cb = read2_cb;
|
973
985
|
handle->alloc_cb = alloc_cb;
|
@@ -1156,10 +1168,10 @@ static int uv_pipe_write_impl(uv_loop_t* loop, uv_write_t* req,
|
|
1156
1168
|
/* Request queued by the kernel. */
|
1157
1169
|
ipc_header_req->queued_bytes = ipc_frame.header.flags & UV_IPC_TCP_SERVER ?
|
1158
1170
|
sizeof(ipc_frame) : sizeof(ipc_frame.header);
|
1159
|
-
handle->write_queue_size +=
|
1171
|
+
handle->write_queue_size += ipc_header_req->queued_bytes;
|
1160
1172
|
}
|
1161
1173
|
|
1162
|
-
|
1174
|
+
REGISTER_HANDLE_REQ(loop, handle, ipc_header_req);
|
1163
1175
|
handle->reqs_pending++;
|
1164
1176
|
handle->write_reqs_pending++;
|
1165
1177
|
|
@@ -1214,7 +1226,7 @@ static int uv_pipe_write_impl(uv_loop_t* loop, uv_write_t* req,
|
|
1214
1226
|
}
|
1215
1227
|
}
|
1216
1228
|
|
1217
|
-
|
1229
|
+
REGISTER_HANDLE_REQ(loop, handle, req);
|
1218
1230
|
handle->reqs_pending++;
|
1219
1231
|
handle->write_reqs_pending++;
|
1220
1232
|
|
@@ -1437,6 +1449,8 @@ void uv_process_pipe_write_req(uv_loop_t* loop, uv_pipe_t* handle,
|
|
1437
1449
|
assert(handle->write_queue_size >= req->queued_bytes);
|
1438
1450
|
handle->write_queue_size -= req->queued_bytes;
|
1439
1451
|
|
1452
|
+
UNREGISTER_HANDLE_REQ(loop, handle, req);
|
1453
|
+
|
1440
1454
|
if (handle->flags & UV_HANDLE_EMULATE_IOCP) {
|
1441
1455
|
if (req->wait_handle != INVALID_HANDLE_VALUE) {
|
1442
1456
|
UnregisterWait(req->wait_handle);
|
@@ -1478,7 +1492,6 @@ void uv_process_pipe_write_req(uv_loop_t* loop, uv_pipe_t* handle,
|
|
1478
1492
|
uv_want_endgame(loop, (uv_handle_t*)handle);
|
1479
1493
|
}
|
1480
1494
|
|
1481
|
-
uv_unref(loop);
|
1482
1495
|
DECREASE_PENDING_REQ_COUNT(handle);
|
1483
1496
|
}
|
1484
1497
|
|
@@ -1515,6 +1528,8 @@ void uv_process_pipe_connect_req(uv_loop_t* loop, uv_pipe_t* handle,
|
|
1515
1528
|
uv_connect_t* req) {
|
1516
1529
|
assert(handle->type == UV_NAMED_PIPE);
|
1517
1530
|
|
1531
|
+
UNREGISTER_HANDLE_REQ(loop, handle, req);
|
1532
|
+
|
1518
1533
|
if (req->cb) {
|
1519
1534
|
if (REQ_SUCCESS(req)) {
|
1520
1535
|
uv_pipe_connection_init(handle);
|
@@ -1525,7 +1540,6 @@ void uv_process_pipe_connect_req(uv_loop_t* loop, uv_pipe_t* handle,
|
|
1525
1540
|
}
|
1526
1541
|
}
|
1527
1542
|
|
1528
|
-
uv_unref(loop);
|
1529
1543
|
DECREASE_PENDING_REQ_COUNT(handle);
|
1530
1544
|
}
|
1531
1545
|
|
@@ -1534,6 +1548,8 @@ void uv_process_pipe_shutdown_req(uv_loop_t* loop, uv_pipe_t* handle,
|
|
1534
1548
|
uv_shutdown_t* req) {
|
1535
1549
|
assert(handle->type == UV_NAMED_PIPE);
|
1536
1550
|
|
1551
|
+
UNREGISTER_HANDLE_REQ(loop, handle, req);
|
1552
|
+
|
1537
1553
|
/* Initialize and optionally start the eof timer. */
|
1538
1554
|
/* This makes no sense if we've already seen EOF. */
|
1539
1555
|
if (!(handle->flags & UV_HANDLE_EOF)) {
|
@@ -1550,7 +1566,6 @@ void uv_process_pipe_shutdown_req(uv_loop_t* loop, uv_pipe_t* handle,
|
|
1550
1566
|
req->cb(req, 0);
|
1551
1567
|
}
|
1552
1568
|
|
1553
|
-
uv_unref(loop);
|
1554
1569
|
DECREASE_PENDING_REQ_COUNT(handle);
|
1555
1570
|
}
|
1556
1571
|
|
@@ -1566,7 +1581,7 @@ static void eof_timer_init(uv_pipe_t* pipe) {
|
|
1566
1581
|
r = uv_timer_init(pipe->loop, pipe->eof_timer);
|
1567
1582
|
assert(r == 0); /* timers can't fail */
|
1568
1583
|
pipe->eof_timer->data = pipe;
|
1569
|
-
uv_unref(pipe->
|
1584
|
+
uv_unref((uv_handle_t*) pipe->eof_timer);
|
1570
1585
|
}
|
1571
1586
|
|
1572
1587
|
|
@@ -1600,7 +1615,7 @@ static void eof_timer_cb(uv_timer_t* timer, int status) {
|
|
1600
1615
|
/* or in uv_process_pipe_shutdown_req if a read is pending, */
|
1601
1616
|
/* and we always immediately stop the timer in */
|
1602
1617
|
/* uv_process_pipe_read_req. */
|
1603
|
-
assert(pipe->flags & UV_HANDLE_READ_PENDING)
|
1618
|
+
assert(pipe->flags & UV_HANDLE_READ_PENDING);
|
1604
1619
|
|
1605
1620
|
/* If there are many packets coming off the iocp then the timer callback */
|
1606
1621
|
/* may be called before the read request is coming off the queue. */
|
@@ -1629,7 +1644,6 @@ static void eof_timer_destroy(uv_pipe_t* pipe) {
|
|
1629
1644
|
assert(pipe->flags && UV_HANDLE_CONNECTION);
|
1630
1645
|
|
1631
1646
|
if (pipe->eof_timer) {
|
1632
|
-
uv_ref(pipe->loop);
|
1633
1647
|
uv_close((uv_handle_t*) pipe->eof_timer, eof_timer_close_cb);
|
1634
1648
|
pipe->eof_timer = NULL;
|
1635
1649
|
}
|