summaryrefslogtreecommitdiff
path: root/io.c
diff options
context:
space:
mode:
authorkosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-12-15 05:39:57 +0000
committerkosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-12-15 05:39:57 +0000
commit2a4d86f385c4d4fd3f4195e8dbb0aa61ae4f8eea (patch)
tree97c4390fc9b92554d18e8a269cb5f48e01cba967 /io.c
parent96350867e1a003ecc40e987ea4bf55c069e519fd (diff)
* 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.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/io.c b/io.c
index 951505c6a4..8b7a9c9d1c 100644
--- a/io.c
+++ b/io.c
@@ -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