ruby-trunk-changes r38741 - r38750

今日は主に複数 Thread から同一ファイルを require でロードしないようにする ThreadShield の修正がありました。

nobu:r38741 2013-01-09 02:13:26 +0900

m68k で struct RBasic のアライメントエラーが発生してしまうため gcc (__GNUC__ が定義されていたら)では _attribute__((aligned())) を使って VALUE 型のサイズに align するように宣言しています。 [ruby-core:51224] [Bug #7647]

svn:r38742 2013-01-09 02:13:33 +0900

version.h の日付更新。

nobu:r38743 2013-01-09 03:47:05 +0900

compile.c のインデント修正のみ。

glass:r38744 2013-01-09 09:59:30 +0900

require を並列に実行した時に同じファイルを重複してロードしてしまわないように排他制御するために使っている ThreadShield(r36320 で Barrier から改名したもの)のロック時の処理においてエラーになることがあったのを修正しています。まだ Mutex が作成されていない ThreadShield が取得できた時にそれを st_delete() で削除していたのを消さないようにしています。よくわかりませんが登録したスレッドが消すはずだからここで消すとまずいということでしょうか。 [ruby-core:50645] [Bug #7530]

glass:r38745 2013-01-09 13:26:15 +0900

r38744 で追加したテストは require するスクリプトファイルをカレントディレクトリに作成していました。 Tempfile を使って一時ファイルを作ってそれを使うように修正しています。

naruse:r38746 2013-01-09 13:56:34 +0900

r38744 および r38745 のテストが環境変数 RUBYOPT に "-w" が含まれていると circular require 警告が出力されてエラーになってしまっていました。そこで RUBYOPT => nil のオプションを指定して子プロセスを起動するようにしています。 また require するファイルパスを絶対パスのまま利用するようにして、不要なディレクトリ移動はしないようにしています。

nobu:r38747 2013-01-09 14:32:33 +0900

flip-flop 条件式が 複数の Thread で同時に実行された時に、別々に動作すること(実行状態が独立していること)を確認するテストを追加しています。 flip-flop の実行状態は ISeq に保存されているはずなのに、どうやって Thread 間で別の状態を保持しているんでしょう。 ISeq じゃなくて svar (Thread local な特殊変数)に格納されてるそうです。あれ、何か勘違いしてた。

nobu:r38748 2013-01-09 15:40:30 +0900

rb_thread_t::root_svar の初期化漏れ(Qnil で初期化する必要があった)を修正しています。

glass:r38749 2013-01-09 22:14:05 +0900

r38744 の load.c の実装部分を revert しています。テストはそのままです。

glass:r38750 2013-01-09 22:14:09 +0900

r38744 の load.c の修正を再修正しています。 既存の ThreadShield が Mutex を保持していなかった時は、既にそれは使われていない、つまり待っている Thread がないので、新しい ThreadShield を作って loading_tbl に追加するようにしています。この場合 return 0 で返ってもいいんでしょうか? [ruby-core:50645] [Bug #7530]