* fhandler_socket.cc (fhandler_socket::connect): Don't restrict
WSAEINVAL -> WSAEISCONN conversion to nonblocking sockets. (fhandler_socket::accept): Use event driven technique to implement interuptible accept. (fhandler_socket::wait): Allow FD_ACCEPT handling. * net.cc (cygwin_accept): Remove workaround for allowing blocking accept. That's entirely in fhandler_socket::accept now.
This commit is contained in:
parent
152a9caf58
commit
c2c020d1fb
|
@ -1,3 +1,13 @@
|
|||
2005-10-22 Corinna Vinschen <corinna@vinschen.de>
|
||||
|
||||
* fhandler_socket.cc (fhandler_socket::connect): Don't restrict
|
||||
WSAEINVAL -> WSAEISCONN conversion to nonblocking sockets.
|
||||
(fhandler_socket::accept): Use event driven technique to implement
|
||||
interuptible accept.
|
||||
(fhandler_socket::wait): Allow FD_ACCEPT handling.
|
||||
* net.cc (cygwin_accept): Remove workaround for allowing blocking
|
||||
accept. That's entirely in fhandler_socket::accept now.
|
||||
|
||||
2005-10-22 Corinna Vinschen <corinna@vinschen.de>
|
||||
|
||||
* fhandler.h (class fhandler_socket): Add timeout parameter to wait()
|
||||
|
|
|
@ -710,9 +710,9 @@ fhandler_socket::connect (const struct sockaddr *name, int namelen)
|
|||
|
||||
if (err == WSAEWOULDBLOCK)
|
||||
WSASetLastError (err = WSAEINPROGRESS);
|
||||
else if (err == WSAEINVAL)
|
||||
WSASetLastError (err = WSAEISCONN);
|
||||
}
|
||||
if (err == WSAEINVAL)
|
||||
WSASetLastError (err = WSAEISCONN);
|
||||
set_winsock_errno ();
|
||||
}
|
||||
|
||||
|
@ -779,7 +779,21 @@ fhandler_socket::accept (struct sockaddr *peer, int *len)
|
|||
if (len && ((unsigned) *len < sizeof (struct sockaddr_in)))
|
||||
*len = sizeof (struct sockaddr_in);
|
||||
|
||||
res = ::accept (get_socket (), peer, len);
|
||||
if (is_nonblocking ())
|
||||
res = ::accept (get_socket (), peer, len);
|
||||
else
|
||||
{
|
||||
HANDLE evt;
|
||||
if (prepare (evt, FD_ACCEPT))
|
||||
{
|
||||
res = wait (evt, 0, INFINITE);
|
||||
if (res != -1
|
||||
|| (WSAGetLastError () != WSAEINTR
|
||||
&& WSAGetLastError () != WSAEFAULT))
|
||||
res = ::accept (get_socket (), peer, len);
|
||||
release (evt);
|
||||
}
|
||||
}
|
||||
|
||||
if (res == (int) INVALID_SOCKET)
|
||||
set_winsock_errno ();
|
||||
|
@ -923,6 +937,13 @@ fhandler_socket::wait (HANDLE event, int flags, DWORD timeout)
|
|||
break;
|
||||
}
|
||||
}
|
||||
if (evts.lNetworkEvents & FD_ACCEPT)
|
||||
{
|
||||
if (evts.iErrorCode[FD_ACCEPT_BIT])
|
||||
wsa_err = evts.iErrorCode[FD_ACCEPT_BIT];
|
||||
else
|
||||
ret = 0;
|
||||
}
|
||||
if (evts.lNetworkEvents & FD_CONNECT)
|
||||
{
|
||||
if (evts.iErrorCode[FD_CONNECT_BIT])
|
||||
|
|
|
@ -909,19 +909,7 @@ cygwin_accept (int fd, struct sockaddr *peer, int *len)
|
|||
if (efault.faulted (EFAULT) || !fh)
|
||||
res = -1;
|
||||
else
|
||||
{
|
||||
if (!fh->is_nonblocking ())
|
||||
{
|
||||
size_t fds_size = howmany (fd + 1, NFDBITS) * sizeof (fd_mask);
|
||||
fd_set *read_fds = (fd_set *) alloca (fds_size);
|
||||
memset (read_fds, 0, fds_size);
|
||||
FD_SET (fd, read_fds);
|
||||
res = cygwin_select (fd + 1, read_fds, NULL, NULL, NULL);
|
||||
if (res == -1)
|
||||
return -1;
|
||||
}
|
||||
res = fh->accept (peer, len);
|
||||
}
|
||||
res = fh->accept (peer, len);
|
||||
|
||||
syscall_printf ("%d = accept (%d, %p, %p)", res, fd, peer, len);
|
||||
return res;
|
||||
|
|
Loading…
Reference in New Issue