summaryrefslogtreecommitdiff
path: root/io.c
diff options
context:
space:
mode:
authorkosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-12-15 05:40:07 +0000
committerkosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-12-15 05:40:07 +0000
commit9bd33790b7f992520f003954df743dd6e8502622 (patch)
treefcdc4ec49bc68dc44ad57e9a4622a8aac542382e /io.c
parent2a4d86f385c4d4fd3f4195e8dbb0aa61ae4f8eea (diff)
* io.c (io_flush_buffer): uses io_flush_buffer_async2 instead of
io_flush_buffer_async. * io.c (io_flush_buffer_async2): new helper function for io_flush_buffer. It uses rb_thread_call_without_gvl2() instead of rb_thread_io_blocking_region. * io.c (io_flush_buffer_sync2): new helper function for io_flush_buffer_async2. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38399 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'io.c')
-rw-r--r--io.c25
1 files changed, 24 insertions, 1 deletions
diff --git a/io.c b/io.c
index 8b7a9c9d1c..f529658bdb 100644
--- a/io.c
+++ b/io.c
@@ -972,6 +972,12 @@ io_flush_buffer_sync(void *arg)
return (VALUE)-1;
}
+static void*
+io_flush_buffer_sync2(void *arg)
+{
+ return (void*)io_flush_buffer_sync(arg);
+}
+
static VALUE
io_flush_buffer_async(VALUE arg)
{
@@ -979,11 +985,28 @@ io_flush_buffer_async(VALUE arg)
return rb_thread_io_blocking_region(io_flush_buffer_sync, fptr, fptr->fd);
}
+static VALUE
+io_flush_buffer_async2(VALUE arg)
+{
+ rb_io_t *fptr = (rb_io_t *)arg;
+ void *ret;
+
+ ret = rb_thread_call_without_gvl2(io_flush_buffer_sync2, fptr,
+ RUBY_UBF_IO, NULL);
+
+ /* pending async interrupt is there. */
+ if (!ret) {
+ errno = EAGAIN;
+ return (VALUE)-1;
+ }
+ return (VALUE) ret;
+}
+
static inline int
io_flush_buffer(rb_io_t *fptr)
{
if (fptr->write_lock) {
- return (int)rb_mutex_synchronize(fptr->write_lock, io_flush_buffer_async, (VALUE)fptr);
+ return (int)rb_mutex_synchronize(fptr->write_lock, io_flush_buffer_async2, (VALUE)fptr);
}
else {
return (int)io_flush_buffer_async((VALUE)fptr);