diff options
| author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-12-29 08:05:52 +0000 |
|---|---|---|
| committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-12-29 08:05:52 +0000 |
| commit | bfabd0a798f133c9c36d04fa0208e5d59c2b8166 (patch) | |
| tree | 67867b43f7e3fc18daaecab05919c76f2ed103b7 | |
| parent | 112aac90f724e9979bf734148934a0e79a06efc4 (diff) | |
* 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]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@21165 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
| -rw-r--r-- | ChangeLog | 6 | ||||
| -rw-r--r-- | eval.c | 43 |
2 files changed, 32 insertions, 17 deletions
@@ -1,3 +1,9 @@ +Mon Dec 29 17:02:50 2008 Tanaka Akira <akr@fsij.org> + + * 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 Dec 26 15:50:45 2008 Nobuyoshi Nakada <nobu@ruby-lang.org> * lib/optparse.rb (OptionParser::List#summarize): gives priority @@ -10961,6 +10961,7 @@ rb_thread_schedule() 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; @@ -11106,28 +11107,22 @@ rb_thread_schedule() 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); @@ -11143,9 +11138,23 @@ rb_thread_schedule() 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); |
