summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorshyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-06-06 06:16:25 +0000
committershyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-06-06 06:16:25 +0000
commitd18b653719687756c82c7c800dee5e91b388fefd (patch)
treed64ce6d7598471d859d0eb4696a3ba5b49845bd2 /ext
parent1acfb03370704aee624b7a1e5ccf4776f40f2895 (diff)
merge revision(s) 23432:
* eval.c (rb_thread_join), ext/thread/thread.c (wake_one): adjusts targets of rest waiting threads to join. [ruby-core:23457] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@35942 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext')
-rw-r--r--ext/thread/thread.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/ext/thread/thread.c b/ext/thread/thread.c
index 298d7d08ca..b977fa77cf 100644
--- a/ext/thread/thread.c
+++ b/ext/thread/thread.c
@@ -205,6 +205,16 @@ array_from_list(List const *list)
return ary;
}
+static void
+adjust_join(const List *list, VALUE new)
+{
+ extern void rb_thread_set_join _((VALUE, VALUE));
+ Entry *entry;
+ for (entry = list->entries; entry; entry = entry->next) {
+ rb_thread_set_join(entry->value, new);
+ }
+}
+
static VALUE
wake_thread(VALUE thread)
{
@@ -221,7 +231,7 @@ run_thread(VALUE thread)
}
static VALUE
-wake_one(List *list)
+wake_first(List *list)
{
VALUE waking;
@@ -234,10 +244,22 @@ wake_one(List *list)
}
static VALUE
+wake_one(List *list)
+{
+ VALUE waking = wake_first(list);
+
+ if (!NIL_P(waking)) {
+ adjust_join(list, waking);
+ }
+
+ return waking;
+}
+
+static VALUE
wake_all(List *list)
{
while (list->entries) {
- wake_one(list);
+ wake_first(list);
}
return Qnil;
}