yarv-dev:262
From: SASADA Koichi <ko1 atdot.net>
Date: Thu, 21 Oct 2004 00:30:53 +0900
Subject: [yarv-dev:262] VM state version problem
ささだです。
キャッシュのために、VM に状態バージョン(カウンタ)を持た
せる、って話を前したと思うんですが、やっぱり問題があって、
そのカウンタがオーバーフローしたらどうなるって話があると思う
のです。
対策:
1) そんなのはレアケースなので見ないことにする
(各種定義を 4G 回するなんてありえない)
2) オーバーフローを検出して、
a) すべてのメソッドを再コンパイル
b) すべてのメソッドのキャッシュのカウンタをチェックして、
リセット
c) Ruby の実行を止める
1 と 2-c は使い物にならなそうなので、ダメ。
ObjectSpace.each_object(YARV::InsnSeq){|e|
e.recompile # 2-b
# or
e.reset_vm_version_counter # 2-c
}
だけだから、簡単っていえば簡単なんですが、そのカウンタの
インクリメント時に、オーバーフローチェックが必要になるんで
すよね。
vm_ver++;
if(vm_ver == 0){
reset_process...
}
で、こんなことを考えてると、そもそもこいつはスレッドセーフ
にしなくてもいいのか、とか余計なことを考えてしまったり。
いや、何か値をインクリメントするのなら、ロックしないとまず
いような気はとてもするんですが・・・。てことは、キャッシュに
触るには、まずロックしないとだめってこと? うーん。r/w lock
にしても、やっぱり reade もロックの確認はしないと駄目だしなあ。
昔から、リファレンスカウンタの値がオーバーフローしたらどう
するんだろう、と疑問に思ってるんですが、何か対策を立てるもの
なんでしょうか。
と、取りとめも無く。
--
// SASADA Koichi at atdot dot net
//
--
ML: yarv-dev quickml.atdot.net
使い方: http://www.atdot.net/~ko1/quickml
-> 262 2004-10-21 00:30 [ko1 atdot.net ] VM state version problem 263 2004-10-21 13:58 ┗[maeda-yarv atusi.org] 264 2004-10-21 14:18 ┗[ko1 atdot.net ] 265 2004-10-21 15:09 ┗[maeda-yarv atusi.org]