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

ruby-changes:10903

From: shyouhei <ko1@a...>
Date: Sun, 22 Feb 2009 00:18:55 +0900 (JST)
Subject: [ruby-changes:10903] Ruby:r22476 (ruby_1_8_6): merge revision(s) 21165:

shyouhei	2009-02-22 00:18:42 +0900 (Sun, 22 Feb 2009)

  New Revision: 22476

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=22476

  Log:
    merge revision(s) 21165:
    * eval.c (rb_thread_schedule): Don't change status of threads which
      don't run next even if select notify readability/writability.
      [ruby-core:20446]

  Modified files:
    branches/ruby_1_8_6/ChangeLog
    branches/ruby_1_8_6/eval.c
    branches/ruby_1_8_6/version.h

Index: ruby_1_8_6/ChangeLog
===================================================================
--- ruby_1_8_6/ChangeLog	(revision 22475)
+++ ruby_1_8_6/ChangeLog	(revision 22476)
@@ -1,3 +1,9 @@
+Sun Feb 22 00:13:58 2009  Tanaka Akira  <akr@f...>
+
+	* eval.c (rb_thread_schedule): Don't change status of threads which
+	  don't run next even if select notify readability/writability.
+	  [ruby-core:20446]
+
 Fri Feb 20 20:36:18 2009  Nobuyoshi Nakada  <nobu@r...>
 
 	* lib/optparse.rb (OptionParser::List#summarize): gives priority
Index: ruby_1_8_6/version.h
===================================================================
--- ruby_1_8_6/version.h	(revision 22475)
+++ ruby_1_8_6/version.h	(revision 22476)
@@ -1,15 +1,15 @@
 #define RUBY_VERSION "1.8.6"
-#define RUBY_RELEASE_DATE "2009-02-20"
+#define RUBY_RELEASE_DATE "2009-02-22"
 #define RUBY_VERSION_CODE 186
-#define RUBY_RELEASE_CODE 20090220
-#define RUBY_PATCHLEVEL 347
+#define RUBY_RELEASE_CODE 20090222
+#define RUBY_PATCHLEVEL 348
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 6
 #define RUBY_RELEASE_YEAR 2009
 #define RUBY_RELEASE_MONTH 2
-#define RUBY_RELEASE_DAY 20
+#define RUBY_RELEASE_DAY 22
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
Index: ruby_1_8_6/eval.c
===================================================================
--- ruby_1_8_6/eval.c	(revision 22475)
+++ ruby_1_8_6/eval.c	(revision 22476)
@@ -10676,6 +10676,7 @@
     rb_thread_t next;		/* OK */
     rb_thread_t th;
     rb_thread_t curr;
+    rb_thread_t th_found = 0;
     int found = 0;
 
     fd_set readfds;
@@ -10821,28 +10822,22 @@
 	if (n > 0) {
 	    now = -1.0;
 	    /* Some descriptors are ready.
-	       Make the corresponding threads runnable. */
+             * Choose a thread which may run next.
+             * Don't change the status of threads which don't run next.
+             */
 	    FOREACH_THREAD_FROM(curr, th) {
 		if ((th->wait_for&WAIT_FD) && FD_ISSET(th->fd, &readfds)) {
-		    /* Wake up only one thread per fd. */
-		    FD_CLR(th->fd, &readfds);
-		    th->status = THREAD_RUNNABLE;
-		    th->fd = 0;
-		    th->wait_for = 0;
+                    th_found = th;
 		    found = 1;
+                    break;
 		}
 		if ((th->wait_for&WAIT_SELECT) &&
 		    (match_fds(&readfds, &th->readfds, max) ||
 		     match_fds(&writefds, &th->writefds, max) ||
 		     match_fds(&exceptfds, &th->exceptfds, max))) {
-		    /* Wake up only one thread per fd. */
-		    th->status = THREAD_RUNNABLE;
-		    th->wait_for = 0;
-		    n = intersect_fds(&readfds, &th->readfds, max) +
-			intersect_fds(&writefds, &th->writefds, max) +
-			intersect_fds(&exceptfds, &th->exceptfds, max);
-		    th->select_value = n;
-		    found = 1;
+                    th_found = th;
+                    found = 1;
+                    break;
 		}
 	    }
 	    END_FOREACH_FROM(curr, th);
@@ -10858,9 +10853,23 @@
 	    next = th;
 	    break;
 	}
-	if (th->status == THREAD_RUNNABLE && th->stk_ptr) {
-	    if (!next || next->priority < th->priority)
-	       next = th;
+	if ((th->status == THREAD_RUNNABLE || th == th_found) && th->stk_ptr) {
+	    if (!next || next->priority < th->priority) {
+                if (th == th_found) {
+                    th_found->status = THREAD_RUNNABLE;
+                    th_found->wait_for = 0;
+                    if (th->wait_for&WAIT_FD) {
+                        th_found->fd = 0;
+                    }
+                    else { /* th->wait_for&WAIT_SELECT */
+                        n = intersect_fds(&readfds, &th_found->readfds, max) +
+                            intersect_fds(&writefds, &th_found->writefds, max) +
+                            intersect_fds(&exceptfds, &th_found->exceptfds, max);
+                        th_found->select_value = n;
+                    }
+                }
+	        next = th;
+            }
 	}
     }
     END_FOREACH_FROM(curr, th);

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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