[Ruby 1.9-Bug#4027] Signal.trap で busy loop に陥る

チケット #4027 が更新されました。 (by Tomoyuki C.)

なお、このせいで sighandler にメインスレッドとタイマースレッドで同時に実行してしまって
signal_buff のカウンタがおかしくなったのかも、とも思ったのですが、ATOMIC_INC 部分を disassemble してみると
それぞれ incl の1命令で実行されているので、仮に並列に実行されても加算もれすることはなさそうです。
これは勘違いしていて、lock prefix がついていないので複数コアで並列に実行されると問題かもしれません。
そして r29589 で gcc-4 の builtin function を使う修正が入っていたのを思い出したので
CC=gcc-4.4 にしてコンパイルしなおしたら ATOMIC_INC は

80e1b93: f0 80 00 01 lock addb $0x1,(%eax)
80e1b97: f0 80 05 81 ef 1f 08 lock addb $0x1,0x81fef81

のように lock prefix 付きになったので、これで大丈夫だと思います。

ささだです。

シグナルに関しての調査、ありがとうございます。近いうちに反映させます。

(2010/11/11 10:47), Tomoyuki C. wrote:

これは勘違いしていて、lock prefix がついていないので複数コアで並列に実行されると問題かもしれません。
そして r29589 で gcc-4 の builtin function を使う修正が入っていたのを思い出したので
CC=gcc-4.4 にしてコンパイルしなおしたら ATOMIC_INC は

80e1b93: f0 80 00 01 lock addb $0x1,(%eax)
80e1b97: f0 80 05 81 ef 1f 08 lock addb $0x1,0x81fef81

ちなみに、以前はどのコンパイラを利用されていたでしょうか。