Bruno Jesus : ws2_32: Cache the memory used for poll() calls.
Alexandre Julliard
julliard at winehq.org
Wed Nov 30 16:56:57 CST 2016
Module: wine
Branch: master
Commit: 2251aeb6d23b9ba56c46bc120a637098d70bf195
URL: http://source.winehq.org/git/wine.git/?a=commit;h=2251aeb6d23b9ba56c46bc120a637098d70bf195
Author: Bruno Jesus <00cpxxx at gmail.com>
Date: Wed Nov 30 04:48:28 2016 -0200
ws2_32: Cache the memory used for poll() calls.
Signed-off-by: Bruno Jesus <00cpxxx at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ws2_32/socket.c | 26 ++++++++++++++++++--------
1 file changed, 18 insertions(+), 8 deletions(-)
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index 8ad30b4..d863b3e 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -586,6 +586,8 @@ struct per_thread_data
struct WS_hostent *he_buffer;
struct WS_servent *se_buffer;
struct WS_protoent *pe_buffer;
+ struct pollfd *fd_cache;
+ unsigned int fd_count;
int he_len;
int se_len;
int pe_len;
@@ -1170,9 +1172,7 @@ static void free_per_thread_data(void)
HeapFree( GetProcessHeap(), 0, ptb->he_buffer );
HeapFree( GetProcessHeap(), 0, ptb->se_buffer );
HeapFree( GetProcessHeap(), 0, ptb->pe_buffer );
- ptb->he_buffer = NULL;
- ptb->se_buffer = NULL;
- ptb->pe_buffer = NULL;
+ HeapFree( GetProcessHeap(), 0, ptb->fd_cache );
HeapFree( GetProcessHeap(), 0, ptb );
NtCurrentTeb()->WinSockData = NULL;
@@ -5109,6 +5109,7 @@ static struct pollfd *fd_sets_to_poll( const WS_fd_set *readfds, const WS_fd_set
{
unsigned int i, j = 0, count = 0;
struct pollfd *fds;
+ struct per_thread_data *ptb = get_per_thread_data();
if (readfds) count += readfds->fd_count;
if (writefds) count += writefds->fd_count;
@@ -5119,11 +5120,22 @@ static struct pollfd *fd_sets_to_poll( const WS_fd_set *readfds, const WS_fd_set
SetLastError(WSAEINVAL);
return NULL;
}
- if (!(fds = HeapAlloc( GetProcessHeap(), 0, count * sizeof(fds[0]))))
+
+ /* check if the cache can hold all descriptors, if not do the resizing */
+ if (ptb->fd_count < count)
{
- SetLastError( ERROR_NOT_ENOUGH_MEMORY );
- return NULL;
+ if (!(fds = HeapAlloc(GetProcessHeap(), 0, count * sizeof(fds[0]))))
+ {
+ SetLastError( ERROR_NOT_ENOUGH_MEMORY );
+ return NULL;
+ }
+ HeapFree(GetProcessHeap(), 0, ptb->fd_cache);
+ ptb->fd_cache = fds;
+ ptb->fd_count = count;
}
+ else
+ fds = ptb->fd_cache;
+
if (readfds)
for (i = 0; i < readfds->fd_count; i++, j++)
{
@@ -5198,7 +5210,6 @@ failed:
if (exceptfds)
for (i = 0; i < exceptfds->fd_count && j < count; i++, j++)
if (fds[j].fd != -1) release_sock_fd( exceptfds->fd_array[i], fds[j].fd );
- HeapFree( GetProcessHeap(), 0, fds );
return NULL;
}
@@ -5331,7 +5342,6 @@ int WINAPI WS_select(int nfds, WS_fd_set *ws_readfds,
if (ret == -1) SetLastError(wsaErrno());
else ret = get_poll_results( ws_readfds, ws_writefds, ws_exceptfds, pollfds );
- HeapFree( GetProcessHeap(), 0, pollfds );
return ret;
}
More information about the wine-cvs
mailing list