ruby-trunk-changes r33588 - r33607

今日も close-on-exec がらみの変更多数です。また File.expand_path の結果文字列の coderange の不具合修正がありました。

naruse:r33588 2011-10-31 22:50:32 +0900

r33586 で NetBSD の判定で defined() がだぶってたのを修正。

akr:r33589 2011-10-31 23:38:50 +0900

拡張ライブラリ socket の rsoc_socket で SOCK_CLOEXEC という定数が定義されていたら socket(2) の type 引数にセットして呼ぶことで close-on-exec フラグがセットされた状態で生成されるようにしています。 これも Linux 2.6.27 から利用可能になったとのことで errno=EINVAL でエラーになったらあきらめるようにしています。 rb_fd_fix_cloexec() を rb_update_max_fd() におきかえているため、SOCK_CLOEXEC が未定義の場合に close-on-exec フラグが付加されなくなっているような気がします。

akr:r33590 2011-10-31 23:49:57 +0900

rsock_sock_s_socketpair() から socketpair(2) の呼び出し部分を rsock_socketpair() として関数に切り出しています。 次の変更の布石ですね。

usa:r33591 2011-11-01 03:05:03 +0900

load_file() に渡すファイルパスを const char * から VALUE (String オブジェクト)に変更しています。 open(2) に渡す文字列は Windows ではファイルシステムエンコーディングでないといけないため、rb_str_encode_ospath() という関数を呼んで必要なエンコーディング変換をするようにしています。

svn:r33592 2011-11-01 03:05:07 +0900

version.h の日付更新。

akr:r33593 2011-11-01 06:01:18 +0900

r33590 で切り出した rsock_socketpair() で rsock_socket() と同じように SOCK_CLOEXEC が定義されていたら type 引数にセットして socketpair(2) を呼ぶようにしています。 こちらは元々呼び元(切り出し元)の rsock_sock_s_socketpair() で rb_fd_fix_cloexec() が呼ばれているのですが、やっぱり rsock_socketpair() 内で呼んだほうがいいかと。

akr:r33594 2011-11-01 07:32:49 +0900

BasicSocket#recvmsg や UNIXSocket#recv_io で UNIX Socket による file descriptor passing で file descriptor を受け取る時のために MSG_CMSG_CLOEXEC という定数が定義されていたら flags にセットするようにしています。これも Linux の 2.6.23 から有効になったフラグで、2.6.18 では定義はあっても単に無視されるそうです。

akr:r33595 2011-11-01 08:24:25 +0900

dup3(2) と pipe2(2) について Linux 2.6.27 かつ glibc 2.9 から利用可能とコメントを修正しています。

akr:r33596 2011-11-01 08:26:19 +0900

ServerSocket#accept で acept(2) のかわりに accept4(2) というシステムコールが利用可能だったら使うようにしています。これも Linux の新しいシステムコールでやはり close-on-exec の付けた file descriptor を返すためのもので Linux 2.6.28、glibc 2.10 から利用可能だそうです。このため accept() を wrap した cloexec_accept() という関数を新設しています。

naruse:r33597 2011-11-01 09:42:41 +0900

test/-ext-/symbol/test_inadvertent_creation.rb で object_id から Symbol として利用していない文字列を生成しようとしているところで、object_id が負の整数を返すことがあるので "-" を "_" に置換するようにしています。

akr:r33598 2011-11-01 12:04:03 +0900

fd_set_cloexec() を rb_maygvl_fd_fix_cloexec() と改名して、拡張ライブラリ socket の cloexec_accept() でこれを呼んで accept4(2) が利用できない時にも close-on-exec フラグがセットされるようにしています。

akr:r33599 2011-11-01 12:04:53 +0900

dbm の O_CLOEXEC フラグを利用しているところにコメントを追記。 dbm 1.9 は O_CLOEXEC を無視するそうです。

akr:r33600 2011-11-01 12:37:01 +0900

rb_maygvl_fd_fix_cloexec() は非公開ということにして internal.h から削除しています。

naruse:r33601 2011-11-01 13:31:52 +0900

BSD_vfprintf() がサイズ指示子の l を2つ重ねて "%lld" のような指定に対応していなかったのを対応するようにしています。また __sfeof() などのマクロが NetBSD のヘッダの定義と衝突していたらしく BSD__sfeof() などに改名しています。

naruse:r33602 2011-11-01 14:56:51 +0900

rb_cloexec_fcntl_dupfd() の第2引数が int なのに合うようにキャストの追加や変数の型の修正。

naruse:r33603 2011-11-01 17:17:59 +0900

File.expand_path で結果の文字列に ENC_CODERANGE_CLEAR() を呼んで文字種のフラグをクリアするようにしています。マルチバイト文字を含んでいるのに ascii_only? が true になるようになっていたのを修正。 [ruby-dev:44757] [Bug #5533]

akr:r33604 2011-11-01 19:01:01 +0900

IO#reopen の処理で freopen(3) で開いた file descriptor について rb_maygvl_fd_fix_cloexec() を呼んで close-on-exec フラグを立てるようにしています。

akr:r33605 2011-11-01 19:49:40 +0900

r33605 は rb_maygvl_fd_fix_cloexec() じゃなくて rb_fd_fix_cloexec() を呼ぶようにして、file descriptor のプロセス内の最大値の更新も一緒にするようにしています。

naruse:r33606 2011-11-01 21:43:47 +0900

r33587 での NetBSD の pipe2(2) が正の整数を返すことの workaround を削除しています。これは NetBSD の不具合として修正されたそうです。 (参考URL: http://gnats.netbsd.org/cgi-bin/query-pr-single.pl?number=45545 )

nobu:r33607 2011-11-01 22:08:30 +0900

Mac OS X 10.7 (Lion) の、というか Xcode 4.3 の llvm-gcc は不具合があって ruby が Bus Error を起こすので未サポート(GNU gcc か clang を使ってください)なのですが、これにはまってエラー報告してくる人が後を断たないので configure.in で llvm-gcc をビルドエラーにするようにしています。 具体的には __llvm__ が定義されていて __clang__ が未定義の時に llvm-gcc だとしてエラーにしてます。