Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2006-07-27 17:58:54 +0400
committerCorinna Vinschen <corinna@vinschen.de>2006-07-27 17:58:54 +0400
commitfd5879c110763e58717a23b259ecabd01a88684b (patch)
tree06d1bbfc98d6e9ad63bb65a2def2fdb687f47b15 /winsup/cygwin/select.cc
parent883861544a879eb161b1186ba6c62335a923aaca (diff)
* fhandler_socket.cc: Revert misguided attempt to handle FD_CLOSE error
conditions in evaluate_events. (search_wsa_event_slot): Move wrongly placed memset in fhandler_socket::init_events here. (fhandler_socket::init_events): Initially set FD_WRITE event for connectionless sockets. * poll.cc (poll): Don't add sockets always to except_fds since select is now supposed to do it right. * select.cc (set_bits): Set connection state correctly for failed af_local_connect on local sockets. Remove socket special handling for except_selected descriptors. (peek_socket): Try to set the read/write/exception bits actually correctly.
Diffstat (limited to 'winsup/cygwin/select.cc')
-rw-r--r--winsup/cygwin/select.cc44
1 files changed, 20 insertions, 24 deletions
diff --git a/winsup/cygwin/select.cc b/winsup/cygwin/select.cc
index abfe9e5a3..e5b50d375 100644
--- a/winsup/cygwin/select.cc
+++ b/winsup/cygwin/select.cc
@@ -364,22 +364,20 @@ set_bits (select_record *me, fd_set *readfds, fd_set *writefds,
{
/* Special AF_LOCAL handling. */
if (!me->read_ready && sock->connect_state () == connect_pending
- && sock->af_local_connect () && me->read_selected)
- UNIX_FD_SET (me->fd, readfds);
- sock->connect_state (connected);
+ && sock->af_local_connect ())
+ {
+ if (me->read_selected)
+ UNIX_FD_SET (me->fd, readfds);
+ sock->connect_state (connect_failed);
+ }
+ else
+ sock->connect_state (connected);
}
ready++;
}
- if ((me->except_selected || me->except_on_write) && me->except_ready)
+ if (me->except_selected && me->except_ready)
{
- if (me->except_on_write) /* Only on sockets */
- {
- UNIX_FD_SET (me->fd, writefds);
- if ((sock = me->fh->is_socket ()))
- sock->connect_state (connect_failed);
- }
- if (me->except_selected)
- UNIX_FD_SET (me->fd, exceptfds);
+ UNIX_FD_SET (me->fd, exceptfds);
ready++;
}
select_printf ("ready %d", ready);
@@ -1264,23 +1262,21 @@ peek_socket (select_record *me, bool)
{
fhandler_socket *fh = (fhandler_socket *) me->fh;
long events;
- long evt_mask = (FD_CLOSE
- | (me->read_selected ? (FD_READ | FD_ACCEPT) : 0)
- | (me->write_selected ? (FD_WRITE | FD_CONNECT) : 0)
- | (me->except_selected ? (FD_OOB | FD_CONNECT) : 0));
+ /* Don't play with the settings again, unless having taken a deep look into
+ Richard W. Stevens Network Programming book. Thank you. */
+ long evt_mask = (me->read_selected ? (FD_READ | FD_ACCEPT | FD_CLOSE) : 0)
+ | (me->write_selected ? (FD_WRITE | FD_CONNECT | FD_CLOSE) : 0)
+ | (me->except_selected ? FD_OOB : 0);
int ret = fh->evaluate_events (evt_mask, events, false);
if (me->read_selected)
- me->read_ready |= !!(events & (FD_READ | FD_ACCEPT | FD_CLOSE));
+ me->read_ready |= ret || !!(events & (FD_READ | FD_ACCEPT | FD_CLOSE));
if (me->write_selected)
- {
- if ((events & FD_CONNECT) && !ret)
- me->write_ready = true;
- else
- me->write_ready |= !!(events & (FD_WRITE | FD_CLOSE));
- }
+ me->write_ready |= ret || !!(events & (FD_WRITE | FD_CONNECT | FD_CLOSE));
if (me->except_selected)
- me->except_ready |= ret || !!(events & FD_OOB);
+ me->except_ready |= !!(events & FD_OOB);
+ select_printf ("read_ready: %d, write_ready: %d, except_ready: %d",
+ me->read_ready, me->write_ready, me->except_ready);
return me->read_ready || me->write_ready || me->except_ready;
}