зеркало из 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>
|
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
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);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче