diff options
author | nagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-07-02 09:15:33 +0000 |
---|---|---|
committer | nagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-07-02 09:15:33 +0000 |
commit | fcb4a3d88fa38589239281b1b670b95fba47b277 (patch) | |
tree | 0d8ebfab3a5c757ad26df8cfbc0a57ada506a404 /io.c | |
parent | 4a625f839ccd9f226fcef95499c4b48702cc0b69 (diff) |
merge revision(s) 63304: [Backport #14713]
io.c: workaround for EPROTOTYPE
* io.c (internal_write_func, internal_writev_func): retry at
unexpected EPROTOTYPE on macOS, to get rid of a kernel bug.
[ruby-core:86690] [Bug #14713]
* ext/socket/init.c (rsock_{sendto,send,write}_blocking): ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_5@63826 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'io.c')
-rw-r--r-- | io.c | 13 |
1 files changed, 11 insertions, 2 deletions
@@ -937,11 +937,18 @@ internal_read_func(void *ptr) return read(iis->fd, iis->buf, iis->capa); } +#if defined __APPLE__ +# define do_write_retry(code) do {ret = code;} while (ret == -1 && errno == EPROTOTYPE) +#else +# define do_write_retry(code) ret = code +#endif static VALUE internal_write_func(void *ptr) { struct io_internal_write_struct *iis = ptr; - return write(iis->fd, iis->buf, iis->capa); + ssize_t ret; + do_write_retry(write(iis->fd, iis->buf, iis->capa)); + return (VALUE)ret; } static void* @@ -956,7 +963,9 @@ static VALUE internal_writev_func(void *ptr) { struct io_internal_writev_struct *iis = ptr; - return writev(iis->fd, iis->iov, iis->iovcnt); + ssize_t ret; + do_write_retry(writev(iis->fd, iis->iov, iis->iovcnt)); + return (VALUE)ret; } #endif |