From 0b6e605795a470087e1ea948e2ea326675919f1b Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Mon, 23 Jun 2008 14:51:34 +0000 Subject: [PATCH] From Mathias Froehlich, "fixed win32/win64 configure check and win32/win64 atomic related compile failures with msvs2005. Attached changes to make win32 really use the atomic stuff. There are pointer typecast problems and some historic alignment restrictions that I just took from a previous similar implementation of mine without looking deep enough. " --- CMakeModules/CheckAtomicOps.cmake | 9 +++++---- include/OpenThreads/Atomic | 7 ++----- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/CMakeModules/CheckAtomicOps.cmake b/CMakeModules/CheckAtomicOps.cmake index 07a13c05e..9cfd899c0 100644 --- a/CMakeModules/CheckAtomicOps.cmake +++ b/CMakeModules/CheckAtomicOps.cmake @@ -81,8 +81,9 @@ CHECK_CXX_SOURCE_RUNS(" int main(int, const char**) { - __declspec(align(32)) volatile long value = 0; - __declspec(align(32)) volatile void* ptr = &value; + volatile long value = 0; + long data = 0; + long* volatile ptr = &data; InterlockedIncrement(&value); InterlockedDecrement(&value); @@ -90,7 +91,7 @@ int main(int, const char**) if (0 != InterlockedCompareExchange(&value, 1, 0)) return EXIT_FAILURE; - if (ptr != InterlockedCompareExchangePointer(&ptr, ptr, ptr)) + if (ptr != InterlockedCompareExchangePointer((PVOID volatile*)&ptr, (PVOID)ptr, (PVOID)ptr)) return EXIT_FAILURE; return EXIT_SUCCESS; @@ -99,4 +100,4 @@ int main(int, const char**) IF(NOT _OPENTHREADS_ATOMIC_USE_GCC_BUILTINS AND NOT _OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS AND NOT _OPENTHREADS_ATOMIC_USE_SUN AND NOT _OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) SET(_OPENTHREADS_ATOMIC_USE_MUTEX) -ENDIF(NOT _OPENTHREADS_ATOMIC_USE_GCC_BUILTINS AND NOT _OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS AND NOT _OPENTHREADS_ATOMIC_USE_SUN AND NOT _OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) \ No newline at end of file +ENDIF(NOT _OPENTHREADS_ATOMIC_USE_GCC_BUILTINS AND NOT _OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS AND NOT _OPENTHREADS_ATOMIC_USE_SUN AND NOT _OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) diff --git a/include/OpenThreads/Atomic b/include/OpenThreads/Atomic index 3a0fe9f6a..b29e475d8 100644 --- a/include/OpenThreads/Atomic +++ b/include/OpenThreads/Atomic @@ -99,7 +99,7 @@ class Atomic { mutable Mutex _mutex; #endif #if defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) - __declspec(align(32)) volatile long _value; + volatile long _value; #elif defined(_OPENTHREADS_ATOMIC_USE_SUN) volatile uint_t _value; #else @@ -129,7 +129,7 @@ public: #elif defined(_OPENTHREADS_ATOMIC_USE_SUN) return ptrOld == atomic_cas_ptr(&_ptr, ptrOld, ptrNew); #elif defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) - return ptrOld == InterlockedCompareExchangePointer(&_ptr, ptrNew, ptrOld); + return ptrOld == InterlockedCompareExchangePointer((PVOID volatile*)&_ptr, (PVOID)ptrNew, (PVOID)ptrOld); #elif defined(_OPENTHREADS_ATOMIC_USE_MUTEX) ScopedLock lock(_mutex); if (_ptr != ptrOld) @@ -171,9 +171,6 @@ private: #if defined(_OPENTHREADS_ATOMIC_USE_MUTEX) mutable Mutex _mutex; -#endif -#if defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) - __declspec(align(32)) #endif T* volatile _ptr; };