* fhandler.h (fhandler_socket::is_unconnected): Constify.
(fhandler_socket::is_connect_pending): Ditto. (fhandler_socket::is_connected): Ditto. (fhandler_socket::set_connect_state): New method. (struct select_record): Add member `except_on_write'. (select_record::select_record): Initialize all bool values to `false'. * fhandler_socket.cc: Use set_connect_state() method throughout. (fhandler_socket::connect): Set state always to connected if connection isn't pending. * net.cc (cygwin_getsockopt): Revert erroneous previous patch. * select.cc (set_bits): Check for `except_on_write'. Set fd in write_fds if set. Set connect state to connected if fd has been returned by WINSOCK_SELECT. (peek_socket): Check for `except_on_write'. (start_thread_socket): Ditto. (fhandler_socket::select_write): Don't set `write_ready' if connect is pending. Set `except_on_write' if connect is pending.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user