まつもと ゆきひろです

In message "[ruby-dev:21899] core dump in rb_hash_aset"
    on 03/11/12, Tanaka Akira <akr / m17n.org> writes:
|
|% ruby -e 'h = {}
|Thread.new { loop { h.delete_if {|k, s| s.length == 0 } } }
|loop { h[rand] = "" }
|'
|-e:3: [BUG] Segmentation fault
|ruby 1.8.1 (2003-11-11) [i686-linux]
|
|zsh: abort (core dumped)  ruby -e 
|
|というように core を吐くことがあります。
|
|ただ、(すぐには)吐かないこともありますが、起動しては ^C で止めるという
|のを何回かに一回は core を吐きます。

飛行機の中でdelete_if実行中には更新を許さないようにしてみま
したが、まだ落ちます。更新中にdelete_ifが実行されちゃうケー
スでst_lookupがまだ参照しているrecordをfree()しちゃうようで
す。もうちょっと考えないといけませんね。

すぐに思いつくのはdelete_ifでは条件が真のkeyを覚えておくだけ
にして、削除は後で一度にするくらいですかねえ。