小松です。

In the message of [ruby-list:16838] Re: Ruby 1.4.2
    on 1999/9/17 13:39:55 Katsuyuki Komatsu <komatsu / sarion.co.jp> wrote:
|ruby-1.4.2.tar.gzに入っているirbはirb-0.6-beta.tgzのようですが、
|これをインストールするとmswin32版だけirbが起動時にハングする
|ようになってしまいました。
|他のプラットフォームでは再現しません。

ハングの方は、eval.cはrb_thread_schedule()でEBADFを期待していて
いるのに、win32/win32.cのmyselect()がWSAENOTSOCKを返しているため
無限ループになっているようです。

|irb-0.6.1.tgzに入れ替えると大丈夫でした。
|
|# 症状が違いますが、[ruby-dev:7845]関連かなあ?
|
|次のRubyのリリースには、irb-0.6.1.tgzを入れて欲しいです。

とりあえず、win32/win32.cを下のパッチのようにしてみたところ、
deadlockにはなりましたが、eval.cでSegmentation faultが起きます。

C:\lang\ruby-1.4.2>miniruby -Ilib sample/irb.rb
./lib/irb/bind.rb:0:deadlock 0x612638: 1:1
./lib/thread.rb:151:deadlock 0x605c70: 1:0 (main)
sample/irb.rb:18:deadlock 0x605c70: 1:0 (main)
./lib/irb/main.rb:929: [BUG] Segmentation fault

abnormal program termination

C:\lang\ruby-1.4.2>

そこで、一時的にeval.cを

--- eval.c.dist	Fri Sep 17 01:11:24 1999
+++ eval.c	Fri Sep 17 23:31:52 1999
@@ -3137,5 +3137,6 @@ rb_f_raise(argc, argv)
 
     PUSH_FRAME();		/* fake frame */
-    *ruby_frame = *_frame.prev->prev;
+    if (_frame.prev->prev)
+	*ruby_frame = *_frame.prev->prev;
     rb_longjmp(TAG_RAISE, mesg);
     POP_FRAME();

としたところ、最終的には以下のような感じになるようです。

C:\lang\ruby-1.4.2>miniruby -Ilib sample/irb.rb
./lib/irb/bind.rb:0:deadlock 0x612638: 1:1
./lib/thread.rb:151:deadlock 0x605c70: 1:0 (main)
sample/irb.rb:18:deadlock 0x605c70: 1:0 (main)
./lib/irb/main.rb:929:in `(null)': Thread: deadlock (fatal)
        from ./lib/irb/main.rb:929

C:\lang\ruby-1.4.2>

とりあえず、中間報告。

# win32/win32.cの方は、もうすこしなんとかしないとならないなあ。

--- win32/win32.c.dist Fri Aug 13 14:45:20 1999 +++ win32/win32.c Fri Sep 17 23:21:06 1999 @@ -1829,6 +1829,15 @@ myselect (int nfds, fd_set *rd, fd_set * StartSockets(); } - if ((r = select (nfds, rd, wr, ex, timeout)) == SOCKET_ERROR) - errno = WSAGetLastError(); + if ((r = select (nfds, rd, wr, ex, timeout)) == SOCKET_ERROR) { + errno = WSAGetLastError(); + switch (errno) { + case WSAEINTR: + errno = EINTR; + break; + case WSAENOTSOCK: + errno = EBADF; + break; + } + } return r; } -- 小松克行 / Katsuyuki Komatsu <komatsu / sarion.co.jp>