diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2006-07-27 13:58:54 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2006-07-27 13:58:54 +0000 |
commit | fd5879c110763e58717a23b259ecabd01a88684b (patch) | |
tree | 06d1bbfc98d6e9ad63bb65a2def2fdb687f47b15 /winsup/cygwin/select.cc | |
parent | 883861544a879eb161b1186ba6c62335a923aaca (diff) | |
download | cygnal-fd5879c110763e58717a23b259ecabd01a88684b.tar.gz cygnal-fd5879c110763e58717a23b259ecabd01a88684b.tar.bz2 cygnal-fd5879c110763e58717a23b259ecabd01a88684b.zip |
* 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.cc | 44 |
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; } |