1
0
mirror of https://github.com/solemnwarning/ipxwrapper synced 2024-12-30 16:45:37 +01:00

Use GetTickCount64() for connect timeouts where available.

This commit is contained in:
Daniel Collins 2014-01-25 23:33:11 +00:00
parent b5a92e00ad
commit e5315890fd
3 changed files with 32 additions and 6 deletions

View File

@ -1,5 +1,5 @@
/* ipxwrapper - Library functions /* ipxwrapper - Library functions
* Copyright (C) 2008-2013 Daniel Collins <solemnwarning@solemnwarning.net> * Copyright (C) 2008-2014 Daniel Collins <solemnwarning@solemnwarning.net>
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 as published by * under the terms of the GNU General Public License version 2 as published by
@ -48,6 +48,9 @@ main_config_t main_config;
static CRITICAL_SECTION sockets_cs; static CRITICAL_SECTION sockets_cs;
typedef ULONGLONG WINAPI (*GetTickCount64_t)(void);
static HMODULE kernel32 = NULL;
static void init_cs(CRITICAL_SECTION *cs) static void init_cs(CRITICAL_SECTION *cs)
{ {
if(!InitializeCriticalSectionAndSpinCount(cs, 0x80000000)) if(!InitializeCriticalSectionAndSpinCount(cs, 0x80000000))
@ -121,6 +124,12 @@ BOOL WINAPI DllMain(HINSTANCE me, DWORD why, LPVOID res)
unload_dlls(); unload_dlls();
log_close(); log_close();
if(kernel32)
{
FreeLibrary(kernel32);
kernel32 = NULL;
}
} }
return TRUE; return TRUE;
@ -157,3 +166,21 @@ void unlock_sockets(void)
{ {
LeaveCriticalSection(&sockets_cs); LeaveCriticalSection(&sockets_cs);
} }
uint64_t get_ticks(void)
{
static GetTickCount64_t GetTickCount64 = NULL;
if(!kernel32 && (kernel32 = LoadLibrary("kernel32.dll")))
{
GetTickCount64 = (GetTickCount64_t)(GetProcAddress(kernel32, "GetTickCount64"));
}
if(GetTickCount64)
{
return GetTickCount64();
}
else{
return GetTickCount();
}
}

View File

@ -1,5 +1,5 @@
/* ipxwrapper - Library header /* ipxwrapper - Library header
* Copyright (C) 2008-2013 Daniel Collins <solemnwarning@solemnwarning.net> * Copyright (C) 2008-2014 Daniel Collins <solemnwarning@solemnwarning.net>
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 as published by * under the terms of the GNU General Public License version 2 as published by
@ -131,6 +131,7 @@ extern main_config_t main_config;
ipx_socket *get_socket(SOCKET sockfd); ipx_socket *get_socket(SOCKET sockfd);
void lock_sockets(void); void lock_sockets(void);
void unlock_sockets(void); void unlock_sockets(void);
uint64_t get_ticks(void);
void add_self_to_firewall(void); void add_self_to_firewall(void);

View File

@ -1635,13 +1635,11 @@ static int _connect_spx(ipx_socket *sock, struct sockaddr_ipx *ipxaddr)
* *
* BUG: Batch may time out or wait (effectively) forever if the * BUG: Batch may time out or wait (effectively) forever if the
* batch is sent just before the system tick count rolls over. * batch is sent just before the system tick count rolls over.
*
* TODO: Use GetTickCount64() if available.
*/ */
DWORD wait_until = GetTickCount() + (IPX_CONNECT_TIMEOUT / IPX_CONNECT_TRIES) * 1000; uint64_t wait_until = get_ticks() + (IPX_CONNECT_TIMEOUT / IPX_CONNECT_TRIES) * 1000;
for(DWORD now; (now = GetTickCount()) < wait_until;) for(uint64_t now; (now = get_ticks()) < wait_until;)
{ {
/* Release the socket table in case the remote address /* Release the socket table in case the remote address
* in question is in the same process and we block the * in question is in the same process and we block the