From: WATANABE Hirofumi Date: 2001-07-12T15:18:40+09:00 Subject: [ruby-list:30616] Re: open errno EALREADY triggerd わたなべです。 nobu.nakada@nifty.ne.jp writes: : 今EINPROGRESSのときにはwaitを入れるようになってますが、それで :も出るときは出るそうなので、やっぱり単純に0.1秒待つというだけで :は芳しくないようです。リトライしまくってみるというのも手かも知 :れません。 100回もリトライせんでもいい気がするのと、 EALREADYでもthread_write_selectしてしまうのが ちょっと気になったのでこうしました。 Index: ext/socket/socket.c =================================================================== RCS file: /src/ruby/ext/socket/socket.c,v retrieving revision 1.35.2.3 diff -u -1 -r1.35.2.3 socket.c --- ext/socket/socket.c 2001/06/22 15:49:08 1.35.2.3 +++ ext/socket/socket.c 2001/07/12 06:03:05 @@ -724,2 +724,5 @@ int mode; +#if defined __CYGWIN__ + int wait_in_progress = -1; +#endif @@ -759,8 +762,3 @@ #if defined __CYGWIN__ - { - struct timeval tv; - tv.tv_sec = 0; - tv.tv_usec = 100000; - rb_thread_wait_for(tv); - } + wait_in_progress = 10; #endif @@ -769,2 +767,13 @@ continue; + +#if defined __CYGWIN__ + case EALREADY: + case EINVAL: + if (--wait_in_progress > 0) { + struct timeval tv = {0, 100000}; + rb_thread_wait_for(tv); + continue; + } + break; +#endif