なかだです。

At Sun, 12 May 2002 11:52:12 +0900,
Nobuyoshi-Nakada wrote:
> [ruby-talk:40015]のmswin32でマルチスレッドでselectを使ったとき
> に空のArrayが返される件ですが、どうもeval.c:intersect_fds()がう
> まく動いてないようです。fd_setの構造の違いのせいなのかまだよく
> 分かってませんが、src, dstともにクリアされてしまってます。

ext/socket/socket.cでdup()しているせいでした。myfddup()ではハン
ドルは複製せずにディスクリプタだけ複製していますが、Winsockの
fd_setはハンドルベースになっているため、オリジナルのほうまでク
リアされてしまうようです。1.7ではdup()しなくなっているため発生
しません。これって1.6だとdup()しないとまずいんでしたっけ。

Index: socket.c
===================================================================
RCS file: /cvs/ruby/src/ruby/ext/socket/socket.c,v
retrieving revision 1.35.2.11
diff -u -2 -p -r1.35.2.11 ext/socket/socket.c
--- ext/socket/socket.c	2002/03/25 06:16:02	1.35.2.11
+++ ext/socket/socket.c	2002/05/13 04:07:59
@@ -183,7 +183,4 @@ sock_new(class, fd)
 #ifdef NT
     fp->finalize = sock_finalize;
-    fd = myfddup(fd);
-#else
-    fd = dup(fd);
 #endif
     fp->f2 = rb_fdopen(fd, "w");

-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦