* 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.
This commit is contained in:
Corinna Vinschen
2006-07-27 13:58:54 +00:00
parent 883861544a
commit fd5879c110
4 changed files with 50 additions and 44 deletions

View File

@ -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;
}