зеркало из https://github.com/github/ruby.git
vm_trace.c: isolate exceptions
* vm_trace.c (rb_postponed_job_flush): isolate exceptions in postponed jobs and restore outer ones. based on a patch by tarui. [ruby-core:58652] [Bug #9168] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@44260 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
Родитель
8859ff1d09
Коммит
a98e343d39
|
@ -1,3 +1,9 @@
|
||||||
|
Tue Dec 17 16:19:09 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
|
* vm_trace.c (rb_postponed_job_flush): isolate exceptions in
|
||||||
|
postponed jobs and restore outer ones. based on a patch by
|
||||||
|
tarui. [ruby-core:58652] [Bug #9168]
|
||||||
|
|
||||||
Tue Dec 17 10:48:04 2013 Aman Gupta <ruby@tmm1.net>
|
Tue Dec 17 10:48:04 2013 Aman Gupta <ruby@tmm1.net>
|
||||||
|
|
||||||
* configure.in (RUBY_DTRACE_POSTPROCESS): Fix compatibility with
|
* configure.in (RUBY_DTRACE_POSTPROCESS): Fix compatibility with
|
||||||
|
|
|
@ -279,6 +279,19 @@ class TestGc < Test::Unit::TestCase
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_exception_in_finalizer
|
||||||
|
bug9168 = '[ruby-core:58652] [Bug #9168]'
|
||||||
|
assert_normal_exit(<<-'end;', bug9168)
|
||||||
|
raise_proc = proc {raise}
|
||||||
|
10000.times do
|
||||||
|
ObjectSpace.define_finalizer(Object.new, raise_proc)
|
||||||
|
Thread.handle_interrupt(RuntimeError => :immediate) {break}
|
||||||
|
Thread.handle_interrupt(RuntimeError => :on_blocking) {break}
|
||||||
|
Thread.handle_interrupt(RuntimeError => :never) {break}
|
||||||
|
end
|
||||||
|
end;
|
||||||
|
end
|
||||||
|
|
||||||
def test_verify_internal_consistency
|
def test_verify_internal_consistency
|
||||||
assert_nil(GC.verify_internal_consistency)
|
assert_nil(GC.verify_internal_consistency)
|
||||||
end
|
end
|
||||||
|
|
|
@ -1511,7 +1511,9 @@ rb_postponed_job_flush(rb_vm_t *vm)
|
||||||
{
|
{
|
||||||
rb_thread_t *th = GET_THREAD();
|
rb_thread_t *th = GET_THREAD();
|
||||||
unsigned long saved_postponed_job_interrupt_mask = th->interrupt_mask & POSTPONED_JOB_INTERRUPT_MASK;
|
unsigned long saved_postponed_job_interrupt_mask = th->interrupt_mask & POSTPONED_JOB_INTERRUPT_MASK;
|
||||||
|
VALUE saved_errno = th->errinfo;
|
||||||
|
|
||||||
|
th->errinfo = Qnil;
|
||||||
/* mask POSTPONED_JOB dispatch */
|
/* mask POSTPONED_JOB dispatch */
|
||||||
th->interrupt_mask |= POSTPONED_JOB_INTERRUPT_MASK;
|
th->interrupt_mask |= POSTPONED_JOB_INTERRUPT_MASK;
|
||||||
{
|
{
|
||||||
|
@ -1530,4 +1532,5 @@ rb_postponed_job_flush(rb_vm_t *vm)
|
||||||
}
|
}
|
||||||
/* restore POSTPONED_JOB mask */
|
/* restore POSTPONED_JOB mask */
|
||||||
th->interrupt_mask &= ~(saved_postponed_job_interrupt_mask ^ POSTPONED_JOB_INTERRUPT_MASK);
|
th->interrupt_mask &= ~(saved_postponed_job_interrupt_mask ^ POSTPONED_JOB_INTERRUPT_MASK);
|
||||||
|
th->errinfo = saved_errno;
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче