Merge 'mingw-safer-compat-poll'

This was pull request #1003 from shoelzer/master

poll: Use GetTickCount64 to avoid wraparound issues
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
This commit is contained in:
Johannes Schindelin
2018-06-08 18:35:08 +02:00

View File

@@ -266,6 +266,20 @@ win32_compute_revents_socket (SOCKET h, int sought, long lNetworkEvents)
return happened;
}
#include <windows.h>
#include "compat/win32/lazyload.h"
static ULONGLONG CompatGetTickCount64(void)
{
DECLARE_PROC_ADDR(kernel32.dll, ULONGLONG, GetTickCount64, void);
if (!INIT_PROC_ADDR(GetTickCount64))
return (ULONGLONG)GetTickCount();
return GetTickCount64();
}
#define GetTickCount64 CompatGetTickCount64
#else /* !MinGW */
/* Convert select(2) returned fd_sets into poll(2) revents values. */
@@ -449,7 +463,8 @@ poll (struct pollfd *pfd, nfds_t nfd, int timeout)
static HANDLE hEvent;
WSANETWORKEVENTS ev;
HANDLE h, handle_array[FD_SETSIZE + 2];
DWORD ret, wait_timeout, nhandles, start = 0, elapsed, orig_timeout = 0;
DWORD ret, wait_timeout, nhandles, elapsed, orig_timeout = 0;
ULONGLONG start = 0;
fd_set rfds, wfds, xfds;
BOOL poll_again;
MSG msg;
@@ -465,7 +480,7 @@ poll (struct pollfd *pfd, nfds_t nfd, int timeout)
if (timeout != INFTIM)
{
orig_timeout = timeout;
start = GetTickCount();
start = GetTickCount64();
}
if (!hEvent)
@@ -614,7 +629,7 @@ restart:
if (!rc && orig_timeout && timeout != INFTIM)
{
elapsed = GetTickCount() - start;
elapsed = (DWORD)(GetTickCount64() - start);
timeout = elapsed >= orig_timeout ? 0 : orig_timeout - elapsed;
}