小松です。
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>