diff options
author | eban <eban@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2001-07-12 06:16:49 +0000 |
---|---|---|
committer | eban <eban@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2001-07-12 06:16:49 +0000 |
commit | 18efb38b210db318380f92d549cbf9400fb88ad8 (patch) | |
tree | b56cfbe555ea53742369f6795acea62ba66b002e /ext/socket/socket.c | |
parent | cbc3756009999e58d717af4fc82ba6c33bd3e7e6 (diff) |
* ext/socket/socket.c (ruby_connect): workaround for the setup of
Cygwin socket(EALREADY).
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@1589 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/socket/socket.c')
-rw-r--r-- | ext/socket/socket.c | 21 |
1 files changed, 15 insertions, 6 deletions
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; |