From 2a989121db8f80aceeadb5d403af79d4b30e1bb8 Mon Sep 17 00:00:00 2001 From: kosaki Date: Wed, 4 May 2011 09:50:27 +0000 Subject: [PATCH] * ext/-test-/wait_for_single_fd: New. for testing rb_wait_for_single_fd() internal function. The patch was written by Eric Wong. [ruby-core:35991] * test/-ext-/wait_for_single_fd/test_wait_for_single_fd.rb: ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@31428 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 8 +++++ ext/-test-/wait_for_single_fd/depend | 2 ++ ext/-test-/wait_for_single_fd/extconf.rb | 1 + .../wait_for_single_fd/wait_for_single_fd.c | 30 +++++++++++++++++ .../test_wait_for_single_fd.rb | 32 +++++++++++++++++++ 5 files changed, 73 insertions(+) create mode 100644 ext/-test-/wait_for_single_fd/depend create mode 100644 ext/-test-/wait_for_single_fd/extconf.rb create mode 100644 ext/-test-/wait_for_single_fd/wait_for_single_fd.c create mode 100644 test/-ext-/wait_for_single_fd/test_wait_for_single_fd.rb diff --git a/ChangeLog b/ChangeLog index 68a925a485..a6b9beff14 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +Wed May 4 18:46:39 2011 KOSAKI Motohiro + + * ext/-test-/wait_for_single_fd: New. for testing + rb_wait_for_single_fd() internal function. + The patch was written by Eric Wong. [ruby-core:35991] + + * test/-ext-/wait_for_single_fd/test_wait_for_single_fd.rb: ditto. + Wed May 4 12:46:25 2011 KOSAKI Motohiro * thread.c (rb_wait_for_single_fd): Added POLLNVAL check. diff --git a/ext/-test-/wait_for_single_fd/depend b/ext/-test-/wait_for_single_fd/depend new file mode 100644 index 0000000000..d9cd50a542 --- /dev/null +++ b/ext/-test-/wait_for_single_fd/depend @@ -0,0 +1,2 @@ +wait_for_single_fd.o: $(top_srcdir)/thread.c \ + $(hdrdir)/ruby/ruby.h $(hdrdir)/ruby/io.h diff --git a/ext/-test-/wait_for_single_fd/extconf.rb b/ext/-test-/wait_for_single_fd/extconf.rb new file mode 100644 index 0000000000..1a28b23da3 --- /dev/null +++ b/ext/-test-/wait_for_single_fd/extconf.rb @@ -0,0 +1 @@ +create_makefile("-test-/wait_for_single_fd/wait_for_single_fd") diff --git a/ext/-test-/wait_for_single_fd/wait_for_single_fd.c b/ext/-test-/wait_for_single_fd/wait_for_single_fd.c new file mode 100644 index 0000000000..d406724a3f --- /dev/null +++ b/ext/-test-/wait_for_single_fd/wait_for_single_fd.c @@ -0,0 +1,30 @@ +#include "ruby/ruby.h" +#include "ruby/io.h" + +static VALUE +wait_for_single_fd(VALUE ign, VALUE fd, VALUE events, VALUE timeout) +{ + struct timeval tv; + struct timeval *tvp = NULL; + int rc; + + if (!NIL_P(timeout)) { + tv = rb_time_timeval(timeout); + tvp = &tv; + } + + rc = rb_wait_for_single_fd(NUM2INT(fd), NUM2INT(events), tvp); + if (rc == -1) + rb_sys_fail("rb_wait_for_single_fd"); + return INT2NUM(rc); +} + +void +Init_wait_for_single_fd(void) +{ + rb_define_const(rb_cObject, "RB_WAITFD_IN", INT2NUM(RB_WAITFD_IN)); + rb_define_const(rb_cObject, "RB_WAITFD_OUT", INT2NUM(RB_WAITFD_OUT)); + rb_define_const(rb_cObject, "RB_WAITFD_PRI", INT2NUM(RB_WAITFD_PRI)); + rb_define_singleton_method(rb_cIO, "wait_for_single_fd", + wait_for_single_fd, 3); +} diff --git a/test/-ext-/wait_for_single_fd/test_wait_for_single_fd.rb b/test/-ext-/wait_for_single_fd/test_wait_for_single_fd.rb new file mode 100644 index 0000000000..76ef68002a --- /dev/null +++ b/test/-ext-/wait_for_single_fd/test_wait_for_single_fd.rb @@ -0,0 +1,32 @@ +require 'test/unit' + +class TestWaitForSingleFD < Test::Unit::TestCase + require '-test-/wait_for_single_fd/wait_for_single_fd' + + def with_pipe + r, w = IO.pipe + begin + yield r, w + ensure + r.close unless r.closed? + w.close unless w.closed? + end + end + + def test_wait_for_valid_fd + with_pipe do |r,w| + rc = IO.wait_for_single_fd(w.fileno, RB_WAITFD_OUT, nil) + assert_equal RB_WAITFD_OUT, rc + end + end + + def test_wait_for_invalid_fd + with_pipe do |r,w| + wfd = w.fileno + w.close + assert_raises(Errno::EBADF) do + IO.wait_for_single_fd(wfd, RB_WAITFD_OUT, nil) + end + end + end +end