Project

General

Profile

Bug #16889

TracePoint.enable { ... } also activates the TracePoint for other threads, even outside the block

Added by Eregon (Benoit Daloze) 3 months ago. Updated 3 months ago.

Status:
Open
Priority:
Normal
Target version:
-
ruby -v:
ruby 2.6.6p146 (2020-03-31 revision 67876) [x86_64-linux]
[ruby-core:98355]

Description

threads = []
inspects = []
trace = TracePoint.new(:line) do |tp|
  threads << Thread.current
  inspects << tp.inspect
end

done = false
thread = Thread.new do
  Thread.pass until done
end

trace.enable do
  line_event = true
  done = true
  sleep 1
end
thread.join

# Expected only within enable block (lines 14-16)
puts inspects

# Expected just 1
p threads.uniq

Results in:

$ ruby tpbug.rb
ruby tpbug.rb
#<TracePoint:line@tpbug.rb:14>
#<TracePoint:line@tpbug.rb:15>
#<TracePoint:line@tpbug.rb:16>
#<TracePoint:line@tpbug.rb:10>
[#<Thread:0x00005571134e3340 run>, #<Thread:0x00005571138ac828@tpbug.rb:9 dead>]

But I expected:

#<TracePoint:line@tpbug.rb:14>
#<TracePoint:line@tpbug.rb:15>
#<TracePoint:line@tpbug.rb:16>
[#<Thread:0x00005571134e3340 run>]

Because the RDoc says:

If a block is given, the trace will only be enabled within the scope of
the block.

For background I'm trying to improve the TracePoint specs in ruby/spec, but they are proving quite unreliable due to this.

ko1 (Koichi Sasada) Thoughts?

#1

Updated by Eregon (Benoit Daloze) 3 months ago

  • Description updated (diff)

Updated by Eregon (Benoit Daloze) 3 months ago

Maybe enable(&block) should behave like enable(target: block); disable?

Also available in: Atom PDF