diff options
author | kosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-12-15 05:40:07 +0000 |
---|---|---|
committer | kosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-12-15 05:40:07 +0000 |
commit | 9bd33790b7f992520f003954df743dd6e8502622 (patch) | |
tree | fcdc4ec49bc68dc44ad57e9a4622a8aac542382e /io.c | |
parent | 2a4d86f385c4d4fd3f4195e8dbb0aa61ae4f8eea (diff) | |
download | ruby-9bd33790b7f992520f003954df743dd6e8502622.tar.gz |
* 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.c | 25 |
1 files changed, 24 insertions, 1 deletions
@@ -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); |