丁稚な日々

Rubyで遊んだ日々の記録。あくまで著者視点の私的な記録なので、正確さを求めないように。
Rubyと関係ない話題にはその旨注記しているはず。なので、一見関係無いように見える話題もどこかで関係あるのかもしれません。または、注記の書き忘れかもしれません...

[直前] [最新] [直後] [Top]

Jul.29,2006 (Sat)

Revision: 1.2 (Jul.29,2006 05:57)

[mswin32] 1.8のsocket

_ [ruby-list:42608]の件は、実は以下のパッチを適用するのがもっとも確実なworkaroudであろうと思われる。

Index: ext/socket/socket.c
===================================================================
RCS file: /home/cvs/ruby/ext/socket/socket.c,v
retrieving revision 1.108.2.52
diff -u -1 -p -r1.108.2.52 socket.c
--- ext/socket/socket.c	21 Jun 2006 20:19:07 -0000	1.108.2.52
+++ ext/socket/socket.c	28 Jul 2006 20:36:34 -0000
@@ -213,3 +213,3 @@ init_sock(sock, fd)
     fp->f = rb_fdopen(fd, "r");
-    fp->f2 = rb_fdopen(fd, "w");
+    fp->f2 = rb_fdopen(dup(fd), "w");
     fp->mode = FMODE_READWRITE;

[ruby-list:42611]では、さもVC8のランタイムが悪い、みたいな書き方をしてるけど、そもそも同一のファイルデスクリプタから複数のファイルポインタを生成するのが間違ってるという気もかなりするわけで、ちゃんとdup()っといてからfdopen()するのが無難であろう。

_ さて、実はかつてのrubyの実装では、この部分(に該当するコード)では、ちゃんとファイルデスクリプタを複製してからfdopen()していた。
このdup()が削除されたのは2001年2月13日のことだが、なぜ削除されたかの理由は定かではない([ruby-dev:17065])。私の名前が後で挙がってるけど無実なんだからねっ!

_ 実際のところ、ここにdup()を追加することによって、内部的にはソケットがDuplicateHandle()によって複製されるのだが、実はこれには問題があって、Winsock1のみがTCP/IPスタックとしてインストールされている環境ではDuplicateHandle()によって複製されたソケットに対してclosesocket()しようとすると、実際にはそのソケットはクローズされないというバグがある。
かすかな記憶によると、この他にも、DuplicateHandle()されたソケットに対して幾つか問題が発生するオペレーションがあったような気もするのだが、もう何も覚えてないし、おそらく現代のWindowsでは既に問題は解消されているだろうという気もする。
何しろMicrosoftのドキュメントにはちゃんとソケットが複製できるって書いてあるんだし。

_ 本当はWinsock2のWSADuplicateSocket()を使うほうがいいとかなんだとかいう説もあるが、実際のところはどうなんだろうねえ。
Windowsのソケット周りはどうにもすっきりせんね。

_ 結論としては、どっちにしろdup()を使う変更をruby自体に取り込む気はないので、各自で好きにするのがよいでしょう、ってことで。

_ 私はこれからしばらく出かけるので、その後も元の質問者が困ってるようなら、誰かこの日記の情報を教えてあげてください。

Jul.31,2006 (Mon)

Revision: 1.1 (Jul.31,2006 09:23)

[子供] 退院

_ そういえば、さすがにこれ系の話題はRubyと関係ないよなあ。

_ というのはともかく、せっかち過ぎて産まれたせいで入院してたうちの子が、土曜(29日)に退院しました。思ったより早かった。
でも、まだ本来の予定日にも達してないので、まだまだちっちゃいんですが。
それにしても、母親って大変なのだなあ、と改めて実感。俺、絶対に3時間ごとになんか起きられねえよ(←起きて手伝えよ)。

_ 嫁や義母によると、どうやら私に似てるらしいです。ガーン。
念のために自分の赤ん坊の頃の写真を確認してみたら、確かに似てる気がするなあ。かわいそうに……。


被捕捉アンテナ類
[\ay antenna (testing)] [Ant] [Antenna-Julia] [LayserあんてなV2] [nAntenna] [nuance de Antenna] [Rabbit's Antenna] [Read List] [Ruby hotlinks 五月雨版 (るるりん。)] [してたま (私的アンテナ with たまてばこ)] [ただのあんてな] [ちゃらんぽらん] [でこぽんリンク] [なよろアンテナ] [にっきトレーサー] [偽善者あんてな - 2nd season -] [湘南日記放送局(SDB)] [はてなの各アンテナ]