Issue #4347 has been updated by Yusuke Endoh.

Assignee changed from Koichi Sasada to Yusuke Endoh

Hello,

2011/1/31 James M. Lawrence <redmine / ruby-lang.org>:
> In thread.c (thread_suppress_tracing) the code after (*func)(arg, running)
> is not executed, causing th->tracing to not be cleared.
>
> This two-line patch works, though it may only address a symptom.


Thank you for your reporting and providing patch.


The root cause of this issue is that Continuation#call ignores
ensure clause:

  callcc do |c|
    begin
      c.call
    ensure
      p :foo
    end
  end  #=> nothing output


When Continuation#call is executed in the proc of set_trace_func,
it skips the post-processing of set_trace_func, resulting in
corrupt state of rb_thread_t#tracing.

Your patch forces to reset the state when set_trace_func(nil). But
to address this issue fundamentally, Continuation#call must call
current ensure clauses.  It needs very hard work, though.


As you know, your patch is not essintial fix, but it works actually
in your example, and looks benign.  So I'll import it.

But note that there is still other issues, and that this issue may
have a relapse in future.  If you want not to hit a land mine, do
not use callcc seriously.  It is very fun, joke feature, I think.


Thanks,

-- 
Yusuke Endoh <mame / tsg.ne.jp>
----------------------------------------
Bug #4347: Tracing cannot be re-enabled after callcc [patch]
http://redmine.ruby-lang.org/issues/4347

Author: James M. Lawrence
Status: Assigned
Priority: Normal
Assignee: Yusuke Endoh
Category: core
Target version: 1.9.3
ruby -v: ruby 1.9.3dev (2011-01-30 trunk 30735) [i386-darwin9.8.0]


=begin
 % patch -p1 < test_continuation_tracing.patch 
 patching file test/ruby/test_continuation.rb
 % ./ruby -v test/ruby/test_continuation.rb 
 ruby 1.9.3dev (2011-01-30 trunk 30735) [i386-darwin9.8.0]
 Run options: 
 
 # Running tests:
 
 ......FF
 
 Finished tests in 0.080788s, 99.0246 tests/s, 148.5369 assertions/s.
 
   1) Failure:
 test_tracing_with_set_trace_func(TestContinuation) [test/ruby/test_continuation.rb:99]:
 <3> expected but was
 <1>.
 
   2) Failure:
 test_tracing_with_thread_set_trace_func(TestContinuation) [test/ruby/test_continuation.rb:121]:
 <3> expected but was
 <0>.
 
 In thread.c (thread_suppress_tracing) the code after (*func)(arg, running)
 is not executed, causing th->tracing to not be cleared.
 
 This two-line patch works, though it may only address a symptom.
=end



-- 
http://redmine.ruby-lang.org