* fhandler_socket.cc (fhandler_socket::sendto): Drop out of loop if

has_been_closed gets set.
	(fhandler_socket::sendmsg): Ditto.
	* net.cc (wsock_event::wait): Don't initialize evts.  Don't try to
	evaluate network events if WSAEnumNetworkEvents fails.
	(wsock_event::release): Save last WSA error and set it again unless
	resetting to blocking socket fails.
	* wsock_event.h (class wsock_event): Remove destructor.
This commit is contained in:
Corinna Vinschen
2004-04-01 09:48:15 +00:00
parent fbba4780af
commit 54aefcc6bc
4 changed files with 45 additions and 33 deletions

View File

@@ -75,32 +75,33 @@ wsock_event::wait (int sock, int &closed)
{
case WSA_WAIT_EVENT_0:
WSANETWORKEVENTS evts;
memset (&evts, 0, sizeof evts);
WSAEnumNetworkEvents (sock, event, &evts);
if (evts.lNetworkEvents & FD_READ)
if (!WSAEnumNetworkEvents (sock, event, &evts))
{
if (evts.iErrorCode[FD_READ_BIT])
wsa_err = evts.iErrorCode[FD_READ_BIT];
else
ret = 0;
if (evts.lNetworkEvents & FD_READ)
{
if (evts.iErrorCode[FD_READ_BIT])
wsa_err = evts.iErrorCode[FD_READ_BIT];
else
ret = 0;
}
else if (evts.lNetworkEvents & FD_WRITE)
{
if (evts.iErrorCode[FD_WRITE_BIT])
wsa_err = evts.iErrorCode[FD_WRITE_BIT];
else
ret = 0;
}
if (evts.lNetworkEvents & FD_CLOSE)
{
closed = 1;
if (!wsa_err && evts.iErrorCode[FD_CLOSE_BIT])
wsa_err = evts.iErrorCode[FD_CLOSE_BIT];
else
ret = 0;
}
if (wsa_err)
WSASetLastError (wsa_err);
}
else if (evts.lNetworkEvents & FD_WRITE)
{
if (evts.iErrorCode[FD_WRITE_BIT])
wsa_err = evts.iErrorCode[FD_WRITE_BIT];
else
ret = 0;
}
if (evts.lNetworkEvents & FD_CLOSE)
{
closed = 1;
if (!wsa_err && evts.iErrorCode[FD_CLOSE_BIT])
wsa_err = evts.iErrorCode[FD_CLOSE_BIT];
else
ret = 0;
}
if (wsa_err)
WSASetLastError (wsa_err);
break;
case WSA_WAIT_EVENT_0 + 1:
WSASetLastError (WSAEINTR);
@@ -114,10 +115,14 @@ wsock_event::wait (int sock, int &closed)
void
wsock_event::release (int sock)
{
int last_err = WSAGetLastError ();
WSAEventSelect (sock, event, 0);
WSACloseEvent (event);
unsigned long non_block = 0;
ioctlsocket (sock, FIONBIO, &non_block);
if (ioctlsocket (sock, FIONBIO, &non_block))
debug_printf ("return to blocking failed: %d", WSAGetLastError ());
else
WSASetLastError (last_err);
}
WSADATA wsadata;