Mike Kaplinskiy : ws2_32: Try accepting a connection before blocking.
Alexandre Julliard
julliard at winehq.org
Fri Sep 25 10:24:56 CDT 2009
Module: wine
Branch: master
Commit: 3905c7a03095afaa517ddc0d8d231ec4ce32e2c2
URL: http://source.winehq.org/git/wine.git/?a=commit;h=3905c7a03095afaa517ddc0d8d231ec4ce32e2c2
Author: Mike Kaplinskiy <mike.kaplinskiy at gmail.com>
Date: Fri Sep 25 01:59:16 2009 -0400
ws2_32: Try accepting a connection before blocking.
---
dlls/ws2_32/socket.c | 30 +++++++++++++++---------------
1 files changed, 15 insertions(+), 15 deletions(-)
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index c3ee046..4462a9a 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -1457,6 +1457,7 @@ static int WS2_register_async_shutdown( SOCKET s, int type )
SOCKET WINAPI WS_accept(SOCKET s, struct WS_sockaddr *addr,
int *addrlen32)
{
+ NTSTATUS status;
SOCKET as;
BOOL is_blocking;
@@ -1464,33 +1465,32 @@ SOCKET WINAPI WS_accept(SOCKET s, struct WS_sockaddr *addr,
is_blocking = _is_blocking(s);
do {
- if (is_blocking)
- {
- int fd = get_sock_fd( s, FILE_READ_DATA, NULL );
- if (fd == -1) return INVALID_SOCKET;
- /* block here */
- do_block(fd, POLLIN, -1);
- _sync_sock_state(s); /* let wineserver notice connection */
- release_sock_fd( s, fd );
- /* retrieve any error codes from it */
- SetLastError(_get_sock_error(s, FD_ACCEPT_BIT));
- /* FIXME: care about the error? */
- }
+ /* try accepting first (if there is a deferred connection) */
SERVER_START_REQ( accept_socket )
{
req->lhandle = wine_server_obj_handle( SOCKET2HANDLE(s) );
req->access = GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE;
req->attributes = OBJ_INHERIT;
- set_error( wine_server_call( req ) );
+ status = wine_server_call( req );
as = HANDLE2SOCKET( wine_server_ptr_handle( reply->handle ));
}
SERVER_END_REQ;
- if (as)
+ if (!status)
{
if (addr) WS_getpeername(as, addr, addrlen32);
return as;
}
- } while (is_blocking);
+ if (is_blocking && status == WSAEWOULDBLOCK)
+ {
+ int fd = get_sock_fd( s, FILE_READ_DATA, NULL );
+ /* block here */
+ do_block(fd, POLLIN, -1);
+ _sync_sock_state(s); /* let wineserver notice connection */
+ release_sock_fd( s, fd );
+ }
+ } while (is_blocking && status == WSAEWOULDBLOCK);
+
+ set_error(status);
return INVALID_SOCKET;
}
More information about the wine-cvs
mailing list