about summary refs log tree commit homepage
path: root/ext/sleepy_penguin/signalfd.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/sleepy_penguin/signalfd.c')
-rw-r--r--ext/sleepy_penguin/signalfd.c35
1 files changed, 10 insertions, 25 deletions
diff --git a/ext/sleepy_penguin/signalfd.c b/ext/sleepy_penguin/signalfd.c
index 67a35f0..d261bcf 100644
--- a/ext/sleepy_penguin/signalfd.c
+++ b/ext/sleepy_penguin/signalfd.c
@@ -160,8 +160,7 @@ static VALUE ssi_init(VALUE self)
         return self;
 }
 
-#ifdef HAVE_RB_THREAD_BLOCKING_REGION
-static VALUE xread(void *args)
+static VALUE sfd_read(void *args)
 {
         struct signalfd_siginfo *ssi = args;
         int fd = ssi->ssi_fd;
@@ -170,26 +169,6 @@ static VALUE xread(void *args)
         return (VALUE)r;
 }
 
-static ssize_t do_sfd_read(struct signalfd_siginfo *ssi)
-{
-        return (ssize_t)rb_thread_blocking_region(xread, ssi, RUBY_UBF_IO, 0);
-}
-#else /* ! HAVE_RB_THREAD_BLOCKING_REGION */
-static ssize_t do_sfd_read(struct signalfd_siginfo *ssi)
-{
-        int fd = ssi->ssi_fd;
-        ssize_t r;
-
-        rb_sp_set_nonblock(fd);
-
-        do
-                r = read(fd, ssi, sizeof(struct signalfd_siginfo));
-        while (r == -1 && rb_io_wait_readable(fd));
-
-        return r;
-}
-#endif /* ! HAVE_RB_THREAD_BLOCKING_REGION */
-
 /*
  * call-seq:
  *        sfd.take -> SignalFD::SigInfo object
@@ -201,11 +180,17 @@ static VALUE sfd_take(VALUE self)
         VALUE rv = ssi_alloc(cSigInfo);
         struct signalfd_siginfo *ssi = DATA_PTR(rv);
         ssize_t r;
+        int fd;
 
-        ssi->ssi_fd = rb_sp_fileno(self);
-        r = do_sfd_read(ssi);
-        if (r < 0)
+        fd = ssi->ssi_fd = rb_sp_fileno(self);
+        blocking_io_prepare(fd);
+retry:
+        r = (ssize_t)rb_sp_io_region(sfd_read, ssi);
+        if (r == -1) {
+                if (rb_io_wait_readable(fd))
+                        goto retry;
                 rb_sys_fail("read(signalfd)");
+        }
         if (r == 0)
                 rb_eof_error();
         return rv;