diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | ext/socket/socket.c | 21 |
2 files changed, 20 insertions, 6 deletions
@@ -1,3 +1,8 @@ +Thu Jul 12 15:11:48 2001 WATANABE Hirofumi <eban@ruby-lang.org> + + * ext/socket/socket.c (ruby_connect): workaround for the setup of + Cygwin socket(EALREADY). + Mon Jul 9 16:49:30 2001 WATANABE Hirofumi <eban@ruby-lang.org> * ext/extmk.rb.in: modify RM macro. diff --git a/ext/socket/socket.c b/ext/socket/socket.c index 3ad5c7f5db..f0ed09bd98 100644 --- a/ext/socket/socket.c +++ b/ext/socket/socket.c @@ -709,6 +709,9 @@ ruby_connect(fd, sockaddr, len, socks) { int status; int mode; +#if defined __CYGWIN__ + int wait_in_progress = -1; +#endif #if defined(HAVE_FCNTL) mode = fcntl(fd, F_GETFL, 0); @@ -744,17 +747,23 @@ ruby_connect(fd, sockaddr, len, socks) #ifdef EINPROGRESS case EINPROGRESS: #if defined __CYGWIN__ - { - struct timeval tv; - tv.tv_sec = 0; - tv.tv_usec = 100000; - rb_thread_wait_for(tv); - } + wait_in_progress = 10; #endif #endif thread_write_select(fd); 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 + #ifdef EISCONN case EISCONN: status = 0; |