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を取得する方法はないのかしらん。