The variable __native_startup_lock should be volatile. But currently its type is "volatile void *", which means that the dereferenced pointer value is volatile, not the variable itself. Currently the compiler is throwing a warning when the variable is used by InterlockedCompareExchangePointer() or InterlockedExchangePointer() call. But all current usage do explicit cast to (volatile PVOID *) which hides all warnings.
Existing type: volatile PVOID * = void * volatile * Before this change: typeof(&__native_startup_lock) = void volatile ** After this change: typeof(&__native_startup_lock) = void * volatile * --- mingw-w64-crt/crt/crtdll.c | 10 +++++----- mingw-w64-crt/crt/crtexe.c | 6 +++--- mingw-w64-crt/crt/natstart.c | 2 +- mingw-w64-crt/include/internal.h | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/mingw-w64-crt/crt/crtdll.c b/mingw-w64-crt/crt/crtdll.c index 90da38e604f7..a8b95ec50d59 100644 --- a/mingw-w64-crt/crt/crtdll.c +++ b/mingw-w64-crt/crt/crtdll.c @@ -79,8 +79,8 @@ WINBOOL WINAPI _CRT_INIT (HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved) void *fiberid = ((PNT_TIB)NtCurrentTeb ())->StackBase; int nested = FALSE; - while ((lock_free = InterlockedCompareExchangePointer ((volatile PVOID *) &__native_startup_lock, - fiberid, 0)) != 0) + while ((lock_free = InterlockedCompareExchangePointer (&__native_startup_lock, + fiberid, NULL)) != 0) { if (lock_free == fiberid) { @@ -107,7 +107,7 @@ WINBOOL WINAPI _CRT_INIT (HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved) } if (! nested) { - (void) InterlockedExchangePointer ((volatile PVOID *) &__native_startup_lock, 0); + (void) InterlockedExchangePointer (&__native_startup_lock, NULL); } if (__dyn_tls_init_callback != NULL) { @@ -118,7 +118,7 @@ WINBOOL WINAPI _CRT_INIT (HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved) else if (dwReason == DLL_PROCESS_DETACH) { void *lock_free = NULL; - while ((lock_free = InterlockedCompareExchangePointer ((volatile PVOID *) &__native_startup_lock,(PVOID) 1, 0)) != 0) + while ((lock_free = InterlockedCompareExchangePointer (&__native_startup_lock, (PVOID) 1, NULL)) != 0) { Sleep(1000); } @@ -130,7 +130,7 @@ WINBOOL WINAPI _CRT_INIT (HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved) { _execute_onexit_table(&atexit_table); __native_startup_state = __uninitialized; - (void) InterlockedExchangePointer ((volatile PVOID *) &__native_startup_lock, 0); + (void) InterlockedExchangePointer (&__native_startup_lock, NULL); } } return TRUE; diff --git a/mingw-w64-crt/crt/crtexe.c b/mingw-w64-crt/crt/crtexe.c index 328cc305b9b8..7cef6d7312d5 100644 --- a/mingw-w64-crt/crt/crtexe.c +++ b/mingw-w64-crt/crt/crtexe.c @@ -212,8 +212,8 @@ __tmainCRTStartup (void) void *lock_free = NULL; void *fiberid = ((PNT_TIB)NtCurrentTeb())->StackBase; int nested = FALSE; - while((lock_free = InterlockedCompareExchangePointer ((volatile PVOID *) &__native_startup_lock, - fiberid, 0)) != 0) + while((lock_free = InterlockedCompareExchangePointer (&__native_startup_lock, + fiberid, NULL)) != 0) { if (lock_free == fiberid) { @@ -242,7 +242,7 @@ __tmainCRTStartup (void) } _ASSERTE(__native_startup_state == __initialized); if (! nested) - (VOID)InterlockedExchangePointer ((volatile PVOID *) &__native_startup_lock, 0); + (VOID)InterlockedExchangePointer (&__native_startup_lock, NULL); if (__dyn_tls_init_callback != NULL) __dyn_tls_init_callback (NULL, DLL_THREAD_ATTACH, NULL); diff --git a/mingw-w64-crt/crt/natstart.c b/mingw-w64-crt/crt/natstart.c index 06def19d51a9..0afbaa801a9a 100644 --- a/mingw-w64-crt/crt/natstart.c +++ b/mingw-w64-crt/crt/natstart.c @@ -11,4 +11,4 @@ _PGLOBAL volatile unsigned int __native_dllmain_reason = UINT_MAX; volatile unsigned int __native_vcclrit_reason = UINT_MAX; volatile __enative_startup_state __native_startup_state; -volatile void *__native_startup_lock; +void *volatile __native_startup_lock; diff --git a/mingw-w64-crt/include/internal.h b/mingw-w64-crt/include/internal.h index 752c5dc9662c..b3f1186e1d83 100644 --- a/mingw-w64-crt/include/internal.h +++ b/mingw-w64-crt/include/internal.h @@ -130,7 +130,7 @@ extern "C" { } __enative_startup_state; extern volatile __enative_startup_state __native_startup_state; - extern volatile void *__native_startup_lock; + extern void *volatile __native_startup_lock; extern volatile unsigned int __native_dllmain_reason; extern volatile unsigned int __native_vcclrit_reason; -- 2.20.1 _______________________________________________ Mingw-w64-public mailing list Mingw-w64-public@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/mingw-w64-public