diff options
author | kosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-08-30 00:33:05 +0000 |
---|---|---|
committer | kosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-08-30 00:33:05 +0000 |
commit | 0cebfad20ab9eb694eeb95f083635127cfbf35f9 (patch) | |
tree | 702a719d30aede3531ae8f7b37d5438ca8bceea6 /ext/-test- | |
parent | f3ef9346d1da0a4fdc1162e6c0832a38a7ea9f81 (diff) | |
download | ruby-0cebfad20ab9eb694eeb95f083635127cfbf35f9.tar.gz |
* thread.c (rb_thread_select): rewrite by using
rb_thread_fd_select(). old one is EINTR unsafe.
Patch by Eric Wong. [Bug #5229] [ruby-core:39102]
* test/-ext-/old_thread_select/test_old_thread_select.rb:
a testcase for rb_thread_select().
* ext/-test-/old_thread_select/old_thread_select.c: ditto.
* ext/-test-/old_thread_select/depend: ditto.
* ext/-test-/old_thread_select/extconf.rb: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@33117 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/-test-')
-rw-r--r-- | ext/-test-/old_thread_select/depend | 2 | ||||
-rw-r--r-- | ext/-test-/old_thread_select/extconf.rb | 1 | ||||
-rw-r--r-- | ext/-test-/old_thread_select/old_thread_select.c | 56 |
3 files changed, 59 insertions, 0 deletions
diff --git a/ext/-test-/old_thread_select/depend b/ext/-test-/old_thread_select/depend new file mode 100644 index 0000000000..a2bc836e1f --- /dev/null +++ b/ext/-test-/old_thread_select/depend @@ -0,0 +1,2 @@ +old_thread_select.o: $(top_srcdir)/thread.c \ + $(hdrdir)/ruby/ruby.h $(hdrdir)/ruby/io.h diff --git a/ext/-test-/old_thread_select/extconf.rb b/ext/-test-/old_thread_select/extconf.rb new file mode 100644 index 0000000000..8b410218fa --- /dev/null +++ b/ext/-test-/old_thread_select/extconf.rb @@ -0,0 +1 @@ +create_makefile("-test-/old_thread_select/old_thread_select") diff --git a/ext/-test-/old_thread_select/old_thread_select.c b/ext/-test-/old_thread_select/old_thread_select.c new file mode 100644 index 0000000000..0c9cab58fd --- /dev/null +++ b/ext/-test-/old_thread_select/old_thread_select.c @@ -0,0 +1,56 @@ +/* test case for deprecated C API */ +#include "ruby/ruby.h" +#include "ruby/io.h" + +static fd_set * array2fdset(fd_set *fds, VALUE ary, int *max) +{ + long i; + + if (NIL_P(ary)) + return NULL; + + FD_ZERO(fds); + Check_Type(ary, T_ARRAY); + for (i = 0; i < RARRAY_LEN(ary); i++) { + VALUE val = RARRAY_PTR(ary)[i]; + int fd; + + Check_Type(val, T_FIXNUM); + fd = FIX2INT(val); + if (fd >= *max) + *max = fd + 1; + FD_SET(fd, fds); + } + + return fds; +} + +static VALUE +old_thread_select(VALUE klass, VALUE r, VALUE w, VALUE e, VALUE timeout) +{ + struct timeval tv; + struct timeval *tvp = NULL; + fd_set rfds, wfds, efds; + fd_set *rp, *wp, *ep; + int rc; + int max = 0; + + if (!NIL_P(timeout)) { + tv = rb_time_timeval(timeout); + tvp = &tv; + } + rp = array2fdset(&rfds, r, &max); + wp = array2fdset(&wfds, w, &max); + ep = array2fdset(&efds, w, &max); + rc = rb_thread_select(max, rp, wp, ep, tvp); + if (rc == -1) + rb_sys_fail("rb_wait_for_single_fd"); + return INT2NUM(rc); +} + +void +Init_old_thread_select(void) +{ + rb_define_singleton_method(rb_cIO, "old_thread_select", + old_thread_select, 4); +} |