Project

General

Profile

Feature #13483

Updated by nobu (Nobuyoshi Nakada) over 2 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