1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* thread.c (rb_thread_raise): check if target thread is

thrown by another thread or not.  [ruby-dev:31371]
* bootstraptest/test_thread.rb: add a test for above.



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12925 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
ko1 2007-08-12 20:06:59 +00:00
parent 161b2e264f
commit d7a19d0333
3 changed files with 27 additions and 2 deletions

View file

@ -1,3 +1,10 @@
Mon Aug 13 05:03:53 2007 Koichi Sasada <ko1@atdot.net>
* thread.c (rb_thread_raise): check if target thread is
thrown by another thread or not. [ruby-dev:31371]
* bootstraptest/test_thread.rb: add a test for above.
Mon Aug 13 04:35:30 2007 Koichi Sasada <ko1@atdot.net>
* compile.c (iseq_peephole_optimize): fix peephole optimization
@ -5,7 +12,6 @@ Mon Aug 13 04:35:30 2007 Koichi Sasada <ko1@atdot.net>
* bootstraptest/test_syntax.rb: add a test for above.
Mon Aug 13 04:02:29 2007 Koichi Sasada <ko1@atdot.net>
* vm_dump.c (debug_print_pre): fix to show control frame count.

View file

@ -169,3 +169,17 @@ assert_equal %q{11}, %q{
Thread.current[:a]
}.value + Thread.current[:a]
}
assert_equal %q{1000}, %q{
begin
1000.times do |i|
begin
Thread.start(Thread.current) {|u| u.raise }
raise
rescue
ensure
end
end
rescue
1000
end
}, '[ruby-dev:31371]'

View file

@ -758,12 +758,17 @@ rb_thread_raise(int argc, VALUE *argv, rb_thread_t *th)
{
VALUE exc;
again:
if (rb_thread_dead(th)) {
return Qnil;
}
if (th->thrown_errinfo != 0 || th->raised_flag) {
rb_thread_schedule();
goto again;
}
exc = rb_make_exception(argc, argv);
/* TODO: need synchronization if run threads in parallel */
th->thrown_errinfo = exc;
rb_thread_ready(th);
return Qnil;