Module: wine Branch: master Commit: 40494359cb5839131368847063902b4bc228f6bc URL: https://source.winehq.org/git/wine.git/?a=commit;h=40494359cb583913136884706...
Author: Zebediah Figura zfigura@codeweavers.com Date: Wed Dec 29 15:45:59 2021 -0600
ws2_32: Don't bother checking sockets against the input write or except sets.
We only need to check the input set for CLOSE. For all other flags we can guarantee that the socket was included in a unique input set.
E.g. the presence of WRITE in the output flags implies that the socket must have been in the "write" set to begin with.
Signed-off-by: Zebediah Figura zfigura@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ws2_32/socket.c | 60 ++++++++++++++++++++++++---------------------------- 1 file changed, 28 insertions(+), 32 deletions(-)
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c index 698e788c459..b5f479f5a07 100644 --- a/dlls/ws2_32/socket.c +++ b/dlls/ws2_32/socket.c @@ -2382,7 +2382,7 @@ int WINAPI select( int count, fd_set *read_ptr, fd_set *write_ptr, { char buffer[offsetof( struct afd_poll_params, sockets[FD_SETSIZE * 3] )] = {0}; struct afd_poll_params *params = (struct afd_poll_params *)buffer; - struct fd_set read, write, except; + struct fd_set read_input; ULONG params_size, i, j; SOCKET poll_socket = 0; IO_STATUS_BLOCK io; @@ -2392,12 +2392,8 @@ int WINAPI select( int count, fd_set *read_ptr, fd_set *write_ptr,
TRACE( "read %p, write %p, except %p, timeout %p\n", read_ptr, write_ptr, except_ptr, timeout );
- FD_ZERO( &read ); - FD_ZERO( &write ); - FD_ZERO( &except ); - if (read_ptr) read.fd_count = read_ptr->fd_count; - if (write_ptr) write.fd_count = write_ptr->fd_count; - if (except_ptr) except.fd_count = except_ptr->fd_count; + FD_ZERO( &read_input ); + if (read_ptr) read_input.fd_count = read_ptr->fd_count;
if (!(sync_event = get_sync_event())) return -1;
@@ -2406,28 +2402,34 @@ int WINAPI select( int count, fd_set *read_ptr, fd_set *write_ptr, else params->timeout = TIMEOUT_INFINITE;
- for (i = 0; i < read.fd_count; ++i) + for (i = 0; i < read_input.fd_count; ++i) { - params->sockets[params->count].socket = read.fd_array[i] = read_ptr->fd_array[i]; + params->sockets[params->count].socket = read_input.fd_array[i] = read_ptr->fd_array[i]; params->sockets[params->count].flags = AFD_POLL_READ | AFD_POLL_ACCEPT | AFD_POLL_HUP; ++params->count; - poll_socket = read.fd_array[i]; + poll_socket = read_input.fd_array[i]; }
- for (i = 0; i < write.fd_count; ++i) + if (write_ptr) { - params->sockets[params->count].socket = write.fd_array[i] = write_ptr->fd_array[i]; - params->sockets[params->count].flags = AFD_POLL_WRITE; - ++params->count; - poll_socket = write.fd_array[i]; + for (i = 0; i < write_ptr->fd_count; ++i) + { + params->sockets[params->count].socket = write_ptr->fd_array[i]; + params->sockets[params->count].flags = AFD_POLL_WRITE; + ++params->count; + poll_socket = write_ptr->fd_array[i]; + } }
- for (i = 0; i < except.fd_count; ++i) + if (except_ptr) { - params->sockets[params->count].socket = except.fd_array[i] = except_ptr->fd_array[i]; - params->sockets[params->count].flags = AFD_POLL_OOB | AFD_POLL_CONNECT_ERR; - ++params->count; - poll_socket = except.fd_array[i]; + for (i = 0; i < except_ptr->fd_count; ++i) + { + params->sockets[params->count].socket = except_ptr->fd_array[i]; + params->sockets[params->count].flags = AFD_POLL_OOB | AFD_POLL_CONNECT_ERR; + ++params->count; + poll_socket = except_ptr->fd_array[i]; + } }
if (!params->count) @@ -2459,9 +2461,9 @@ int WINAPI select( int count, fd_set *read_ptr, fd_set *write_ptr, unsigned int flags = params->sockets[i].flags; SOCKET s = params->sockets[i].socket;
- for (j = 0; j < read.fd_count; ++j) + for (j = 0; j < read_input.fd_count; ++j) { - if (read.fd_array[j] == s + if (read_input.fd_array[j] == s && (flags & (AFD_POLL_READ | AFD_POLL_ACCEPT | AFD_POLL_HUP | AFD_POLL_CLOSE))) { ret_count += add_fd_to_set( s, read_ptr ); @@ -2472,17 +2474,11 @@ int WINAPI select( int count, fd_set *read_ptr, fd_set *write_ptr, if (flags & AFD_POLL_CLOSE) status = STATUS_INVALID_HANDLE;
- for (j = 0; j < write.fd_count; ++j) - { - if (write.fd_array[j] == s && (flags & AFD_POLL_WRITE)) - ret_count += add_fd_to_set( s, write_ptr ); - } + if (flags & AFD_POLL_WRITE) + ret_count += add_fd_to_set( s, write_ptr );
- for (j = 0; j < except.fd_count; ++j) - { - if (except.fd_array[j] == s && (flags & (AFD_POLL_OOB | AFD_POLL_CONNECT_ERR))) - ret_count += add_fd_to_set( s, except_ptr ); - } + if (flags & (AFD_POLL_OOB | AFD_POLL_CONNECT_ERR)) + ret_count += add_fd_to_set( s, except_ptr ); } }