ruby-trunk-changes r45909 - r45921

今日は Process.kill で自分自身にシグナル送信した時に実際にシグナルを送信せずに内部的に処理するようにする変更や、rb_thread_t の管理を st_table から doubly linked list に変更する内部的な改造などがありました。

nobu: r45909 2014-05-11 00:52:45 +0900

r45898 と同様に thread_pthread.c で errno を直接 switch 文の条件に使っているところを一旦ローカル変数に代入して利用するようにしています。

svn: r45910 2014-05-11 00:52:56 +0900

version.h の日付更新。

nobu: r45911 2014-05-11 01:10:32 +0900

Process.kill で自分自身にシグナルを送信する時に、シグナルハンドラが SIG_IGN になっていたら OS によるシグナルの配信をスキップして signal_enqueue() を直接呼び出してすぐにシグナル受信したものとして動作するようにしています。ただし SIGSEGV と SIGBUS は実際に送信するようにしています。昨日修正したシグナルのテストでシグナルハンドラをリセットした修正は、Debian の CI が cron で起動される時にシグナルハンドラに SIG_IGN がセットされていたのが原因で hang していたことに対する修正でしたが、SIG_IGN になっている時に hang するのもおかしいのでそれを修正しています。 [ruby-dev:48203] [Bug #9820]

nobu: r45912 2014-05-11 01:10:45 +0900

r45911 の影響で、ruby_kill() でメインスレッドかどうかや配送先が自分自身の pid でないかのチェックなどを削っています。上で同じ分岐をするようになったので不要になったということだと思います。 [ruby-dev:48203] [Bug #9820]

normal: r45913 2014-05-11 08:48:51 +0900

rb_thread_t の内部的な管理方法をハッシュテーブル(st_table)から二重 linked list に変更しています。追加削除が高速にできること、ローカリティの改善などが目的とのこと。またこのために doubly linked list の実装を ccan という C のソースコードアーカイブサイトからもってきています。 ccan というサブディレクトリにもってきたソースが入っています。 [ruby-core:61871][Feature #9632]
外からライブラリ的なコードを持ってきているのでライセンスを記載した系のファイルも追加されていますが、LEGAL にも追記しなくていいのかな。そういえば siphash.{ch} とかも記載されてなかったので、まあ個別に書かれていれば利用する上での問題はないので、LEGAL ファイルは一覧したいという時の利便性の問題なのでしょう。

svn: r45914 2014-05-11 08:49:06 +0900

r45913 で新規追加されたファイルの svn property 設定。

nobu: r45915 2014-05-11 09:25:36 +0900

r45913 の変更の変数未初期化のコンパイラ警告除去。

nobu: r45916 2014-05-11 09:33:45 +0900

r45913 の再修正。変数の宣言に typeof(var) の結果を型として使えるかどうかを configure でチェックするようにして HAVE_TYPEOF を定義するようにしています。っていうかこんな書きかたできるのか…。

nobu: r45917 2014-05-11 10:02:47 +0900

r45911 の自分自身へのシグナル送信の処理の変更で、シグナルハンドラで処理できない SIGKILL と SIGSTOP も直接処理せずに実際にシグナル送信を行うようにしています。 [ruby-dev:48203] [Bug #9820]

nobu: r45918 2014-05-11 12:19:29 +0900

r45917 で追加したテストで SIGQUIT が存在するかチェックして期待する値を変更するようにしています。 んーこれテストには SIGKILL を使っているので間違いかと思いましたが、たぶん Windows では SIGKILL をエミュレーションしているので、処理はできるけど子プロセスの Process::Status#signaled? などの値が異なるのでそれを検出するためにシグナルがサポートされていればあるはずの SIGQUIT をチェックしている(つまり実質 Windows 版かどうかのチェック)のだろうと思います。 [ruby-dev:48203] [Bug #9820]

nobu: r45919 2014-05-11 19:40:18 +0900

r45917 のテストの再修正。 重複した assertion を削除しています。

akr: r45920 2014-05-11 21:24:11 +0900

pack.c の未使用になっていたマクロ群 swaps(), swapi(), swapl(), swapll() の定義を削除しています。

akr: r45921 2014-05-11 22:29:16 +0900

compile.c、vm.c、pack.c、time.c の未使用のマクロ BUFSIZE、BYTEWIDTH、INT64toNUM()、UINT64toNUM()、lshift() などの定義を削除しています。また time.c の未使用の変数削除。