[PATCH 3/4] ws2_32: Don't bother checking sockets against the input write or except sets.
Zebediah Figura
zfigura at codeweavers.com
Wed Dec 29 15:45:59 CST 2021
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 at codeweavers.com>
---
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 318e1dac437..e517b239d5b 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 );
}
}
--
2.34.1
More information about the wine-devel
mailing list