test3026: reduce runtime in legacy mingw builds

- Load Windows system libraries secur32 and iphlpapi beforehand, so
  that libcurl's repeated global init/cleanup only increases/decreases
  the library's refcount rather than causing it to load/unload.

Assisted-by: Marc Hoersken

Closes https://github.com/curl/curl/pull/9412
This commit is contained in:
Jay Satiro 2022-11-14 04:07:30 -05:00
parent 37ca6f0f9a
commit 856b133f5d
3 changed files with 42 additions and 1 deletions

View File

@ -69,6 +69,14 @@ int test(char *URL)
return -1;
}
/* On Windows libcurl global init/cleanup calls LoadLibrary/FreeLibrary for
secur32.dll and iphlpapi.dll. Here we load them beforehand so that when
libcurl calls LoadLibrary/FreeLibrary it only increases/decreases the
library's refcount rather than actually loading/unloading the library,
which would affect the test runtime. */
(void)win32_load_system_library(TEXT("secur32.dll"));
(void)win32_load_system_library(TEXT("iphlpapi.dll"));
for(i = 0; i < tid_count; i++) {
curl_win_thread_handle_t th;
results[i] = CURL_LAST; /* initialize with invalid value */

View File

@ -117,7 +117,6 @@ long tutil_tvdiff(struct timeval newer, struct timeval older)
(long)(newer.tv_usec-older.tv_usec)/1000;
}
/*
* Same as tutil_tvdiff but with full usec resolution.
*
@ -130,3 +129,34 @@ double tutil_tvdiff_secs(struct timeval newer, struct timeval older)
(double)(newer.tv_usec-older.tv_usec)/1000000.0;
return (double)(newer.tv_usec-older.tv_usec)/1000000.0;
}
#ifdef WIN32
HMODULE win32_load_system_library(const TCHAR *filename)
{
size_t filenamelen = _tcslen(filename);
size_t systemdirlen = GetSystemDirectory(NULL, 0);
size_t written;
TCHAR *path;
if(!filenamelen || filenamelen > 32768 ||
!systemdirlen || systemdirlen > 32768)
return NULL;
/* systemdirlen includes null character */
path = malloc(sizeof(TCHAR) * (systemdirlen + 1 + filenamelen));
if(!path)
return NULL;
/* if written >= systemdirlen then nothing was written */
written = GetSystemDirectory(path, (unsigned int)systemdirlen);
if(!written || written >= systemdirlen)
return NULL;
if(path[written - 1] != _T('\\'))
path[written++] = _T('\\');
_tcscpy(path + written, filename);
return LoadLibrary(path);
}
#endif

View File

@ -42,5 +42,8 @@ long tutil_tvdiff(struct timeval t1, struct timeval t2);
*/
double tutil_tvdiff_secs(struct timeval t1, struct timeval t2);
#ifdef WIN32
HMODULE win32_load_system_library(const TCHAR *filename);
#endif
#endif /* HEADER_CURL_LIBTEST_TESTUTIL_H */