Changeset 9059
- Timestamp:
- 10/27/08 11:42:58 (5 years ago)
- Location:
- OpenSceneGraph/trunk
- Files:
-
- 8 modified
-
CMakeModules/CheckAtomicOps.cmake (modified) (1 diff)
-
include/OpenThreads/Atomic (modified) (4 diffs)
-
include/OpenThreads/Exports (modified) (1 diff)
-
src/OpenThreads/CMakeLists.txt (modified) (2 diffs)
-
src/OpenThreads/common/Atomic.cpp (modified) (6 diffs)
-
src/OpenThreads/common/Config.in (modified) (1 diff)
-
src/OpenThreads/win32/Win32BarrierPrivateData.h (modified) (1 diff)
-
src/OpenThreads/win32/Win32ConditionPrivateData.h (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
OpenSceneGraph/trunk/CMakeModules/CheckAtomicOps.cmake
r8519 r9059 91 91 " _OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) 92 92 93 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) 93 CHECK_CXX_SOURCE_RUNS(" 94 #include <libkern/OSAtomic.h> 95 96 int main() 97 { 98 volatile int32_t value = 0; 99 long data = 0; 100 long * volatile ptr = &data; 101 102 OSAtomicIncrement32(&value); 103 OSMemoryBarrier(); 104 OSAtomicDecrement32(&value); 105 OSAtomicCompareAndSwapInt(value, 1, &value); 106 OSAtomicCompareAndSwapPtr(ptr, ptr, (void * volatile *)&ptr); 107 } 108 " _OPENTHREADS_ATOMIC_USE_BSD_ATOMIC) 109 110 111 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 AND NOT _OPENTHREADS_ATOMIC_USE_BSD_ATOMIC) 94 112 SET(_OPENTHREADS_ATOMIC_USE_MUTEX 1) 95 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 )113 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 AND NOT _OPENTHREADS_ATOMIC_USE_BSD_ATOMIC) -
OpenSceneGraph/trunk/include/OpenThreads/Atomic
r8493 r9059 24 24 #elif defined(_OPENTHREADS_ATOMIC_USE_SUN) 25 25 # include <atomic.h> 26 #elif defined(_OPENTHREADS_ATOMIC_USE_BSD_ATOMIC) 27 # include <libkern/OSAtomic.h> 28 # define _OPENTHREADS_ATOMIC_USE_LIBRARY_ROUTINES 26 29 #elif defined(_OPENTHREADS_ATOMIC_USE_MUTEX) 27 30 # include "Mutex" … … 47 50 _OPENTHREADS_ATOMIC_INLINE unsigned operator++(); 48 51 _OPENTHREADS_ATOMIC_INLINE unsigned operator--(); 52 _OPENTHREADS_ATOMIC_INLINE unsigned AND(unsigned value); 53 _OPENTHREADS_ATOMIC_INLINE unsigned OR(unsigned value); 54 _OPENTHREADS_ATOMIC_INLINE unsigned XOR(unsigned value); 55 _OPENTHREADS_ATOMIC_INLINE unsigned exchange(unsigned value = 0); 49 56 _OPENTHREADS_ATOMIC_INLINE operator unsigned() const; 50 57 private: … … 58 65 #if defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) 59 66 volatile long _value; 67 #elif defined(_OPENTHREADS_ATOMIC_USE_BSD_ATOMIC) 68 volatile int32_t _value; 60 69 #elif defined(_OPENTHREADS_ATOMIC_USE_SUN) 61 70 volatile uint_t _value; … … 126 135 } 127 136 137 _OPENTHREADS_ATOMIC_INLINE unsigned 138 Atomic::AND(unsigned value) 139 { 140 #if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) 141 return __sync_fetch_and_and(&_value, value); 142 #elif defined(_OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS) 143 return __and_and_fetch(&_value, value); 144 #elif defined(_OPENTHREADS_ATOMIC_USE_SUN) 145 return atomic_and_uint_nv(&_value, value); 146 #elif defined(_OPENTHREADS_ATOMIC_USE_MUTEX) 147 ScopedLock<Mutex> lock(_mutex); 148 _value &= value; 149 return _value; 150 #else 151 _value &= value; 152 return _value; 153 #endif 154 } 155 156 _OPENTHREADS_ATOMIC_INLINE unsigned 157 Atomic::OR(unsigned value) 158 { 159 #if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) 160 return __sync_fetch_and_or(&_value, value); 161 #elif defined(_OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS) 162 return __or_and_fetch(&_value, value); 163 #elif defined(_OPENTHREADS_ATOMIC_USE_SUN) 164 return atomic_or_uint_nv(&_value, value); 165 #elif defined(_OPENTHREADS_ATOMIC_USE_MUTEX) 166 ScopedLock<Mutex> lock(_mutex); 167 _value |= value; 168 return _value; 169 #else 170 _value |= value; 171 return _value; 172 #endif 173 } 174 175 _OPENTHREADS_ATOMIC_INLINE unsigned 176 Atomic::XOR(unsigned value) 177 { 178 #if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) 179 return __sync_fetch_and_xor(&_value, value); 180 #elif defined(_OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS) 181 return __xor_and_fetch(&_value, value); 182 #elif defined(_OPENTHREADS_ATOMIC_USE_SUN) 183 return atomic_xor_uint_nv(&_value, value); 184 #elif defined(_OPENTHREADS_ATOMIC_USE_MUTEX) 185 ScopedLock<Mutex> lock(_mutex); 186 _value ^= value; 187 return _value; 188 #else 189 _value ^= value; 190 return _value; 191 #endif 192 } 193 194 _OPENTHREADS_ATOMIC_INLINE unsigned 195 Atomic::exchange(unsigned value) 196 { 197 #if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) 198 return __sync_lock_test_and_set(&_value, value); 199 #elif defined(_OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS) 200 return __compare_and_swap(&_value, _value, value); 201 #elif defined(_OPENTHREADS_ATOMIC_USE_SUN) 202 return atomic_cas_uint(&_value, _value, value); 203 #elif defined(_OPENTHREADS_ATOMIC_USE_MUTEX) 204 ScopedLock<Mutex> lock(_mutex); 205 unsigned oldval = _value; 206 _value = value; 207 return oldval; 208 #else 209 unsigned oldval = _value; 210 _value = value; 211 return oldval; 212 #endif 213 } 214 128 215 _OPENTHREADS_ATOMIC_INLINE 129 216 Atomic::operator unsigned() const -
OpenSceneGraph/trunk/include/OpenThreads/Exports
r6096 r9059 15 15 #define _OPENTHREAD_EXPORTS_H_ 16 16 17 #include <OpenThreads/Config> 17 18 18 19 #ifndef WIN32 -
OpenSceneGraph/trunk/src/OpenThreads/CMakeLists.txt
r8488 r9059 11 11 12 12 INCLUDE(CheckAtomicOps) 13 14 # User Options 15 OPTION(DYNAMIC_OPENTHREADS "Set to ON to build OpenThreads for dynamic linking. Use OFF for static." ON) 16 IF (DYNAMIC_OPENTHREADS) 17 SET(OPENTHREADS_USER_DEFINED_DYNAMIC_OR_STATIC "SHARED") 18 ELSE (DYNAMIC_OPENTHREADS) 19 SET(OPENTHREADS_USER_DEFINED_DYNAMIC_OR_STATIC "STATIC") 20 SET(OT_LIBRARY_STATIC 1) 21 ENDIF (DYNAMIC_OPENTHREADS) 13 22 14 23 ################################################################################ … … 38 47 ${OPENTHREADS_CONFIG_HEADER} 39 48 ) 40 41 # User Options42 OPTION(DYNAMIC_OPENTHREADS "Set to ON to build OpenThreads for dynamic linking. Use OFF for static." ON)43 IF (DYNAMIC_OPENTHREADS)44 SET(OPENTHREADS_USER_DEFINED_DYNAMIC_OR_STATIC "SHARED")45 ELSE (DYNAMIC_OPENTHREADS)46 SET(OPENTHREADS_USER_DEFINED_DYNAMIC_OR_STATIC "STATIC")47 ENDIF(DYNAMIC_OPENTHREADS)48 49 49 50 # Use our modified version of FindThreads.cmake which has Sproc hacks. -
OpenSceneGraph/trunk/src/OpenThreads/common/Atomic.cpp
r8493 r9059 15 15 16 16 #if defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) 17 # include <windows.h> 17 #include <windows.h> 18 #include <intrin.h> 19 #pragma intrinsic(_InterlockedAnd) 20 #pragma intrinsic(_InterlockedOr) 21 #pragma intrinsic(_InterlockedXor) 18 22 #endif 19 23 … … 41 45 #elif defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) 42 46 return InterlockedIncrement(&_value); 47 #elif defined(_OPENTHREADS_ATOMIC_USE_BSD_ATOMIC) 48 return OSAtomicIncrement32(&_value); 43 49 #else 44 50 # error This implementation should happen inline in the include file … … 53 59 #elif defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) 54 60 return InterlockedDecrement(&_value); 61 #elif defined(_OPENTHREADS_ATOMIC_USE_BSD_ATOMIC) 62 return OSAtomicDecrement32(&_value); 55 63 #else 56 64 # error This implementation should happen inline in the include file 57 65 #endif 58 66 } 67 68 unsigned 69 Atomic::AND(unsigned value) 70 { 71 #if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) 72 return __sync_fetch_and_and(&_value, value); 73 #elif defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) 74 return _InterlockedAnd(&_value, value); 75 #elif defined(_OPENTHREADS_ATOMIC_USE_BSD_ATOMIC) 76 return OSAtomicAnd32((uint32_t)value, (uint32_t *)&_value); 77 #else 78 # error This implementation should happen inline in the include file 79 #endif 80 } 81 82 unsigned 83 Atomic::OR(unsigned value) 84 { 85 #if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) 86 return __sync_fetch_and_or(&_value, value); 87 #elif defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) 88 return _InterlockedOr(&_value, value); 89 #elif defined(_OPENTHREADS_ATOMIC_USE_BSD_ATOMIC) 90 return OSAtomicOr32((uint32_t)value, (uint32_t *)&_value); 91 #else 92 # error This implementation should happen inline in the include file 93 #endif 94 } 95 96 unsigned 97 Atomic::XOR(unsigned value) 98 { 99 #if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) 100 return __sync_fetch_and_xor(&_value, value); 101 #elif defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) 102 return _InterlockedXor(&_value, value); 103 #elif defined(_OPENTHREADS_ATOMIC_USE_BSD_ATOMIC) 104 return OSAtomicXor32((uint32_t)value, (uint32_t *)&_value); 105 #else 106 # error This implementation should happen inline in the include file 107 #endif 108 } 109 110 111 unsigned 112 Atomic::exchange(unsigned value) 113 { 114 #if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) 115 return __sync_lock_test_and_set(&_value, value); 116 #elif defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) 117 return InterlockedExchange(&_value, value); 118 #elif defined(_OPENTHREADS_ATOMIC_USE_BSD_ATOMIC) 119 return OSAtomicCompareAndSwap32(_value, value, &_value); 120 #else 121 # error This implementation should happen inline in the include file 122 #endif 123 } 124 59 125 60 126 Atomic::operator unsigned() const … … 66 132 MemoryBarrier(); 67 133 return static_cast<unsigned const volatile &>(_value); 134 #elif defined(_OPENTHREADS_ATOMIC_USE_BSD_ATOMIC) 135 OSMemoryBarrier(); 136 return static_cast<unsigned const volatile>(_value); 68 137 #else 69 138 # error This implementation should happen inline in the include file … … 78 147 #elif defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) 79 148 return ptrOld == InterlockedCompareExchangePointer((PVOID volatile*)&_ptr, (PVOID)ptrNew, (PVOID)ptrOld); 149 #elif defined(_OPENTHREADS_ATOMIC_USE_BSD_ATOMIC) 150 return OSAtomicCompareAndSwapPtr((void *)ptrOld, (void *)ptrNew, (void* volatile *)&_ptr); 80 151 #else 81 152 # error This implementation should happen inline in the include file … … 92 163 MemoryBarrier(); 93 164 return _ptr; 165 #elif defined(_OPENTHREADS_ATOMIC_USE_BSD_ATOMIC) 166 OSMemoryBarrier(); 167 return _ptr; 94 168 #else 95 169 # error This implementation should happen inline in the include file -
OpenSceneGraph/trunk/src/OpenThreads/common/Config.in
r8494 r9059 28 28 #cmakedefine _OPENTHREADS_ATOMIC_USE_SUN 29 29 #cmakedefine _OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED 30 #cmakedefine _OPENTHREADS_ATOMIC_USE_BSD_ATOMIC 30 31 #cmakedefine _OPENTHREADS_ATOMIC_USE_MUTEX 32 #cmakedefine OT_LIBRARY_STATIC 31 33 32 34 #endif -
OpenSceneGraph/trunk/src/OpenThreads/win32/Win32BarrierPrivateData.h
r6584 r9059 21 21 #ifndef _WINDOWS_ 22 22 #define WIN32_LEAN_AND_MEAN 23 #define _WIN32_WINNT 0x0400 23 24 #include <windows.h> 24 25 #endif -
OpenSceneGraph/trunk/src/OpenThreads/win32/Win32ConditionPrivateData.h
r8708 r9059 45 45 Win32ConditionPrivateData () 46 46 :waiters_(0), 47 was_broadcast_(0), 47 48 sema_(CreateSemaphore(NULL,0,0x7fffffff,NULL)), 48 49 waiters_done_(CreateEvent(NULL,FALSE,FALSE,NULL)) … … 70 71 ReleaseSemaphore(sema_.get(),waiters_,NULL); 71 72 72 cooperativeWait(waiters_done_.get(), INFINITE);73 cooperativeWait(waiters_done_.get(), INFINITE); 73 74 74 75 //end of broadcasting … … 105 106 // wait in timeslices, giving testCancel() a change to 106 107 // exit the thread if requested. 107 try {108 DWORD dwResult =cooperativeWait(sema_.get(), timeout_ms);109 if(dwResult != WAIT_OBJECT_0)110 result = (int)dwResult;111 }112 catch(...){113 // thread is canceled in cooperative wait , do cleanup114 InterlockedDecrement(&waiters_);115 long w = InterlockedGet(&waiters_);116 int last_waiter = was_broadcast_ && w == 0;108 try { 109 DWORD dwResult = cooperativeWait(sema_.get(), timeout_ms); 110 if(dwResult != WAIT_OBJECT_0) 111 result = (int)dwResult; 112 } 113 catch(...){ 114 // thread is canceled in cooperative wait , do cleanup 115 InterlockedDecrement(&waiters_); 116 long w = InterlockedGet(&waiters_); 117 int last_waiter = was_broadcast_ && w == 0; 117 118 118 if (last_waiter) SetEvent(waiters_done_.get());119 // rethrow120 throw;121 }119 if (last_waiter) SetEvent(waiters_done_.get()); 120 // rethrow 121 throw; 122 } 122 123 123 124 124 125 // We're ready to return, so there's one less waiter. 125 126 InterlockedDecrement(&waiters_);
