<< 前 ホーム 次 >>

bakaid: 200511021

どうもファイナライザの呼び出し方が分かりません。

とあるCのライブラリ (何かはヒミチュ) が構造体を勝手に割り当ててよこす
んですけど、例によって、それに対応するメモリ解放ルーチンも用意されてい
ます。で、この解放ルーチンをファイナライザで呼び出したいと。

とりあえずObjectSpaceの挙動を調べてみたんですけど、これは使えませんよ
ね。そもそもCでprocをどう作ればいいかも分かんないんですけど、それはク
ラス・メソッドをMethodオブジェクトにしちゃえば大丈夫そうなんでいいとし
て、ファイナライザが呼び出されたときには肝心なオブジェクトはもういなく
なってます。つまり、Data_Get_Structでも構造体を取り出せなさそう。

class Foo
  def self.callback(id)
    begin
      p ObjectSpace._id2ref(id)
    rescue RangeError => e
      puts e.message
    end
  end

  def initialize
    ObjectSpace.define_finalizer(self, self.class.method(:callback))
  end
end

loop do
  100.times do
    Foo.new
    GC.start
  end
  sleep 0.5
end

やっぱこういうのはプロトコルにするしかないんすかね。もちろん、最初っか
らRuby側には明示的な解放手段も用意するつもりなんですけど。

--

ぐえ。NotImplementedErrorなんてのがあったのか。

--

あ、な〜んだ。Data_Make_Structとかで後始末ルーチンを登録できるのねん。

で、そのルーチンでfreeを呼ぶと。xfreeでも同じなんですかね? xmallocで
割り当てられるからxfreeだとばっかり思ってたんですけど。でも調べてみる
と、freeのほうが段違いに使われてますね。ふ〜んといった感じです。

本家Permlink

<< 前 ホーム 次 >>


Copyright © 1905 tko at jitu.org

バカが征く on Rails