From 2c9375ba69c5bfba56e8cc1ab4ac7c2ff01d24f3 Mon Sep 17 00:00:00 2001 From: kosaki Date: Mon, 12 Sep 2011 11:36:06 +0000 Subject: * thread.c (rb_thread_select): fix to ignore an argument modification of rb_thread_fd_select(). based on a patch by Eric Wong. [Bug #5306] [ruby-core:39435] * thread.c (rb_fd_rcopy): New. for reverse fd copy. * test/-ext-/old_thread_select/test_old_thread_select.rb (test_old_select_false_positive): test for bug5306. * ext/-test-/old_thread_select/old_thread_select.c (fdset2array): New. convert fdsets to array. * ext/-test-/old_thread_select/old_thread_select.c (old_thread_select): return 'read', 'write', 'except' argument of rb_thread_select() to ruby script. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@33256 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ext/-test-/old_thread_select/old_thread_select.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'ext/-test-') diff --git a/ext/-test-/old_thread_select/old_thread_select.c b/ext/-test-/old_thread_select/old_thread_select.c index 881cb7db9f..e374f02355 100644 --- a/ext/-test-/old_thread_select/old_thread_select.c +++ b/ext/-test-/old_thread_select/old_thread_select.c @@ -25,6 +25,18 @@ static fd_set * array2fdset(fd_set *fds, VALUE ary, int *max) return fds; } +static void fdset2array(VALUE dst, fd_set *fds, int max) +{ + int i; + + rb_ary_clear(dst); + + for (i = 0; i < max; i++) { + if (FD_ISSET(i, fds)) + rb_ary_push(dst, INT2NUM(i)); + } +} + static VALUE old_thread_select(VALUE klass, VALUE r, VALUE w, VALUE e, VALUE timeout) { @@ -45,6 +57,13 @@ old_thread_select(VALUE klass, VALUE r, VALUE w, VALUE e, VALUE timeout) rc = rb_thread_select(max, rp, wp, ep, tvp); if (rc == -1) rb_sys_fail("rb_wait_for_single_fd"); + + if (rp) + fdset2array(r, &rfds, max); + if (wp) + fdset2array(w, &wfds, max); + if (ep) + fdset2array(e, &efds, max); return INT2NUM(rc); } -- cgit v1.2.3