* 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

@ -1,3 +1,14 @@
2004-04-01 Corinna Vinschen <corinna@vinschen.de>
* 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.
2004-03-31 Corinna Vinschen <corinna@vinschen.de> 2004-03-31 Corinna Vinschen <corinna@vinschen.de>
* fhandler_tape.cc (mtinfo::initialize): Fix fatal error message. * fhandler_tape.cc (mtinfo::initialize): Fix fatal error message.

View File

@ -953,7 +953,8 @@ fhandler_socket::sendto (const void *ptr, size_t len, int flags,
break; break;
} }
} }
while (!(res = wsock_evt.wait (get_socket (), has_been_closed))); while (!(res = wsock_evt.wait (get_socket (), has_been_closed))
&& !has_been_closed);
wsock_evt.release (get_socket ()); wsock_evt.release (get_socket ());
} }
} }
@ -1088,7 +1089,8 @@ fhandler_socket::sendmsg (const struct msghdr *msg, int flags, ssize_t tot)
break; break;
} }
} }
while (!(res = wsock_evt.wait (get_socket (), has_been_closed))); while (!(res = wsock_evt.wait (get_socket (), has_been_closed))
&& !has_been_closed);
wsock_evt.release (get_socket ()); wsock_evt.release (get_socket ());
} }
} }

View File

@ -75,8 +75,8 @@ wsock_event::wait (int sock, int &closed)
{ {
case WSA_WAIT_EVENT_0: case WSA_WAIT_EVENT_0:
WSANETWORKEVENTS evts; WSANETWORKEVENTS evts;
memset (&evts, 0, sizeof evts); if (!WSAEnumNetworkEvents (sock, event, &evts))
WSAEnumNetworkEvents (sock, event, &evts); {
if (evts.lNetworkEvents & FD_READ) if (evts.lNetworkEvents & FD_READ)
{ {
if (evts.iErrorCode[FD_READ_BIT]) if (evts.iErrorCode[FD_READ_BIT])
@ -101,6 +101,7 @@ wsock_event::wait (int sock, int &closed)
} }
if (wsa_err) if (wsa_err)
WSASetLastError (wsa_err); WSASetLastError (wsa_err);
}
break; break;
case WSA_WAIT_EVENT_0 + 1: case WSA_WAIT_EVENT_0 + 1:
WSASetLastError (WSAEINTR); WSASetLastError (WSAEINTR);
@ -114,10 +115,14 @@ wsock_event::wait (int sock, int &closed)
void void
wsock_event::release (int sock) wsock_event::release (int sock)
{ {
int last_err = WSAGetLastError ();
WSAEventSelect (sock, event, 0); WSAEventSelect (sock, event, 0);
WSACloseEvent (event); WSACloseEvent (event);
unsigned long non_block = 0; 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; WSADATA wsadata;

View File

@ -16,12 +16,6 @@ class wsock_event
WSAEVENT event; WSAEVENT event;
public: public:
wsock_event () : event (NULL) {}; wsock_event () : event (NULL) {};
~wsock_event ()
{
if (event)
WSACloseEvent (event);
event = NULL;
};
/* The methods are implemented in net.cc */ /* The methods are implemented in net.cc */
bool prepare (int sock, long event_mask); bool prepare (int sock, long event_mask);