From 1399b3cccea3a16660e17844051989cc89581bf3 Mon Sep 17 00:00:00 2001 From: Giuseppe D'Angelo Date: Wed, 13 Sep 2023 22:17:22 +0200 Subject: [PATCH] Apple event dispatcher: "clarify" copy semantics of ProcessEventsState MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit QEDCF::processEvents makes copies of ProcessEventsState, which contains atomics. The memory ordering semantics when those atomics are used are not clear at all -- given the lack of comments in the code around them, and the lack of named operations (e.g. loadAcquire). In principle, it looks like relaxed ordering could even suffice. However, I'm not confident in making such a change. For now, avoid a direct copy (assignment) of the atomics themselves (those operations are meaningless), and use very conservative semantics when copying ProcessEventsState. Change-Id: I8584ff3fe9fef52385bd438235ee823bdbab8a42 Reviewed-by: Tor Arne Vestbø Reviewed-by: Qt CI Bot --- src/corelib/kernel/qeventdispatcher_cf_p.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/corelib/kernel/qeventdispatcher_cf_p.h b/src/corelib/kernel/qeventdispatcher_cf_p.h index c4c0d14027..0c9c148e68 100644 --- a/src/corelib/kernel/qeventdispatcher_cf_p.h +++ b/src/corelib/kernel/qeventdispatcher_cf_p.h @@ -204,6 +204,25 @@ protected: , processedPostedEvents(false), processedTimers(false) , deferredWakeUp(false), deferredUpdateTimers(false) {} + ProcessEventsState(const ProcessEventsState &other) + : flags(other.flags) + , wasInterrupted(other.wasInterrupted.loadAcquire()) + , processedPostedEvents(other.processedPostedEvents.loadAcquire()) + , processedTimers(other.processedTimers.loadAcquire()) + , deferredWakeUp(other.deferredWakeUp.loadAcquire()) + , deferredUpdateTimers(other.deferredUpdateTimers) {} + + ProcessEventsState &operator=(const ProcessEventsState &other) + { + flags = other.flags; + wasInterrupted.storeRelease(other.wasInterrupted.loadAcquire()); + processedPostedEvents.storeRelease(other.processedPostedEvents.loadAcquire()); + processedTimers.storeRelease(other.processedTimers.loadAcquire()); + deferredWakeUp.storeRelease(other.deferredWakeUp.loadAcquire()); + deferredUpdateTimers = other.deferredUpdateTimers; + return *this; + } + QAtomicInt flags; QAtomicInteger wasInterrupted; QAtomicInteger processedPostedEvents;