summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authoreban <eban@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2001-07-12 06:16:49 +0000
committereban <eban@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2001-07-12 06:16:49 +0000
commit18efb38b210db318380f92d549cbf9400fb88ad8 (patch)
treeb56cfbe555ea53742369f6795acea62ba66b002e /ext
parentcbc3756009999e58d717af4fc82ba6c33bd3e7e6 (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')
-rw-r--r--ext/socket/socket.c21
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;