* 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>
|
2005-10-22 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
* fhandler.h (class fhandler_socket): Add timeout parameter to wait()
|
* 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)
|
if (err == WSAEWOULDBLOCK)
|
||||||
WSASetLastError (err = WSAEINPROGRESS);
|
WSASetLastError (err = WSAEINPROGRESS);
|
||||||
else if (err == WSAEINVAL)
|
|
||||||
WSASetLastError (err = WSAEISCONN);
|
|
||||||
}
|
}
|
||||||
|
if (err == WSAEINVAL)
|
||||||
|
WSASetLastError (err = WSAEISCONN);
|
||||||
set_winsock_errno ();
|
set_winsock_errno ();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -779,7 +779,21 @@ fhandler_socket::accept (struct sockaddr *peer, int *len)
|
|||||||
if (len && ((unsigned) *len < sizeof (struct sockaddr_in)))
|
if (len && ((unsigned) *len < sizeof (struct sockaddr_in)))
|
||||||
*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)
|
if (res == (int) INVALID_SOCKET)
|
||||||
set_winsock_errno ();
|
set_winsock_errno ();
|
||||||
@ -923,6 +937,13 @@ fhandler_socket::wait (HANDLE event, int flags, DWORD timeout)
|
|||||||
break;
|
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.lNetworkEvents & FD_CONNECT)
|
||||||
{
|
{
|
||||||
if (evts.iErrorCode[FD_CONNECT_BIT])
|
if (evts.iErrorCode[FD_CONNECT_BIT])
|
||||||
|
@ -909,19 +909,7 @@ cygwin_accept (int fd, struct sockaddr *peer, int *len)
|
|||||||
if (efault.faulted (EFAULT) || !fh)
|
if (efault.faulted (EFAULT) || !fh)
|
||||||
res = -1;
|
res = -1;
|
||||||
else
|
else
|
||||||
{
|
res = fh->accept (peer, len);
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
syscall_printf ("%d = accept (%d, %p, %p)", res, fd, peer, len);
|
syscall_printf ("%d = accept (%d, %p, %p)", res, fd, peer, len);
|
||||||
return res;
|
return res;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user