From: Jay Satiro Date: Mon, 14 Nov 2022 09:07:30 +0000 (-0500) Subject: test3026: reduce runtime in legacy mingw builds X-Git-Tag: curl-7_87_0~140 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=856b133f5d62475d4cc12624c4cccb4170134712;p=thirdparty%2Fcurl.git 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 --- diff --git a/tests/libtest/lib3026.c b/tests/libtest/lib3026.c index 8ad7e94902..41389eb7a6 100644 --- a/tests/libtest/lib3026.c +++ b/tests/libtest/lib3026.c @@ -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 */ diff --git a/tests/libtest/testutil.c b/tests/libtest/testutil.c index a46e0f9fc1..0d77aa227a 100644 --- a/tests/libtest/testutil.c +++ b/tests/libtest/testutil.c @@ -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 diff --git a/tests/libtest/testutil.h b/tests/libtest/testutil.h index 94550fc014..106cd86759 100644 --- a/tests/libtest/testutil.h +++ b/tests/libtest/testutil.h @@ -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 */