diff options
Diffstat (limited to 'src/corelib/arch/qatomic_gcc.h')
-rw-r--r-- | src/corelib/arch/qatomic_gcc.h | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/src/corelib/arch/qatomic_gcc.h b/src/corelib/arch/qatomic_gcc.h index 61e709655d..5184293465 100644 --- a/src/corelib/arch/qatomic_gcc.h +++ b/src/corelib/arch/qatomic_gcc.h @@ -53,12 +53,6 @@ QT_END_NAMESPACE #pragma qt_sync_stop_processing #endif -template<> struct QAtomicIntegerTraits<int> { enum { IsInteger = 1 }; }; -template<> struct QAtomicIntegerTraits<unsigned int> { enum { IsInteger = 1 }; }; -#ifdef Q_COMPILER_UNICODE_STRINGS -template<> struct QAtomicIntegerTraits<char32_t> { enum { IsInteger = 1 }; }; -#endif - #define Q_ATOMIC_INT_REFERENCE_COUNTING_IS_SOMETIMES_NATIVE #define Q_ATOMIC_INT_TEST_AND_SET_IS_SOMETIMES_NATIVE #define Q_ATOMIC_INT_FETCH_AND_STORE_IS_SOMETIMES_NATIVE @@ -75,6 +69,15 @@ template<> struct QAtomicIntegerTraits<char32_t> { enum { IsInteger = 1 }; }; #define Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_SOMETIMES_NATIVE #define Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_SOMETIMES_NATIVE +#if QT_POINTER_SIZE == 8 +# define Q_ATOMIC_INT64_IS_SUPPORTED +# define Q_ATOMIC_INT64_REFERENCE_COUNTING_IS_SOMETIMES_NATIVE +# define Q_ATOMIC_INT64_TEST_AND_SET_IS_SOMETIMES_NATIVE +# define Q_ATOMIC_INT64_FETCH_AND_STORE_IS_SOMETIMES_NATIVE +# define Q_ATOMIC_INT64_FETCH_AND_ADD_IS_SOMETIMES_NATIVE +template<> struct QAtomicOpsSupport<8> { enum { IsSupported = 1 }; }; +#endif + template <typename X> struct QAtomicOps: QGenericAtomicOps<QAtomicOps<X> > { // The GCC intrinsics all have fully-ordered memory semantics, so we define @@ -110,6 +113,17 @@ template <typename X> struct QAtomicOps: QGenericAtomicOps<QAtomicOps<X> > } template <typename T> + static bool testAndSetRelaxed(T &_q_value, T expectedValue, T newValue, T *currentValue) Q_DECL_NOTHROW + { + bool tmp = __sync_bool_compare_and_swap(&_q_value, expectedValue, newValue); + if (tmp) + *currentValue = expectedValue; + else + *currentValue = _q_value; + return tmp; + } + + template <typename T> static T fetchAndStoreRelaxed(T &_q_value, T newValue) Q_DECL_NOTHROW { return __sync_lock_test_and_set(&_q_value, newValue); |