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
|
Binary file
|
|
@@ -38,6 +38,7 @@
|
|
|
38
38
|
static void uv__stream_connect(uv_stream_t*);
|
|
39
39
|
static void uv__write(uv_stream_t* stream);
|
|
40
40
|
static void uv__read(uv_stream_t* stream);
|
|
41
|
+
static void uv__stream_io(uv_loop_t* loop, uv__io_t* w, int events);
|
|
41
42
|
|
|
42
43
|
|
|
43
44
|
static size_t uv__buf_count(uv_buf_t bufs[], int bufcnt) {
|
|
@@ -62,23 +63,16 @@ void uv__stream_init(uv_loop_t* loop,
|
|
|
62
63
|
stream->close_cb = NULL;
|
|
63
64
|
stream->connection_cb = NULL;
|
|
64
65
|
stream->connect_req = NULL;
|
|
66
|
+
stream->shutdown_req = NULL;
|
|
65
67
|
stream->accepted_fd = -1;
|
|
66
68
|
stream->fd = -1;
|
|
67
69
|
stream->delayed_error = 0;
|
|
68
|
-
stream->blocking = 0;
|
|
69
70
|
ngx_queue_init(&stream->write_queue);
|
|
70
71
|
ngx_queue_init(&stream->write_completed_queue);
|
|
71
72
|
stream->write_queue_size = 0;
|
|
72
73
|
|
|
73
|
-
|
|
74
|
-
stream->
|
|
75
|
-
|
|
76
|
-
ev_init(&stream->write_watcher, uv__stream_io);
|
|
77
|
-
stream->write_watcher.data = stream;
|
|
78
|
-
|
|
79
|
-
assert(ngx_queue_empty(&stream->write_queue));
|
|
80
|
-
assert(ngx_queue_empty(&stream->write_completed_queue));
|
|
81
|
-
assert(stream->write_queue_size == 0);
|
|
74
|
+
uv__io_init(&stream->read_watcher, uv__stream_io, -1, 0);
|
|
75
|
+
uv__io_init(&stream->write_watcher, uv__stream_io, -1, 0);
|
|
82
76
|
}
|
|
83
77
|
|
|
84
78
|
|
|
@@ -110,13 +104,9 @@ int uv__stream_open(uv_stream_t* stream, int fd, int flags) {
|
|
|
110
104
|
}
|
|
111
105
|
}
|
|
112
106
|
|
|
113
|
-
/* Associate the fd with each
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
/* These should have been set up by uv_tcp_init or uv_pipe_init. */
|
|
118
|
-
assert(stream->read_watcher.cb == uv__stream_io);
|
|
119
|
-
assert(stream->write_watcher.cb == uv__stream_io);
|
|
107
|
+
/* Associate the fd with each watcher. */
|
|
108
|
+
uv__io_set(&stream->read_watcher, uv__stream_io, fd, UV__IO_READ);
|
|
109
|
+
uv__io_set(&stream->write_watcher, uv__stream_io, fd, UV__IO_WRITE);
|
|
120
110
|
|
|
121
111
|
return 0;
|
|
122
112
|
}
|
|
@@ -128,11 +118,20 @@ void uv__stream_destroy(uv_stream_t* stream) {
|
|
|
128
118
|
|
|
129
119
|
assert(stream->flags & UV_CLOSED);
|
|
130
120
|
|
|
121
|
+
if (stream->connect_req) {
|
|
122
|
+
uv__req_unregister(stream->loop, stream->connect_req);
|
|
123
|
+
uv__set_artificial_error(stream->loop, UV_EINTR);
|
|
124
|
+
stream->connect_req->cb(stream->connect_req, -1);
|
|
125
|
+
stream->connect_req = NULL;
|
|
126
|
+
}
|
|
127
|
+
|
|
131
128
|
while (!ngx_queue_empty(&stream->write_queue)) {
|
|
132
129
|
q = ngx_queue_head(&stream->write_queue);
|
|
133
130
|
ngx_queue_remove(q);
|
|
134
131
|
|
|
135
132
|
req = ngx_queue_data(q, uv_write_t, queue);
|
|
133
|
+
uv__req_unregister(stream->loop, req);
|
|
134
|
+
|
|
136
135
|
if (req->bufs != req->bufsml)
|
|
137
136
|
free(req->bufs);
|
|
138
137
|
|
|
@@ -147,35 +146,32 @@ void uv__stream_destroy(uv_stream_t* stream) {
|
|
|
147
146
|
ngx_queue_remove(q);
|
|
148
147
|
|
|
149
148
|
req = ngx_queue_data(q, uv_write_t, queue);
|
|
149
|
+
uv__req_unregister(stream->loop, req);
|
|
150
|
+
|
|
150
151
|
if (req->cb) {
|
|
151
152
|
uv__set_sys_error(stream->loop, req->error);
|
|
152
153
|
req->cb(req, req->error ? -1 : 0);
|
|
153
154
|
}
|
|
154
155
|
}
|
|
155
156
|
|
|
156
|
-
if (stream->
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
}
|
|
157
|
+
if (stream->shutdown_req) {
|
|
158
|
+
uv__req_unregister(stream->loop, stream->shutdown_req);
|
|
159
|
+
uv__set_artificial_error(stream->loop, UV_EINTR);
|
|
160
|
+
stream->shutdown_req->cb(stream->shutdown_req, -1);
|
|
161
|
+
stream->shutdown_req = NULL;
|
|
162
162
|
}
|
|
163
163
|
}
|
|
164
164
|
|
|
165
165
|
|
|
166
|
-
void uv__server_io(
|
|
166
|
+
void uv__server_io(uv_loop_t* loop, uv__io_t* w, int events) {
|
|
167
167
|
int fd;
|
|
168
|
-
|
|
169
|
-
uv_stream_t* stream = watcher->data;
|
|
170
|
-
|
|
171
|
-
assert(watcher == &stream->read_watcher ||
|
|
172
|
-
watcher == &stream->write_watcher);
|
|
173
|
-
assert(revents == EV_READ);
|
|
168
|
+
uv_stream_t* stream = container_of(w, uv_stream_t, read_watcher);
|
|
174
169
|
|
|
170
|
+
assert(events == UV__IO_READ);
|
|
175
171
|
assert(!(stream->flags & UV_CLOSING));
|
|
176
172
|
|
|
177
173
|
if (stream->accepted_fd >= 0) {
|
|
178
|
-
|
|
174
|
+
uv__io_stop(loop, &stream->read_watcher);
|
|
179
175
|
return;
|
|
180
176
|
}
|
|
181
177
|
|
|
@@ -184,10 +180,10 @@ void uv__server_io(EV_P_ ev_io* watcher, int revents) {
|
|
|
184
180
|
*/
|
|
185
181
|
while (stream->fd != -1) {
|
|
186
182
|
assert(stream->accepted_fd < 0);
|
|
187
|
-
fd = uv__accept(stream->fd
|
|
183
|
+
fd = uv__accept(stream->fd);
|
|
188
184
|
|
|
189
185
|
if (fd < 0) {
|
|
190
|
-
if (errno == EAGAIN) {
|
|
186
|
+
if (errno == EAGAIN || errno == EWOULDBLOCK) {
|
|
191
187
|
/* No problem. */
|
|
192
188
|
return;
|
|
193
189
|
} else if (errno == EMFILE) {
|
|
@@ -205,7 +201,7 @@ void uv__server_io(EV_P_ ev_io* watcher, int revents) {
|
|
|
205
201
|
stream->connection_cb((uv_stream_t*)stream, 0);
|
|
206
202
|
if (stream->accepted_fd >= 0) {
|
|
207
203
|
/* The user hasn't yet accepted called uv_accept() */
|
|
208
|
-
|
|
204
|
+
uv__io_stop(stream->loop, &stream->read_watcher);
|
|
209
205
|
return;
|
|
210
206
|
}
|
|
211
207
|
}
|
|
@@ -234,14 +230,14 @@ int uv_accept(uv_stream_t* server, uv_stream_t* client) {
|
|
|
234
230
|
}
|
|
235
231
|
|
|
236
232
|
if (uv__stream_open(streamClient, streamServer->accepted_fd,
|
|
237
|
-
|
|
233
|
+
UV_STREAM_READABLE | UV_STREAM_WRITABLE)) {
|
|
238
234
|
/* TODO handle error */
|
|
239
235
|
close(streamServer->accepted_fd);
|
|
240
236
|
streamServer->accepted_fd = -1;
|
|
241
237
|
goto out;
|
|
242
238
|
}
|
|
243
239
|
|
|
244
|
-
|
|
240
|
+
uv__io_start(streamServer->loop, &streamServer->read_watcher);
|
|
245
241
|
streamServer->accepted_fd = -1;
|
|
246
242
|
status = 0;
|
|
247
243
|
|
|
@@ -252,15 +248,26 @@ out:
|
|
|
252
248
|
|
|
253
249
|
|
|
254
250
|
int uv_listen(uv_stream_t* stream, int backlog, uv_connection_cb cb) {
|
|
251
|
+
int r;
|
|
252
|
+
|
|
255
253
|
switch (stream->type) {
|
|
256
254
|
case UV_TCP:
|
|
257
|
-
|
|
255
|
+
r = uv_tcp_listen((uv_tcp_t*)stream, backlog, cb);
|
|
256
|
+
break;
|
|
257
|
+
|
|
258
258
|
case UV_NAMED_PIPE:
|
|
259
|
-
|
|
259
|
+
r = uv_pipe_listen((uv_pipe_t*)stream, backlog, cb);
|
|
260
|
+
break;
|
|
261
|
+
|
|
260
262
|
default:
|
|
261
263
|
assert(0);
|
|
262
264
|
return -1;
|
|
263
265
|
}
|
|
266
|
+
|
|
267
|
+
if (r == 0)
|
|
268
|
+
uv__handle_start(stream);
|
|
269
|
+
|
|
270
|
+
return r;
|
|
264
271
|
}
|
|
265
272
|
|
|
266
273
|
|
|
@@ -290,16 +297,17 @@ static void uv__drain(uv_stream_t* stream) {
|
|
|
290
297
|
assert(!uv_write_queue_head(stream));
|
|
291
298
|
assert(stream->write_queue_size == 0);
|
|
292
299
|
|
|
293
|
-
|
|
300
|
+
uv__io_stop(stream->loop, &stream->write_watcher);
|
|
294
301
|
|
|
295
302
|
/* Shutdown? */
|
|
296
|
-
if ((stream->flags &
|
|
303
|
+
if ((stream->flags & UV_STREAM_SHUTTING) &&
|
|
297
304
|
!(stream->flags & UV_CLOSING) &&
|
|
298
|
-
!(stream->flags &
|
|
305
|
+
!(stream->flags & UV_STREAM_SHUT)) {
|
|
299
306
|
assert(stream->shutdown_req);
|
|
300
307
|
|
|
301
308
|
req = stream->shutdown_req;
|
|
302
309
|
stream->shutdown_req = NULL;
|
|
310
|
+
uv__req_unregister(stream->loop, req);
|
|
303
311
|
|
|
304
312
|
if (shutdown(stream->fd, SHUT_WR)) {
|
|
305
313
|
/* Error. Report it. User should call uv_close(). */
|
|
@@ -309,7 +317,7 @@ static void uv__drain(uv_stream_t* stream) {
|
|
|
309
317
|
}
|
|
310
318
|
} else {
|
|
311
319
|
uv__set_sys_error(stream->loop, 0);
|
|
312
|
-
((uv_handle_t*) stream)->flags |=
|
|
320
|
+
((uv_handle_t*) stream)->flags |= UV_STREAM_SHUT;
|
|
313
321
|
if (req->cb) {
|
|
314
322
|
req->cb(req, 0);
|
|
315
323
|
}
|
|
@@ -343,7 +351,7 @@ static void uv__write_req_finish(uv_write_t* req) {
|
|
|
343
351
|
* callback called in the near future.
|
|
344
352
|
*/
|
|
345
353
|
ngx_queue_insert_tail(&stream->write_completed_queue, &req->queue);
|
|
346
|
-
|
|
354
|
+
uv__io_feed(stream->loop, &stream->write_watcher, UV__IO_WRITE);
|
|
347
355
|
}
|
|
348
356
|
|
|
349
357
|
|
|
@@ -428,13 +436,13 @@ start:
|
|
|
428
436
|
}
|
|
429
437
|
|
|
430
438
|
if (n < 0) {
|
|
431
|
-
if (errno != EAGAIN) {
|
|
439
|
+
if (errno != EAGAIN && errno != EWOULDBLOCK) {
|
|
432
440
|
/* Error */
|
|
433
441
|
req->error = errno;
|
|
434
442
|
stream->write_queue_size -= uv__write_req_size(req);
|
|
435
443
|
uv__write_req_finish(req);
|
|
436
444
|
return;
|
|
437
|
-
} else if (stream->
|
|
445
|
+
} else if (stream->flags & UV_STREAM_BLOCKING) {
|
|
438
446
|
/* If this is a blocking stream, try again. */
|
|
439
447
|
goto start;
|
|
440
448
|
}
|
|
@@ -455,7 +463,7 @@ start:
|
|
|
455
463
|
n = 0;
|
|
456
464
|
|
|
457
465
|
/* There is more to write. */
|
|
458
|
-
if (stream->
|
|
466
|
+
if (stream->flags & UV_STREAM_BLOCKING) {
|
|
459
467
|
/*
|
|
460
468
|
* If we're blocking then we should not be enabling the write
|
|
461
469
|
* watcher - instead we need to try again.
|
|
@@ -491,32 +499,29 @@ start:
|
|
|
491
499
|
assert(n == 0 || n == -1);
|
|
492
500
|
|
|
493
501
|
/* Only non-blocking streams should use the write_watcher. */
|
|
494
|
-
assert(!stream->
|
|
502
|
+
assert(!(stream->flags & UV_STREAM_BLOCKING));
|
|
495
503
|
|
|
496
504
|
/* We're not done. */
|
|
497
|
-
|
|
505
|
+
uv__io_start(stream->loop, &stream->write_watcher);
|
|
498
506
|
}
|
|
499
507
|
|
|
500
508
|
|
|
501
509
|
static void uv__write_callbacks(uv_stream_t* stream) {
|
|
502
|
-
int callbacks_made = 0;
|
|
503
|
-
ngx_queue_t* q;
|
|
504
510
|
uv_write_t* req;
|
|
511
|
+
ngx_queue_t* q;
|
|
505
512
|
|
|
506
513
|
while (!ngx_queue_empty(&stream->write_completed_queue)) {
|
|
507
514
|
/* Pop a req off write_completed_queue. */
|
|
508
515
|
q = ngx_queue_head(&stream->write_completed_queue);
|
|
509
|
-
|
|
510
|
-
req = ngx_queue_data(q, struct uv_write_s, queue);
|
|
516
|
+
req = ngx_queue_data(q, uv_write_t, queue);
|
|
511
517
|
ngx_queue_remove(q);
|
|
518
|
+
uv__req_unregister(stream->loop, req);
|
|
512
519
|
|
|
513
520
|
/* NOTE: call callback AFTER freeing the request data. */
|
|
514
521
|
if (req->cb) {
|
|
515
522
|
uv__set_sys_error(stream->loop, req->error);
|
|
516
523
|
req->cb(req, req->error ? -1 : 0);
|
|
517
524
|
}
|
|
518
|
-
|
|
519
|
-
callbacks_made++;
|
|
520
525
|
}
|
|
521
526
|
|
|
522
527
|
assert(ngx_queue_empty(&stream->write_completed_queue));
|
|
@@ -556,13 +561,19 @@ static void uv__read(uv_stream_t* stream) {
|
|
|
556
561
|
struct msghdr msg;
|
|
557
562
|
struct cmsghdr* cmsg;
|
|
558
563
|
char cmsg_space[64];
|
|
559
|
-
|
|
564
|
+
int count;
|
|
565
|
+
|
|
566
|
+
/* Prevent loop starvation when the data comes in as fast as (or faster than)
|
|
567
|
+
* we can read it. XXX Need to rearm fd if we switch to edge-triggered I/O.
|
|
568
|
+
*/
|
|
569
|
+
count = 32;
|
|
560
570
|
|
|
561
|
-
/* XXX: Maybe instead of having
|
|
571
|
+
/* XXX: Maybe instead of having UV_STREAM_READING we just test if
|
|
562
572
|
* tcp->read_cb is NULL or not?
|
|
563
573
|
*/
|
|
564
|
-
while ((stream->read_cb || stream->read2_cb)
|
|
565
|
-
|
|
574
|
+
while ((stream->read_cb || stream->read2_cb)
|
|
575
|
+
&& (stream->flags & UV_STREAM_READING)
|
|
576
|
+
&& (count-- > 0)) {
|
|
566
577
|
assert(stream->alloc_cb);
|
|
567
578
|
buf = stream->alloc_cb((uv_handle_t*)stream, 64 * 1024);
|
|
568
579
|
|
|
@@ -596,10 +607,10 @@ static void uv__read(uv_stream_t* stream) {
|
|
|
596
607
|
|
|
597
608
|
if (nread < 0) {
|
|
598
609
|
/* Error */
|
|
599
|
-
if (errno == EAGAIN) {
|
|
610
|
+
if (errno == EAGAIN || errno == EWOULDBLOCK) {
|
|
600
611
|
/* Wait for the next one. */
|
|
601
|
-
if (stream->flags &
|
|
602
|
-
|
|
612
|
+
if (stream->flags & UV_STREAM_READING) {
|
|
613
|
+
uv__io_start(stream->loop, &stream->read_watcher);
|
|
603
614
|
}
|
|
604
615
|
uv__set_sys_error(stream->loop, EAGAIN);
|
|
605
616
|
|
|
@@ -620,14 +631,16 @@ static void uv__read(uv_stream_t* stream) {
|
|
|
620
631
|
stream->read2_cb((uv_pipe_t*)stream, -1, buf, UV_UNKNOWN_HANDLE);
|
|
621
632
|
}
|
|
622
633
|
|
|
623
|
-
assert(!
|
|
634
|
+
assert(!uv__io_active(&stream->read_watcher));
|
|
624
635
|
return;
|
|
625
636
|
}
|
|
626
637
|
|
|
627
638
|
} else if (nread == 0) {
|
|
628
639
|
/* EOF */
|
|
629
640
|
uv__set_artificial_error(stream->loop, UV_EOF);
|
|
630
|
-
|
|
641
|
+
uv__io_stop(stream->loop, &stream->read_watcher);
|
|
642
|
+
if (!uv__io_active(&stream->write_watcher))
|
|
643
|
+
uv__handle_stop(stream);
|
|
631
644
|
|
|
632
645
|
if (stream->read_cb) {
|
|
633
646
|
stream->read_cb(stream, -1, buf);
|
|
@@ -691,54 +704,53 @@ int uv_shutdown(uv_shutdown_t* req, uv_stream_t* stream, uv_shutdown_cb cb) {
|
|
|
691
704
|
"uv_shutdown (unix) only supports uv_handle_t right now");
|
|
692
705
|
assert(stream->fd >= 0);
|
|
693
706
|
|
|
694
|
-
if (!(stream->flags &
|
|
695
|
-
stream->flags &
|
|
707
|
+
if (!(stream->flags & UV_STREAM_WRITABLE) ||
|
|
708
|
+
stream->flags & UV_STREAM_SHUT ||
|
|
696
709
|
stream->flags & UV_CLOSED ||
|
|
697
710
|
stream->flags & UV_CLOSING) {
|
|
698
|
-
|
|
711
|
+
uv__set_artificial_error(stream->loop, UV_ENOTCONN);
|
|
699
712
|
return -1;
|
|
700
713
|
}
|
|
701
714
|
|
|
702
715
|
/* Initialize request */
|
|
703
|
-
uv__req_init(stream->loop,
|
|
716
|
+
uv__req_init(stream->loop, req, UV_SHUTDOWN);
|
|
704
717
|
req->handle = stream;
|
|
705
718
|
req->cb = cb;
|
|
706
|
-
|
|
707
719
|
stream->shutdown_req = req;
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
((uv_handle_t*)stream)->flags |= UV_SHUTTING;
|
|
711
|
-
|
|
720
|
+
stream->flags |= UV_STREAM_SHUTTING;
|
|
712
721
|
|
|
713
|
-
|
|
722
|
+
uv__io_start(stream->loop, &stream->write_watcher);
|
|
714
723
|
|
|
715
724
|
return 0;
|
|
716
725
|
}
|
|
717
726
|
|
|
718
727
|
|
|
719
|
-
void uv__stream_io(
|
|
720
|
-
uv_stream_t* stream
|
|
728
|
+
static void uv__stream_io(uv_loop_t* loop, uv__io_t* w, int events) {
|
|
729
|
+
uv_stream_t* stream;
|
|
721
730
|
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
731
|
+
/* either UV__IO_READ or UV__IO_WRITE but not both */
|
|
732
|
+
assert(!!(events & UV__IO_READ) ^ !!(events & UV__IO_WRITE));
|
|
733
|
+
|
|
734
|
+
if (events & UV__IO_READ)
|
|
735
|
+
stream = container_of(w, uv_stream_t, read_watcher);
|
|
736
|
+
else
|
|
737
|
+
stream = container_of(w, uv_stream_t, write_watcher);
|
|
738
|
+
|
|
739
|
+
assert(stream->type == UV_TCP ||
|
|
740
|
+
stream->type == UV_NAMED_PIPE ||
|
|
741
|
+
stream->type == UV_TTY);
|
|
726
742
|
assert(!(stream->flags & UV_CLOSING));
|
|
727
743
|
|
|
728
|
-
if (stream->connect_req)
|
|
744
|
+
if (stream->connect_req)
|
|
729
745
|
uv__stream_connect(stream);
|
|
730
|
-
|
|
731
|
-
assert(revents & (EV_READ | EV_WRITE));
|
|
746
|
+
else if (events & UV__IO_READ) {
|
|
732
747
|
assert(stream->fd >= 0);
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
uv__write(stream);
|
|
740
|
-
uv__write_callbacks(stream);
|
|
741
|
-
}
|
|
748
|
+
uv__read(stream);
|
|
749
|
+
}
|
|
750
|
+
else {
|
|
751
|
+
assert(stream->fd >= 0);
|
|
752
|
+
uv__write(stream);
|
|
753
|
+
uv__write_callbacks(stream);
|
|
742
754
|
}
|
|
743
755
|
}
|
|
744
756
|
|
|
@@ -769,32 +781,24 @@ static void uv__stream_connect(uv_stream_t* stream) {
|
|
|
769
781
|
getsockopt(stream->fd, SOL_SOCKET, SO_ERROR, &error, &errorsize);
|
|
770
782
|
}
|
|
771
783
|
|
|
772
|
-
if (
|
|
773
|
-
|
|
784
|
+
if (error == EINPROGRESS)
|
|
785
|
+
return;
|
|
774
786
|
|
|
775
|
-
|
|
776
|
-
stream->
|
|
777
|
-
if (req->cb) {
|
|
778
|
-
req->cb(req, 0);
|
|
779
|
-
}
|
|
787
|
+
if (error == 0)
|
|
788
|
+
uv__io_start(stream->loop, &stream->read_watcher);
|
|
780
789
|
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
return;
|
|
784
|
-
} else {
|
|
785
|
-
/* Error */
|
|
786
|
-
uv__set_sys_error(stream->loop, error);
|
|
790
|
+
stream->connect_req = NULL;
|
|
791
|
+
uv__req_unregister(stream->loop, req);
|
|
787
792
|
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
}
|
|
793
|
+
if (req->cb) {
|
|
794
|
+
uv__set_sys_error(stream->loop, error);
|
|
795
|
+
req->cb(req, error ? -1 : 0);
|
|
792
796
|
}
|
|
793
797
|
}
|
|
794
798
|
|
|
795
799
|
|
|
796
800
|
int uv__connect(uv_connect_t* req, uv_stream_t* stream, struct sockaddr* addr,
|
|
797
|
-
socklen_t addrlen, uv_connect_cb cb) {
|
|
801
|
+
socklen_t addrlen, uv_connect_cb cb) {
|
|
798
802
|
int sockfd;
|
|
799
803
|
int r;
|
|
800
804
|
|
|
@@ -804,16 +808,17 @@ int uv__connect(uv_connect_t* req, uv_stream_t* stream, struct sockaddr* addr,
|
|
|
804
808
|
return -1;
|
|
805
809
|
}
|
|
806
810
|
|
|
807
|
-
if (uv__stream_open(stream,
|
|
811
|
+
if (uv__stream_open(stream,
|
|
812
|
+
sockfd,
|
|
813
|
+
UV_STREAM_READABLE | UV_STREAM_WRITABLE)) {
|
|
808
814
|
close(sockfd);
|
|
809
815
|
return -2;
|
|
810
816
|
}
|
|
811
817
|
}
|
|
812
818
|
|
|
813
|
-
uv__req_init(stream->loop,
|
|
819
|
+
uv__req_init(stream->loop, req, UV_CONNECT);
|
|
814
820
|
req->cb = cb;
|
|
815
821
|
req->handle = stream;
|
|
816
|
-
req->type = UV_CONNECT;
|
|
817
822
|
ngx_queue_init(&req->queue);
|
|
818
823
|
|
|
819
824
|
if (stream->connect_req) {
|
|
@@ -853,12 +858,10 @@ int uv__connect(uv_connect_t* req, uv_stream_t* stream, struct sockaddr* addr,
|
|
|
853
858
|
}
|
|
854
859
|
}
|
|
855
860
|
|
|
856
|
-
|
|
857
|
-
ev_io_start(stream->loop->ev, &stream->write_watcher);
|
|
861
|
+
uv__io_start(stream->loop, &stream->write_watcher);
|
|
858
862
|
|
|
859
|
-
if (stream->delayed_error)
|
|
860
|
-
|
|
861
|
-
}
|
|
863
|
+
if (stream->delayed_error)
|
|
864
|
+
uv__io_feed(stream->loop, &stream->write_watcher, UV__IO_WRITE);
|
|
862
865
|
|
|
863
866
|
return 0;
|
|
864
867
|
}
|
|
@@ -887,54 +890,44 @@ int uv_write2(uv_write_t* req, uv_stream_t* stream, uv_buf_t bufs[], int bufcnt,
|
|
|
887
890
|
empty_queue = (stream->write_queue_size == 0);
|
|
888
891
|
|
|
889
892
|
/* Initialize the req */
|
|
890
|
-
uv__req_init(stream->loop,
|
|
893
|
+
uv__req_init(stream->loop, req, UV_WRITE);
|
|
891
894
|
req->cb = cb;
|
|
892
895
|
req->handle = stream;
|
|
893
896
|
req->error = 0;
|
|
894
897
|
req->send_handle = send_handle;
|
|
895
|
-
req->type = UV_WRITE;
|
|
896
898
|
ngx_queue_init(&req->queue);
|
|
897
899
|
|
|
898
|
-
if (bufcnt <= UV_REQ_BUFSML_SIZE)
|
|
900
|
+
if (bufcnt <= UV_REQ_BUFSML_SIZE)
|
|
899
901
|
req->bufs = req->bufsml;
|
|
900
|
-
|
|
901
|
-
else {
|
|
902
|
+
else
|
|
902
903
|
req->bufs = malloc(sizeof(uv_buf_t) * bufcnt);
|
|
903
|
-
}
|
|
904
904
|
|
|
905
905
|
memcpy(req->bufs, bufs, bufcnt * sizeof(uv_buf_t));
|
|
906
906
|
req->bufcnt = bufcnt;
|
|
907
|
-
|
|
908
|
-
/*
|
|
909
|
-
* fprintf(stderr, "cnt: %d bufs: %p bufsml: %p\n", bufcnt, req->bufs, req->bufsml);
|
|
910
|
-
*/
|
|
911
|
-
|
|
912
907
|
req->write_index = 0;
|
|
913
908
|
stream->write_queue_size += uv__buf_count(bufs, bufcnt);
|
|
914
909
|
|
|
915
910
|
/* Append the request to write_queue. */
|
|
916
911
|
ngx_queue_insert_tail(&stream->write_queue, &req->queue);
|
|
917
912
|
|
|
918
|
-
assert(!ngx_queue_empty(&stream->write_queue));
|
|
919
|
-
assert(stream->write_watcher.cb == uv__stream_io);
|
|
920
|
-
assert(stream->write_watcher.data == stream);
|
|
921
|
-
assert(stream->write_watcher.fd == stream->fd);
|
|
922
|
-
|
|
923
913
|
/* If the queue was empty when this function began, we should attempt to
|
|
924
914
|
* do the write immediately. Otherwise start the write_watcher and wait
|
|
925
915
|
* for the fd to become writable.
|
|
926
916
|
*/
|
|
927
|
-
if (
|
|
917
|
+
if (stream->connect_req) {
|
|
918
|
+
/* Still connecting, do nothing. */
|
|
919
|
+
}
|
|
920
|
+
else if (empty_queue) {
|
|
928
921
|
uv__write(stream);
|
|
929
|
-
}
|
|
922
|
+
}
|
|
923
|
+
else {
|
|
930
924
|
/*
|
|
931
925
|
* blocking streams should never have anything in the queue.
|
|
932
926
|
* if this assert fires then somehow the blocking stream isn't being
|
|
933
|
-
*
|
|
927
|
+
* sufficiently flushed in uv__write.
|
|
934
928
|
*/
|
|
935
|
-
assert(!stream->
|
|
936
|
-
|
|
937
|
-
ev_io_start(stream->loop->ev, &stream->write_watcher);
|
|
929
|
+
assert(!(stream->flags & UV_STREAM_BLOCKING));
|
|
930
|
+
uv__io_start(stream->loop, &stream->write_watcher);
|
|
938
931
|
}
|
|
939
932
|
|
|
940
933
|
return 0;
|
|
@@ -960,10 +953,10 @@ int uv__read_start_common(uv_stream_t* stream, uv_alloc_cb alloc_cb,
|
|
|
960
953
|
return -1;
|
|
961
954
|
}
|
|
962
955
|
|
|
963
|
-
/* The
|
|
956
|
+
/* The UV_STREAM_READING flag is irrelevant of the state of the tcp - it just
|
|
964
957
|
* expresses the desired state of the user.
|
|
965
958
|
*/
|
|
966
|
-
|
|
959
|
+
stream->flags |= UV_STREAM_READING;
|
|
967
960
|
|
|
968
961
|
/* TODO: try to do the read inline? */
|
|
969
962
|
/* TODO: keep track of tcp state. If we've gotten a EOF then we should
|
|
@@ -976,10 +969,9 @@ int uv__read_start_common(uv_stream_t* stream, uv_alloc_cb alloc_cb,
|
|
|
976
969
|
stream->read2_cb = read2_cb;
|
|
977
970
|
stream->alloc_cb = alloc_cb;
|
|
978
971
|
|
|
979
|
-
|
|
980
|
-
|
|
972
|
+
uv__io_start(stream->loop, &stream->read_watcher);
|
|
973
|
+
uv__handle_start(stream);
|
|
981
974
|
|
|
982
|
-
ev_io_start(stream->loop->ev, &stream->read_watcher);
|
|
983
975
|
return 0;
|
|
984
976
|
}
|
|
985
977
|
|
|
@@ -997,8 +989,9 @@ int uv_read2_start(uv_stream_t* stream, uv_alloc_cb alloc_cb,
|
|
|
997
989
|
|
|
998
990
|
|
|
999
991
|
int uv_read_stop(uv_stream_t* stream) {
|
|
1000
|
-
|
|
1001
|
-
stream
|
|
992
|
+
uv__io_stop(stream->loop, &stream->read_watcher);
|
|
993
|
+
uv__handle_stop(stream);
|
|
994
|
+
stream->flags &= ~UV_STREAM_READING;
|
|
1002
995
|
stream->read_cb = NULL;
|
|
1003
996
|
stream->read2_cb = NULL;
|
|
1004
997
|
stream->alloc_cb = NULL;
|
|
@@ -1006,19 +999,19 @@ int uv_read_stop(uv_stream_t* stream) {
|
|
|
1006
999
|
}
|
|
1007
1000
|
|
|
1008
1001
|
|
|
1009
|
-
int uv_is_readable(uv_stream_t* stream) {
|
|
1010
|
-
return stream->flags &
|
|
1002
|
+
int uv_is_readable(const uv_stream_t* stream) {
|
|
1003
|
+
return stream->flags & UV_STREAM_READABLE;
|
|
1011
1004
|
}
|
|
1012
1005
|
|
|
1013
1006
|
|
|
1014
|
-
int uv_is_writable(uv_stream_t* stream) {
|
|
1015
|
-
return stream->flags &
|
|
1007
|
+
int uv_is_writable(const uv_stream_t* stream) {
|
|
1008
|
+
return stream->flags & UV_STREAM_WRITABLE;
|
|
1016
1009
|
}
|
|
1017
1010
|
|
|
1018
1011
|
|
|
1019
1012
|
void uv__stream_close(uv_stream_t* handle) {
|
|
1020
1013
|
uv_read_stop(handle);
|
|
1021
|
-
|
|
1014
|
+
uv__io_stop(handle->loop, &handle->write_watcher);
|
|
1022
1015
|
|
|
1023
1016
|
close(handle->fd);
|
|
1024
1017
|
handle->fd = -1;
|
|
@@ -1028,6 +1021,6 @@ void uv__stream_close(uv_stream_t* handle) {
|
|
|
1028
1021
|
handle->accepted_fd = -1;
|
|
1029
1022
|
}
|
|
1030
1023
|
|
|
1031
|
-
assert(!
|
|
1032
|
-
assert(!
|
|
1024
|
+
assert(!uv__io_active(&handle->read_watcher));
|
|
1025
|
+
assert(!uv__io_active(&handle->write_watcher));
|
|
1033
1026
|
}
|