summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-04-12 00:53:28 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-04-12 00:53:28 +0000
commitb850ec46801524eaeb5c7a8d6f8edfd428db787e (patch)
treec3ff46997d4b3c5c9dbb8e2ba7e9b8c92e1379ac
parent77ea0461c9cf437a3527c12086d02c3febf52bd3 (diff)
downloadruby-b850ec46801524eaeb5c7a8d6f8edfd428db787e.tar.gz
wait.c: wait_for_single_fd
* ext/io/wait/wait.c (wait_for_single_fd): extract wrapper function of rb_wait_for_single_fd(). git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@50247 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ext/io/wait/wait.c24
1 files changed, 13 insertions, 11 deletions
diff --git a/ext/io/wait/wait.c b/ext/io/wait/wait.c
index ca37d8e84a..2a4a10306a 100644
--- a/ext/io/wait/wait.c
+++ b/ext/io/wait/wait.c
@@ -58,6 +58,16 @@ get_timeout(int argc, VALUE *argv, struct timeval *timerec)
}
}
+static int
+wait_for_single_fd(rb_io_t *fptr, int events, struct timeval *tv)
+{
+ int i = rb_wait_for_single_fd(fptr->fd, events, tv);
+ if (i < 0)
+ rb_sys_fail(0);
+ rb_io_check_closed(fptr);
+ return (i & events);
+}
+
/*
* call-seq:
* io.nread -> int
@@ -121,7 +131,6 @@ static VALUE
io_wait_readable(int argc, VALUE *argv, VALUE io)
{
rb_io_t *fptr;
- int i;
ioctl_arg n;
struct timeval timerec;
struct timeval *tv;
@@ -131,10 +140,7 @@ io_wait_readable(int argc, VALUE *argv, VALUE io)
tv = get_timeout(argc, argv, &timerec);
if (rb_io_read_pending(fptr)) return Qtrue;
if (!FIONREAD_POSSIBLE_P(fptr->fd)) return Qfalse;
- i = rb_wait_for_single_fd(fptr->fd, RB_WAITFD_IN, tv);
- if (i < 0)
- rb_sys_fail(0);
- rb_io_check_closed(fptr);
+ wait_for_single_fd(fptr, RB_WAITFD_IN, tv);
if (ioctl(fptr->fd, FIONREAD, &n)) rb_sys_fail(0);
if (n > 0) return io;
return Qnil;
@@ -152,19 +158,15 @@ static VALUE
io_wait_writable(int argc, VALUE *argv, VALUE io)
{
rb_io_t *fptr;
- int i;
struct timeval timerec;
struct timeval *tv;
GetOpenFile(io, fptr);
rb_io_check_writable(fptr);
tv = get_timeout(argc, argv, &timerec);
- i = rb_wait_for_single_fd(fptr->fd, RB_WAITFD_OUT, tv);
- if (i < 0)
- rb_sys_fail(0);
- rb_io_check_closed(fptr);
- if (i & RB_WAITFD_OUT)
+ if (wait_for_single_fd(fptr, RB_WAITFD_OUT, tv)) {
return io;
+ }
return Qnil;
}