@m_seki の

I like ruby tooから引っ越し

set_trace_func

RMIのトレースができないかなー、と思っていろいろ遊んでみました。
1.9と1.8ではset_trace_funcが活動するスレッドが違うんですね。

require 'thread'

Q = Queue.new
T = Hash.new {|h, k| h[k] = h.size + 1}
set_trace_func Proc.new {|*ary| p [T[Thread.current], ary] if ary[0] == 'c-call'}

Thread.new do
  # set_trace_func Proc.new {|*ary| p [T[Thread.current], ary] if ary[0] == 'c-call'}
  10.times do |n|
    Q.push(n)
  end
end

10.times do
  Q.pop
end

1.8ではそれぞれのスレッドでProcが呼び返されますが、1.9ではset_trace_funcしたスレッドでProcが呼び返されるように見えます。
またスレッドの中で再びset_trace_funcすると(コメント行の#を外すと)、それぞれのスレッドで呼ばれるっぽい。そういうものかな。

#1.9.1-p0でdRubyと組み合わせていろいろやってたらなにやら不穏な落ち方をしたけど、原因までは辿り着けず‥。

そうそう。set_trace_funcの戻り値は、引数がそのまま返ってくるのね。いま設定されているtrace_funcを取得する方法はないのかしらん。