diff options
author | kosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-12-15 05:39:57 +0000 |
---|---|---|
committer | kosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-12-15 05:39:57 +0000 |
commit | 2a4d86f385c4d4fd3f4195e8dbb0aa61ae4f8eea (patch) | |
tree | 97c4390fc9b92554d18e8a269cb5f48e01cba967 /io.c | |
parent | 96350867e1a003ecc40e987ea4bf55c069e519fd (diff) | |
download | ruby-2a4d86f385c4d4fd3f4195e8dbb0aa61ae4f8eea.tar.gz |
* io.c (internal_write_func2): new helper function for rb_write_internal2().
* io.c (rb_write_internal2): new function. it uses
rb_thread_call_without_gvl2() instaed of rb_thread_io_blocking_region().
* io.c (rb_binwrite_string): uses rb_write_internal2 instead of
rb_write_internal. [Bug #7134]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38398 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'io.c')
-rw-r--r-- | io.c | 21 |
1 files changed, 20 insertions, 1 deletions
@@ -900,6 +900,13 @@ internal_write_func(void *ptr) return write(iis->fd, iis->buf, iis->capa); } +static void* +internal_write_func2(void *ptr) +{ + struct io_internal_write_struct *iis = ptr; + return (void*)(intptr_t)write(iis->fd, iis->buf, iis->capa); +} + static ssize_t rb_read_internal(int fd, void *buf, size_t count) { @@ -922,6 +929,18 @@ rb_write_internal(int fd, const void *buf, size_t count) return (ssize_t)rb_thread_io_blocking_region(internal_write_func, &iis, fd); } +static ssize_t +rb_write_internal2(int fd, const void *buf, size_t count) +{ + struct io_internal_write_struct iis; + iis.fd = fd; + iis.buf = buf; + iis.capa = count; + + return (ssize_t)rb_thread_call_without_gvl2(internal_write_func2, &iis, + RUBY_UBF_IO, NULL); +} + static long io_writable_length(rb_io_t *fptr, long l) { @@ -1112,7 +1131,7 @@ io_binwrite_string(VALUE arg) { struct binwrite_arg *p = (struct binwrite_arg *)arg; long l = io_writable_length(p->fptr, p->length); - return rb_write_internal(p->fptr->fd, p->ptr, l); + return rb_write_internal2(p->fptr->fd, p->ptr, l); } static long |