summaryrefslogtreecommitdiffstats
path: root/src/corelib/thread/qgenericatomic.h
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@intel.com>2014-02-24 15:23:39 -0800
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-03-04 04:34:36 +0100
commite7f685002bb0facb222ac13c21ff4a2257ab76cc (patch)
tree33b2fa5c53ac081e4ad579c123222d00d0909a70 /src/corelib/thread/qgenericatomic.h
parent380de7f8e70cfa5f335a065e446dc707d416c1a6 (diff)
Atomics: implement fetchAndSub on top of fetchAndAdd
Instead of looping unnecessarily on top of testAndSet. Task-number: QTBUG-37031 Change-Id: I8120f8405eb76dccc9066749cee0a92b0f2da20e Reviewed-by: Olivier Goffart <ogoffart@woboq.com> Reviewed-by: Sergio Ahumada <sahumada@blackberry.com>
Diffstat (limited to 'src/corelib/thread/qgenericatomic.h')
-rw-r--r--src/corelib/thread/qgenericatomic.h8
1 files changed, 2 insertions, 6 deletions
diff --git a/src/corelib/thread/qgenericatomic.h b/src/corelib/thread/qgenericatomic.h
index 0c66d45855..aeed199c97 100644
--- a/src/corelib/thread/qgenericatomic.h
+++ b/src/corelib/thread/qgenericatomic.h
@@ -264,12 +264,8 @@ template <typename BaseClass> struct QGenericAtomicOps
template <typename T> static inline always_inline
T fetchAndSubRelaxed(T &_q_value, typename QAtomicAdditiveType<T>::AdditiveT operand) Q_DECL_NOTHROW
{
- // implement fetchAndSub on top of testAndSet
- Q_FOREVER {
- T tmp = BaseClass::load(_q_value);
- if (BaseClass::testAndSetRelaxed(_q_value, tmp, T(tmp - operand)))
- return tmp;
- }
+ // implement fetchAndSub on top of fetchAndAdd
+ return fetchAndAddRelaxed(_q_value, -operand);
}
template <typename T> static inline always_inline