зеркало из https://github.com/github/ruby.git
* 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:
Родитель
2a4d86f385
Коммит
9bd33790b7
10
ChangeLog
10
ChangeLog
|
@ -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>
|
||||
|
||||
* io.c (internal_write_func2): new helper function for rb_write_internal2().
|
||||
|
|
25
io.c
25
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);
|
||||
|
|
Загрузка…
Ссылка в новой задаче