summaryrefslogtreecommitdiff
path: root/io.c
diff options
context:
space:
mode:
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