From 2f5c82c26aeaf3536deace3521097d3e9eaefc20 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Fri, 1 Mar 2013 19:50:27 +0000 Subject: reload FD after rb_io_wait_*able functions The file descriptor may be closed while GVL is released, so we must reload the descriptor before and after calling rb_io_wait_*able functions. We reload before calling rb_io_wait_*able because the GVL was released for the function call (read/write) which triggered EAGAIN. We reload after calling rb_io_wait_*able because rb_io_wait_*able releases the GVL, too. --- ext/sleepy_penguin/eventfd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'ext/sleepy_penguin/eventfd.c') diff --git a/ext/sleepy_penguin/eventfd.c b/ext/sleepy_penguin/eventfd.c index 9d75c91..3ba8397 100644 --- a/ext/sleepy_penguin/eventfd.c +++ b/ext/sleepy_penguin/eventfd.c @@ -91,7 +91,7 @@ retry: if (w == -1) { if (errno == EAGAIN && RTEST(nonblock)) return Qfalse; - if (rb_io_wait_writable(x.fd)) + if (rb_sp_wait(rb_io_wait_writable, self, &x.fd)) goto retry; rb_sys_fail("write(eventfd)"); } @@ -127,7 +127,7 @@ retry: if (w == -1) { if (errno == EAGAIN && RTEST(nonblock)) return Qnil; - if (rb_io_wait_readable(x.fd = rb_sp_fileno(self))) + if (rb_sp_wait(rb_io_wait_readable, self, &x.fd)) goto retry; rb_sys_fail("read(eventfd)"); } -- cgit v1.2.3-24-ge0c7