From 6a65f2b1e479f268489b51a004b6c153c634c68a Mon Sep 17 00:00:00 2001 From: normal Date: Thu, 22 Nov 2018 08:46:51 +0000 Subject: io + socket: make pipes and sockets nonblocking by default All normal Ruby IO methods (IO#read, IO#gets, IO#write, ...) are all capable of appearing to be "blocking" when presented with a file description with the O_NONBLOCK flag set; so there is little risk of incompatibility within Ruby-using programs. The biggest compatibility risk is when spawning external programs. As a result, stdin, stdout, and stderr are now always made blocking before exec-family calls. This change will make an event-oriented MJIT usable if it is waiting on pipes on POSIX_like platforms. It is ALSO necessary to take advantage of (proposed lightweight concurrency (aka "auto-Fiber") or any similar proposal for network concurrency: https://bugs.ruby-lang.org/issues/13618 Named-pipe (FIFO) are NOT yet non-blocking by default since they are rarely-used and may introduce compatibility problems and extra syscall overhead for a common path. Please revert this commit if there are problems and if I am afk since I am afk a lot, lately. [ruby-core:89950] [Bug #14968] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@65922 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- win32/win32.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) (limited to 'win32/win32.c') diff --git a/win32/win32.c b/win32/win32.c index 820b16c40b..d28bd56452 100644 --- a/win32/win32.c +++ b/win32/win32.c @@ -4429,11 +4429,11 @@ fcntl(int fd, int cmd, ...) /* License: Ruby's */ int -rb_w32_set_nonblock(int fd) +rb_w32_set_nonblock2(int fd, int nonblock) { SOCKET sock = TO_SOCKET(fd); if (is_socket(sock)) { - return setfl(sock, O_NONBLOCK); + return setfl(sock, nonblock ? O_NONBLOCK : 0); } else if (is_pipe(sock)) { DWORD state; @@ -4441,7 +4441,12 @@ rb_w32_set_nonblock(int fd) errno = map_errno(GetLastError()); return -1; } - state |= PIPE_NOWAIT; + if (nonblock) { + state |= PIPE_NOWAIT; + } + else { + state &= ~PIPE_NOWAIT; + } if (!SetNamedPipeHandleState((HANDLE)sock, &state, NULL, NULL)) { errno = map_errno(GetLastError()); return -1; @@ -4454,6 +4459,12 @@ rb_w32_set_nonblock(int fd) } } +int +rb_w32_set_nonblock(int fd) +{ + return rb_w32_set_nonblock2(fd, TRUE); +} + #ifndef WNOHANG #define WNOHANG -1 #endif -- cgit v1.2.3