From: "mame (Yusuke Endoh)" Date: 2021-08-20T04:14:33+00:00 Subject: [ruby-core:105020] [Ruby master Feature#16889] TracePoint.enable { ... } also activates the TracePoint for other threads, even outside the block Issue #16889 has been updated by mame (Yusuke Endoh). Eregon (Benoit Daloze) wrote in #note-10: > I do expect: > ``` > TracePoint.new(:line) {|tp| p tp }.enable do > foo > end > ``` > to report lines within that last block, and within `foo`, so thread-local behavior in other words. > So I'd want `tp.enable {}` to be like `tp.enable(target_thread: Thread.current) {}`. Agreed. I think thread-local behavior is more reasonable. So, the current `target: :block` is not what you want, right? Though I like thread-local behavior, I have some concerns: * `tp.enable { Thread.new { foo }.join }` will not trace `foo` because it is run in another thread, but I'm unsure if this is expected. * `tp.enable` called with no block should trace events in all threads, right? It is a bit inconsistent, but perhaps changing this to thread-local will break [Zeitwerk](https://github.com/fxn/zeitwerk/blob/243b43acde6f88893c2d02b191227c2917745a4f/test/lib/zeitwerk/test_ruby_compatibility.rb#L69-L70). ---------------------------------------- Feature #16889: TracePoint.enable { ... } also activates the TracePoint for other threads, even outside the block https://bugs.ruby-lang.org/issues/16889#change-93423 * Author: Eregon (Benoit Daloze) * Status: Open * Priority: Normal * Assignee: ko1 (Koichi Sasada) ---------------------------------------- ```ruby 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 # # # # [#, #] ``` But I expected: ``` # # # [#] ``` 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 Thoughts? -- https://bugs.ruby-lang.org/ Unsubscribe: