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/