ruby-changes:21208
From: kosaki <ko1@a...>
Date: Mon, 12 Sep 2011 20:41:41 +0900 (JST)
Subject: [ruby-changes:21208] kosaki:r33257 (ruby_1_9_3): merge revision(s) 33256:
kosaki 2011-09-12 20:41:30 +0900 (Mon, 12 Sep 2011) New Revision: 33257 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=33257 Log: 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. Modified files: branches/ruby_1_9_3/ChangeLog branches/ruby_1_9_3/ext/-test-/old_thread_select/old_thread_select.c branches/ruby_1_9_3/test/-ext-/old_thread_select/test_old_thread_select.rb branches/ruby_1_9_3/thread.c branches/ruby_1_9_3/version.h Index: ruby_1_9_3/ChangeLog =================================================================== --- ruby_1_9_3/ChangeLog (revision 33256) +++ ruby_1_9_3/ChangeLog (revision 33257) @@ -1,3 +1,19 @@ +Mon Sep 12 20:41:20 2011 KOSAKI Motohiro <kosaki.motohiro@g...> + + * 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. + Tue Sep 6 13:15:44 2011 Nobuyoshi Nakada <nobu@r...> * encoding.c (load_encoding): predefined encoding names are safe. Index: ruby_1_9_3/thread.c =================================================================== --- ruby_1_9_3/thread.c (revision 33256) +++ ruby_1_9_3/thread.c (revision 33257) @@ -2391,6 +2391,17 @@ memcpy(dst->fdset, src, size); } +static void +rb_fd_rcopy(fd_set *dst, rb_fdset_t *src) +{ + size_t size = howmany(rb_fd_max(src), NFDBITS) * sizeof(fd_mask); + + if (size > sizeof(fd_set)) { + rb_raise(rb_eArgError, "too large fdsets"); + } + memcpy(dst, rb_fd_ptr(src), sizeof(fd_set)); +} + void rb_fd_dup(rb_fdset_t *dst, const rb_fdset_t *src) { @@ -2449,6 +2460,19 @@ rb_fd_dup(dst, src); } +static void +rb_fd_rcopy(fd_set *dst, rb_fdset_t *src) +{ + int max = rb_fd_max(src); + + if (max > FD_SETSIZE) { + rb_raise(rb_eArgError, "too large fdsets"); + } + + memcpy(dst->fd_array, src->fdset->fd_array, max); + dst->fd_count = max; +} + void rb_fd_term(rb_fdset_t *set) { @@ -2485,6 +2509,8 @@ #define FD_CLR(i, f) rb_fd_clr((i), (f)) #define FD_ISSET(i, f) rb_fd_isset((i), (f)) +#else +#define rb_fd_rcopy(d, s) (*(d) = *(s)) #endif #if defined(__CYGWIN__) @@ -2706,12 +2732,18 @@ retval = rb_thread_fd_select(max, rfds, wfds, efds, timeout); - if (rfds) + if (rfds) { + rb_fd_rcopy(read, rfds); rb_fd_term(rfds); - if (wfds) + } + if (wfds) { + rb_fd_rcopy(write, wfds); rb_fd_term(wfds); - if (efds) + } + if (efds) { + rb_fd_rcopy(except, efds); rb_fd_term(efds); + } return retval; } Index: ruby_1_9_3/ext/-test-/old_thread_select/old_thread_select.c =================================================================== --- ruby_1_9_3/ext/-test-/old_thread_select/old_thread_select.c (revision 33256) +++ ruby_1_9_3/ext/-test-/old_thread_select/old_thread_select.c (revision 33257) @@ -25,6 +25,18 @@ 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 @@ 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); } Index: ruby_1_9_3/version.h =================================================================== --- ruby_1_9_3/version.h (revision 33256) +++ ruby_1_9_3/version.h (revision 33257) @@ -1,10 +1,10 @@ #define RUBY_VERSION "1.9.3" #define RUBY_PATCHLEVEL -1 -#define RUBY_RELEASE_DATE "2011-09-11" +#define RUBY_RELEASE_DATE "2011-09-12" #define RUBY_RELEASE_YEAR 2011 #define RUBY_RELEASE_MONTH 9 -#define RUBY_RELEASE_DAY 11 +#define RUBY_RELEASE_DAY 12 #include "ruby/version.h" Index: ruby_1_9_3/test/-ext-/old_thread_select/test_old_thread_select.rb =================================================================== --- ruby_1_9_3/test/-ext-/old_thread_select/test_old_thread_select.rb (revision 33256) +++ ruby_1_9_3/test/-ext-/old_thread_select/test_old_thread_select.rb (revision 33257) @@ -23,6 +23,20 @@ end end + def test_old_select_false_positive + bug5306 = '[ruby-core:39435]' + with_pipe do |r2, w2| + with_pipe do |r, w| + t0 = Time.now + w.syswrite '.' + rfds = [ r.fileno, r2.fileno ] + rc = IO.old_thread_select(rfds, nil, nil, nil) + assert_equal [ r.fileno ], rfds, bug5306 + assert_equal 1, rc, bug5306 + end + end + end + def test_old_select_read_write_check with_pipe do |r, w| w.syswrite('.') -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/