diff options
| author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2001-03-14 08:39:13 +0000 |
|---|---|---|
| committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2001-03-14 08:39:13 +0000 |
| commit | 3bee8daea6842d997c4adee7edc2c062fbed9186 (patch) | |
| tree | 532f42b7bf5c86601fcbafe8d6f63fd29fb9fe3b | |
| parent | 893dca5ab008f553f0dc2125dba72326726df0ef (diff) | |
| download | ruby-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-- | ChangeLog | 5 | ||||
| -rw-r--r-- | eval.c | 14 | ||||
| -rw-r--r-- | lib/thread.rb | 2 |
3 files changed, 16 insertions, 5 deletions
@@ -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 @@ -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 |
