diff options
Diffstat (limited to 'src/corelib/arch')
-rw-r--r-- | src/corelib/arch/qatomic_armv5.h | 3 | ||||
-rw-r--r-- | src/corelib/arch/qatomic_armv6.h | 7 | ||||
-rw-r--r-- | src/corelib/arch/qatomic_cxx11.h | 4 | ||||
-rw-r--r-- | src/corelib/arch/qatomic_ia64.h | 17 | ||||
-rw-r--r-- | src/corelib/arch/qatomic_mips.h | 21 |
5 files changed, 27 insertions, 25 deletions
diff --git a/src/corelib/arch/qatomic_armv5.h b/src/corelib/arch/qatomic_armv5.h index b3136fe575..210fbc1931 100644 --- a/src/corelib/arch/qatomic_armv5.h +++ b/src/corelib/arch/qatomic_armv5.h @@ -95,7 +95,8 @@ template <int size> struct QBasicAtomicOps: QGenericAtomicOps<QBasicAtomicOps<si kernel_dmb(); } - static void orderedMemoryFence() { _q_dmb(); } + template <typename T> + static void orderedMemoryFence(const T &) { _q_dmb(); } template <typename T> static bool ref(T &_q_value); template <typename T> static bool deref(T &_q_value); diff --git a/src/corelib/arch/qatomic_armv6.h b/src/corelib/arch/qatomic_armv6.h index b290a6a008..5bf7096ab7 100644 --- a/src/corelib/arch/qatomic_armv6.h +++ b/src/corelib/arch/qatomic_armv6.h @@ -77,7 +77,8 @@ template<> struct QAtomicIntegerTraits<unsigned int> { enum { IsInteger = 1 }; } template <int size> struct QBasicAtomicOps: QGenericAtomicOps<QBasicAtomicOps<size> > { - static void orderedMemoryFence(); + template <typename T> + static void orderedMemoryFence(const T &); static inline bool isReferenceCountingNative() { return true; } template <typename T> static bool ref(T &_q_value); @@ -705,8 +706,8 @@ Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddRelaxed(qptrdiff valueTo // common code -template <int size> inline -void QBasicAtomicOps<size>::orderedMemoryFence() +template <int size> template <typename T> inline +void QBasicAtomicOps<size>::orderedMemoryFence(const T &) { Q_DATA_MEMORY_BARRIER; } diff --git a/src/corelib/arch/qatomic_cxx11.h b/src/corelib/arch/qatomic_cxx11.h index 27e0acda64..ec6b3e369f 100644 --- a/src/corelib/arch/qatomic_cxx11.h +++ b/src/corelib/arch/qatomic_cxx11.h @@ -108,10 +108,6 @@ template <typename T> struct QAtomicOps typedef typename QAtomicAdditiveType<T>::AdditiveT _AdditiveType; static const int AddScale = QAtomicAdditiveType<T>::AddScale; - static void acquireMemoryFence() { } - static void releaseMemoryFence() { } - static void orderedMemoryFence() { } - static inline T load(const Type &_q_value) { diff --git a/src/corelib/arch/qatomic_ia64.h b/src/corelib/arch/qatomic_ia64.h index 5108751f2a..a2bca55c03 100644 --- a/src/corelib/arch/qatomic_ia64.h +++ b/src/corelib/arch/qatomic_ia64.h @@ -140,7 +140,8 @@ template<> struct QAtomicIntegerTraits<unsigned long long> { enum { IsInteger = template <int size> struct QBasicAtomicOps: QGenericAtomicOps<QBasicAtomicOps<size> > { - static void orderedMemoryFence(); + template <typename T> + static void orderedMemoryFence(const T &); template <typename T> static inline T loadAcquire(const T &_q_value) @@ -202,8 +203,8 @@ inline bool _q_ia64_fetchadd_immediate(register int value) // intrinsics provided by the Intel C++ Compiler #include <ia64intrin.h> -template<int size> inline -void QBasicAtomicOps<size>::orderedMemoryFence() +template<int size> template <typename T> inline +void QBasicAtomicOps<size>::orderedMemoryFence(const T &) { __memory_barrier(); } @@ -332,8 +333,8 @@ Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddRelease(qptrdiff valueTo #elif defined(Q_CC_GNU) -template<int size> inline -void QBasicAtomicOps<size>::orderedMemoryFence() +template<int size> template <typename T> inline +void QBasicAtomicOps<size>::orderedMemoryFence(const T &) { asm volatile("mf" ::: "memory"); } @@ -1045,7 +1046,7 @@ bool QBasicAtomicOps<size>::testAndSetRelaxed(T &_q_value, T expectedValue, T ne template<int size> template <typename T> inline bool QBasicAtomicOps<size>::testAndSetOrdered(T &_q_value, T expectedValue, T newValue) { - orderedMemoryFence(); + orderedMemoryFence(_q_value); return testAndSetAcquire(_q_value, expectedValue, newValue); } @@ -1058,7 +1059,7 @@ T QBasicAtomicOps<size>::fetchAndStoreRelaxed(T &_q_value, T newValue) template<int size> template <typename T> inline T QBasicAtomicOps<size>::fetchAndStoreRelease(T &_q_value, T newValue) { - orderedMemoryFence(); + orderedMemoryFence(_q_value); return fetchAndStoreAcquire(_q_value, newValue); } @@ -1077,7 +1078,7 @@ T QBasicAtomicOps<size>::fetchAndAddRelaxed(T &_q_value, typename QAtomicAdditiv template<int size> template <typename T> inline T QBasicAtomicOps<size>::fetchAndAddOrdered(T &_q_value, typename QAtomicAdditiveType<T>::AdditiveT valueToAdd) { - orderedMemoryFence(); + orderedMemoryFence(_q_value); return fetchAndAddRelease(_q_value, valueToAdd); } diff --git a/src/corelib/arch/qatomic_mips.h b/src/corelib/arch/qatomic_mips.h index 39119ba411..116906a541 100644 --- a/src/corelib/arch/qatomic_mips.h +++ b/src/corelib/arch/qatomic_mips.h @@ -77,9 +77,12 @@ template<> struct QAtomicIntegerTraits<unsigned int> { enum { IsInteger = 1 }; } template <int size> struct QBasicAtomicOps: QGenericAtomicOps<QBasicAtomicOps<size> > { - static void acquireMemoryFence(); - static void releaseMemoryFence(); - static void orderedMemoryFence(); + template <typename T> + static void acquireMemoryFence(const T &); + template <typename T> + static void releaseMemoryFence(const T &); + template <typename T> + static void orderedMemoryFence(const T &); static inline bool isReferenceCountingNative() { return true; } template <typename T> static bool ref(T &_q_value); @@ -109,20 +112,20 @@ template <typename T> struct QAtomicOps : QBasicAtomicOps<sizeof(T)> # error "please set '-march=' to your architecture (e.g., -march=mips32)" #endif -template <int size> inline -void QBasicAtomicOps<size>::acquireMemoryFence() +template <int size> template <typename T> inline +void QBasicAtomicOps<size>::acquireMemoryFence(const T &) { asm volatile ("sync 0x11" ::: "memory"); } -template <int size> inline -void QBasicAtomicOps<size>::releaseMemoryFence() +template <int size> template <typename T> inline +void QBasicAtomicOps<size>::releaseMemoryFence(const T &) { asm volatile ("sync 0x12" ::: "memory"); } -template <int size> inline -void QBasicAtomicOps<size>::orderedMemoryFence() +template <int size> template <typename T> inline +void QBasicAtomicOps<size>::orderedMemoryFence(const T &) { asm volatile ("sync 0" ::: "memory"); } |