* 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
This commit is contained in:
kosaki 2012-12-15 05:40:07 +00:00
Родитель 2a4d86f385
Коммит 9bd33790b7
2 изменённых файлов: 34 добавлений и 1 удалений

Просмотреть файл

@ -1,3 +1,13 @@
Sat Dec 15 13:38:30 2012 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
* 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.
Sat Dec 15 13:04:26 2012 KOSAKI Motohiro <kosaki.motohiro@gmail.com> Sat Dec 15 13:04:26 2012 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
* io.c (internal_write_func2): new helper function for rb_write_internal2(). * io.c (internal_write_func2): new helper function for rb_write_internal2().

25
io.c
Просмотреть файл

@ -972,6 +972,12 @@ io_flush_buffer_sync(void *arg)
return (VALUE)-1; return (VALUE)-1;
} }
static void*
io_flush_buffer_sync2(void *arg)
{
return (void*)io_flush_buffer_sync(arg);
}
static VALUE static VALUE
io_flush_buffer_async(VALUE arg) 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); 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 static inline int
io_flush_buffer(rb_io_t *fptr) io_flush_buffer(rb_io_t *fptr)
{ {
if (fptr->write_lock) { 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 { else {
return (int)io_flush_buffer_async((VALUE)fptr); return (int)io_flush_buffer_async((VALUE)fptr);