You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apr.apache.org by iv...@apache.org on 2019/09/07 18:18:20 UTC

svn commit: r1866562 - /apr/apr/trunk/include/arch/win32/apr_arch_misc.h

Author: ivan
Date: Sat Sep  7 18:18:20 2019
New Revision: 1866562

URL: http://svn.apache.org/viewvc?rev=1866562&view=rev
Log:
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.

Modified:
    apr/apr/trunk/include/arch/win32/apr_arch_misc.h

Modified: apr/apr/trunk/include/arch/win32/apr_arch_misc.h
URL: http://svn.apache.org/viewvc/apr/apr/trunk/include/arch/win32/apr_arch_misc.h?rev=1866562&r1=1866561&r2=1866562&view=diff
==============================================================================
--- apr/apr/trunk/include/arch/win32/apr_arch_misc.h (original)
+++ apr/apr/trunk/include/arch/win32/apr_arch_misc.h Sat Sep  7 18:18:20 2019
@@ -199,13 +199,18 @@ FARPROC apr_load_dll_func(apr_dlltoken_e
 #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()) \