summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/select.cc
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/select.cc')
-rw-r--r--winsup/cygwin/select.cc28
1 files changed, 21 insertions, 7 deletions
diff --git a/winsup/cygwin/select.cc b/winsup/cygwin/select.cc
index 46f0c6963..30e082a2e 100644
--- a/winsup/cygwin/select.cc
+++ b/winsup/cygwin/select.cc
@@ -336,11 +336,20 @@ set_bits (select_record *me, fd_set *readfds, fd_set *writefds,
if (me->write_selected && me->write_ready)
{
UNIX_FD_SET (me->fd, writefds);
+ if (me->except_on_write && me->fh->get_device () == FH_SOCKET)
+ ((fhandler_socket *) me->fh)->set_connect_state (CONNECTED);
ready++;
}
- if (me->except_selected && me->except_ready)
+ if ((me->except_selected || me->except_on_write) && me->except_ready)
{
- UNIX_FD_SET (me->fd, exceptfds);
+ if (me->except_on_write) /* Only on sockets */
+ {
+ UNIX_FD_SET (me->fd, writefds);
+ if (me->fh->get_device () == FH_SOCKET)
+ ((fhandler_socket *) me->fh)->set_connect_state (CONNECTED);
+ }
+ if (me->except_selected)
+ UNIX_FD_SET (me->fd, exceptfds);
ready++;
}
select_printf ("ready %d", ready);
@@ -1192,7 +1201,7 @@ peek_socket (select_record *me, bool)
me->fd);
WINSOCK_FD_SET (h, &ws_writefds);
}
- if (me->except_selected && !me->except_ready)
+ if ((me->except_selected || me->except_on_write) && !me->except_ready)
{
select_printf ("adding except fd_set %s, fd %d", me->fh->get_name (),
me->fd);
@@ -1201,7 +1210,7 @@ peek_socket (select_record *me, bool)
int r;
if ((me->read_selected && !me->read_ready)
|| (me->write_selected && !me->write_ready)
- || (me->except_selected && !me->except_ready))
+ || ((me->except_selected || me->except_on_write) && !me->except_ready))
{
r = WINSOCK_SELECT (0, &ws_readfds, &ws_writefds, &ws_exceptfds, &tv);
select_printf ("WINSOCK_SELECT returned %d", r);
@@ -1215,7 +1224,7 @@ peek_socket (select_record *me, bool)
me->read_ready = true;
if (WINSOCK_FD_ISSET (h, &ws_writefds) || (me->write_selected && me->write_ready))
me->write_ready = true;
- if (WINSOCK_FD_ISSET (h, &ws_exceptfds) || (me->except_selected && me->except_ready))
+ if (WINSOCK_FD_ISSET (h, &ws_exceptfds) || ((me->except_selected || me->except_on_write) && me->except_ready))
me->except_ready = true;
}
return me->read_ready || me->write_ready || me->except_ready;
@@ -1295,7 +1304,7 @@ start_thread_socket (select_record *me, select_stuff *stuff)
WINSOCK_FD_SET (h, &si->writefds);
select_printf ("Added to writefds");
}
- if (s->except_selected && !s->except_ready)
+ if ((s->except_selected || s->except_on_write) && !s->except_ready)
{
WINSOCK_FD_SET (h, &si->exceptfds);
select_printf ("Added to exceptfds");
@@ -1415,8 +1424,13 @@ fhandler_socket::select_write (select_record *s)
s->cleanup = socket_cleanup;
}
s->peek = peek_socket;
- s->write_ready = saw_shutdown_write () || !is_connected ();
+ s->write_ready = saw_shutdown_write () || is_unconnected ();
s->write_selected = true;
+ if (is_connect_pending ())
+ {
+ s->except_ready = saw_shutdown_write () || saw_shutdown_read ();
+ s->except_on_write = true;
+ }
return s;
}