summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorkosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-09-12 11:41:30 +0000
committerkosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-09-12 11:41:30 +0000
commit167f6b291f4cf697048af42820c82d8cf357e0a7 (patch)
tree750e7c085bad1a44d7856f5d650ae3a5c7a75f61 /ext
parente0eaa117d2bae9968258ec0e14bab667998abe66 (diff)
merge revision(s) 33256:
* 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/branches/ruby_1_9_3@33257 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext')
-rw-r--r--ext/-test-/old_thread_select/old_thread_select.c19
1 files changed, 19 insertions, 0 deletions
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);
}