summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorshyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-02-21 15:18:42 +0000
committershyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-02-21 15:18:42 +0000
commitf87b1a535f69bc24d14fa14cd5ce92e497d15451 (patch)
treeff0dc3d5735d8af0c42c314010f6cc0a214f0717
parent54b82ec9e9b7c5842dbb6d23fb907b7b8e76096e (diff)
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] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_6@22476 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog6
-rw-r--r--eval.c43
-rw-r--r--version.h8
3 files changed, 36 insertions, 21 deletions
diff --git a/ChangeLog b/ChangeLog
index e5b9ff6515..57a1703f49 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Sun Feb 22 00:13:58 2009 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 Feb 20 20:36:18 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
* lib/optparse.rb (OptionParser::List#summarize): gives priority
diff --git a/eval.c b/eval.c
index 8e037f6334..3f8c32b593 100644
--- a/eval.c
+++ b/eval.c
@@ -10676,6 +10676,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;
@@ -10821,28 +10822,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);
@@ -10858,9 +10853,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);
diff --git a/version.h b/version.h
index 1d99123840..a66867e4c7 100644
--- a/version.h
+++ b/version.h
@@ -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[];