Project

General

Profile

Feature #13483

Updated by nobu (Nobuyoshi Nakada) over 4 years ago

# Summary 

 `TracePoint#enable` with block should enable thread-local trace. 

 # Current behavior 

 `TracePoint#enable` enables TracePoint for all of threads, even if it called with `do...end` blcok. 

 ```ruby ``` 
 t1 = Thread.new{ 
   loop{ 
     x = 1 
   } 
 } 
 th = nil 
 trace = TracePoint.new(:line){|tp| 
   if th != Thread.current 
     p th = Thread.current 
   end 
 } 

 trace.enable do 
   loop{ 
     a = 1 
     b = 2 
   } 
 end 
 ``` 

 This program shows both main thread and thread `t1` hooked by line events. 

 # Problem 

 However, usually `trace.enable do ... end` imply the programmer want to enable hooks only for this block, not for other threads. 
 For example, Ruby's test for TracePoint skips hooks on other threads. 
 https://github.com/ruby/ruby/blob/trunk/test/ruby/test_settracefunc.rb#L620 

 # Proposal 

 `TracePoint#enable` with block should enable thread-local trace. 
 I believe proposed behavior is easy to use. 

 # Consideration 

 (1) It breaks backward compatibility. Is it acceptable? 
 (2) What happen on created threads? Should inherit thread-local hooks or ignore them? 

 I want to ask users of `TracePoint`. TracePoint. 

 Thanks, 
 Koichi

Back