From: Katsuyuki Komatsu Date: 2000-06-27T12:14:41+09:00 Subject: [ruby-list:23531] Re: Ruby 1.4.5 小松です。 In the message of "[ruby-list:23530] Re: Ruby 1.4.5" on 2000/6/27 MICHIMURA Tadao wrote: |えっと、このパッチを適用して作り直してみましたが、症状に変化はありま |せんでした。 | |それで、1.4.4の方で同様に試したところ、がんがんループしているようで、 |CPUの使用率が100%になりました。でも、1.4.5では、select待ちのままです。 |ですから、小松さんの解説(WSAENOTSOCKエラーになった場合の処理の変更) |ですと、今回のパッチでは修正されないような気もします。 いつのまにかeval.cでFD_CLR()を使うようになってますね。 FD_CLR()の置き換えの追加です。 で、Ruby 1.4.5に対して[ruby-list:23522]+このパッチを適用した後に、 以下のような感じで NT 4.0 SP6a で動作確認しましたが普通に動くように 見えます。CPU使用率も特に上がりません。 junk.fileが2行では小さすぎますか? なお、win32/win32.hを変更するので、nmake cleanでいったん全部 消してください。 C:\lang\ruby>type junk.file junk line 1 junk line 2 C:\lang\ruby>ruby -v tsvr.rb ruby 1.5.4 (2000-06-23) [i386-mswin32] server is on 1953 # is accepted C:\lang\ruby>ruby -v clnt.rb 1953 ruby 1.5.4 (2000-06-23) [i386-mswin32] Trying localhost ... done addr: AF_INET:1954:localhost:127.0.0.1 peer: AF_INET:1953:localhost:127.0.0.1 a a b junk line 1 c junk line 2 d b Tue Jun 27 12:05:10 2000 Katsuyuki Komatsu * win32.c (myfdclr): new function. * win32.h: add FD_CLR. diff -ru2p ruby-1.4.5.dist/win32/win32.c ruby-1.4.5/win32/win32.c --- ruby-1.4.5.dist/win32/win32.c Fri Feb 18 15:58:58 2000 +++ ruby-1.4.5/win32/win32.c Tue Jun 27 12:05:10 2000 @@ -1739,4 +1748,23 @@ myfdset(int fd, fd_set *set) } +#undef FD_CLR + +void +myfdclr(int fd, fd_set *set) +{ + unsigned int i; + SOCKET s = TO_SOCKET(fd); + + for (i = 0; i < set->fd_count; i++) { + if (set->fd_array[i] == s) { + while (i < set->fd_count - 1) { + set->fd_array[i] = set->fd_array[i + 1]; + i++; + } + set->fd_count--; + break; + } + } +} #undef FD_ISSET diff -ru2p ruby-1.4.5.dist/win32/win32.h ruby-1.4.5/win32/win32.h --- ruby-1.4.5.dist/win32/win32.h Fri Feb 18 15:58:58 2000 +++ ruby-1.4.5/win32/win32.h Tue Jun 27 12:05:10 2000 @@ -282,4 +282,7 @@ extern char *mystrerror(int); #define FD_SET myfdset +#undef FD_CLR +#define FD_CLR myfdclr + #undef FD_ISSET #define FD_ISSET myfdisset -- 小松克行 / Katsuyuki Komatsu