From e7f685002bb0facb222ac13c21ff4a2257ab76cc Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Mon, 24 Feb 2014 15:23:39 -0800 Subject: 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 Reviewed-by: Sergio Ahumada --- src/corelib/thread/qgenericatomic.h | 8 ++------ 1 file 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 struct QGenericAtomicOps template static inline always_inline T fetchAndSubRelaxed(T &_q_value, typename QAtomicAdditiveType::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 static inline always_inline -- cgit v1.2.3