[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]