diff --git a/src/corelib/kernel/qcoreevent.cpp b/src/corelib/kernel/qcoreevent.cpp index 46398872f7..838c90fce7 100644 --- a/src/corelib/kernel/qcoreevent.cpp +++ b/src/corelib/kernel/qcoreevent.cpp @@ -433,8 +433,9 @@ struct QBasicAtomicBitField { QBasicAtomicInteger &entry = data[which / BitsPerInt]; const uint old = entry.loadRelaxed(); const uint bit = 1U << (which % BitsPerInt); - return !(old & bit) // wasn't taken - && entry.testAndSetRelaxed(old, old | bit); // still wasn't taken + if (old & bit) + return false; // already taken + return (entry.fetchAndOrRelaxed(bit) & bit) == 0; // don't update 'next' here - it's unlikely that it will need // to be updated, in the general case, and having 'next' diff --git a/src/corelib/kernel/qeventdispatcher_unix.cpp b/src/corelib/kernel/qeventdispatcher_unix.cpp index dc87a9cd63..12603d77f0 100644 --- a/src/corelib/kernel/qeventdispatcher_unix.cpp +++ b/src/corelib/kernel/qeventdispatcher_unix.cpp @@ -123,7 +123,7 @@ pollfd QThreadPipe::prepare() const void QThreadPipe::wakeUp() { - if (wakeUps.testAndSetAcquire(0, 1)) { + if ((wakeUps.fetchAndOrAcquire(1) & 1) == 0) { #if QT_CONFIG(eventfd) eventfd_write(fds[0], 1); return;