summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2001-03-14 08:39:13 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2001-03-14 08:39:13 +0000
commit3bee8daea6842d997c4adee7edc2c062fbed9186 (patch)
tree532f42b7bf5c86601fcbafe8d6f63fd29fb9fe3b
parent893dca5ab008f553f0dc2125dba72326726df0ef (diff)
downloadruby-3bee8daea6842d997c4adee7edc2c062fbed9186.tar.gz
ruby-3bee8daea6842d997c4adee7edc2c062fbed9186.tar.xz
ruby-3bee8daea6842d997c4adee7edc2c062fbed9186.zip
* eval.c (rb_thread_schedule): raise FATAL just once to
THREAD_TO_KILL. git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@1252 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog5
-rw-r--r--eval.c14
-rw-r--r--lib/thread.rb2
3 files changed, 16 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 889294473..ed4341f81 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Wed Mar 14 16:41:45 2001 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * eval.c (rb_thread_schedule): raise FATAL just once to
+ THREAD_TO_KILL.
+
Wed Mar 14 10:41:34 2001 Yukihiro Matsumoto <matz@ruby-lang.org>
* eval.c (rb_yield_0): 0 (= Qfalse) is a valid value, so that
diff --git a/eval.c b/eval.c
index 197f6a662..5d2f0016f 100644
--- a/eval.c
+++ b/eval.c
@@ -6881,7 +6881,9 @@ struct thread {
VALUE thread;
};
-#define THREAD_RAISED 0x200
+#define THREAD_RAISED 0x200 /* temporary flag */
+#define THREAD_TERMINATING 0x400 /* persistent flag */
+#define THREAD_FLAGS_MASK 0x400 /* mask for persistent flags */
#define FOREACH_THREAD_FROM(f,x) x = f; do { x = x->next;
#define END_FOREACH_FROM(f,x) } while (x != f)
@@ -7033,7 +7035,8 @@ rb_thread_save_context(th)
th->wrapper = ruby_wrapper;
th->dyna_vars = ruby_dyna_vars;
th->block = ruby_block;
- th->flags = scope_vmode | (rb_trap_immediate<<8);
+ th->flags &= THREAD_FLAGS_MASK;
+ th->flags |= (rb_trap_immediate<<8) | scope_vmode;
th->iter = ruby_iter;
th->tag = prot_tag;
th->tracing = tracing;
@@ -7459,8 +7462,11 @@ rb_thread_schedule()
curr_thread = next;
if (next->status == THREAD_TO_KILL) {
- /* execute ensure-clause if any */
- rb_thread_restore_context(next, RESTORE_FATAL);
+ if (!(next->flags & THREAD_TERMINATING)) {
+ next->flags |= THREAD_TERMINATING;
+ /* terminate; execute ensure-clause if any */
+ rb_thread_restore_context(next, RESTORE_FATAL);
+ }
}
rb_thread_restore_context(next, RESTORE_NORMAL);
}
diff --git a/lib/thread.rb b/lib/thread.rb
index d4b6ad6ec..559cd95a8 100644
--- a/lib/thread.rb
+++ b/lib/thread.rb
@@ -185,7 +185,7 @@ class Queue
end
end
def shift(non_block=false)
- pop(non_block=false)
+ pop(non_block)
end
alias deq shift