summaryrefslogtreecommitdiff
path: root/include/arch
diff options
context:
space:
mode:
authorIvan Zhakov <ivan@apache.org>2019-09-07 18:18:20 +0000
committerIvan Zhakov <ivan@apache.org>2019-09-07 18:18:20 +0000
commitf0bd32112aa0e994e81696a81ddbebfcc8cf6bc9 (patch)
treeefd055ba3db1bcf00c84f208f46e94ada50d675a /include/arch
parent1a83474fe0682c95c9f2aedff7fff9496b53bd68 (diff)
downloadapr-f0bd32112aa0e994e81696a81ddbebfcc8cf6bc9.tar.gz
win32: Fix very unlikely race condition in late linking code.
* include/arch/win32/apr_arch_misc.h (APR_DECLARE_LATE_DLL_FUNC): Use INIT_ONCE to wait for concurrent DLL loading if any. git-svn-id: https://svn.apache.org/repos/asf/apr/apr/trunk@1866562 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'include/arch')
-rw-r--r--include/arch/win32/apr_arch_misc.h17
1 files changed, 11 insertions, 6 deletions
diff --git a/include/arch/win32/apr_arch_misc.h b/include/arch/win32/apr_arch_misc.h
index 92a824664..ed5670f08 100644
--- a/include/arch/win32/apr_arch_misc.h
+++ b/include/arch/win32/apr_arch_misc.h
@@ -199,13 +199,18 @@ FARPROC apr_load_dll_func(apr_dlltoken_e fnLib, char *fnName, int ordinal);
#define APR_DECLARE_LATE_DLL_FUNC(lib, rettype, calltype, fn, ord, args, names) \
typedef rettype (calltype *apr_winapi_fpt_##fn) args; \
static apr_winapi_fpt_##fn apr_winapi_pfn_##fn = NULL; \
- static int apr_winapi_chk_##fn = 0; \
- static APR_INLINE int apr_winapi_ld_##fn(void) \
+ static INIT_ONCE apr_winapi_ctrl_##fn = {INIT_ONCE_STATIC_INIT}; \
+ static BOOL WINAPI apr_winapi_init_once_##fn(PINIT_ONCE init_once,\
+ PVOID baton, PVOID *context) \
+ { \
+ apr_winapi_pfn_##fn = (apr_winapi_fpt_##fn) \
+ apr_load_dll_func(lib, #fn, ord); \
+ return TRUE; \
+ } \
+static APR_INLINE int apr_winapi_ld_##fn(void) \
{ if (apr_winapi_pfn_##fn) return 1; \
- if (apr_winapi_chk_##fn ++) return 0; \
- if (!apr_winapi_pfn_##fn) \
- apr_winapi_pfn_##fn = (apr_winapi_fpt_##fn) \
- apr_load_dll_func(lib, #fn, ord); \
+ InitOnceExecuteOnce(&apr_winapi_ctrl_##fn, apr_winapi_init_once_##fn, \
+ NULL, NULL); \
if (apr_winapi_pfn_##fn) return 1; else return 0; }; \
static APR_INLINE rettype apr_winapi_##fn args \
{ if (apr_winapi_ld_##fn()) \