From c6d1e7ad389a6db61a33016347772f885bf5e7d9 Mon Sep 17 00:00:00 2001 From: Alex Trotsenko Date: Thu, 17 Sep 2020 16:41:45 +0300 Subject: [PATCH] QWinEventNotifier: reinterpret 'int signaledCount' as a 'bool signaled' In fact, this variable can take only two values: 0 and 1. By interpreting its value as boolean, we can use relaxed store operations instead of atomic increments. This is safe, because it's guarded by 'activateEventNotifiersPosted' variable, which already provides a release/acquire semantic. Change-Id: If9adb7d022f1500ee7e8b61f336d8732f9b88d4c Reviewed-by: Joerg Bornemann --- src/corelib/kernel/qeventdispatcher_win.cpp | 4 ++-- src/corelib/kernel/qwineventnotifier.cpp | 4 ++-- src/corelib/kernel/qwineventnotifier_p.h | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/corelib/kernel/qeventdispatcher_win.cpp b/src/corelib/kernel/qeventdispatcher_win.cpp index 792260fb984..9cf426dd73c 100644 --- a/src/corelib/kernel/qeventdispatcher_win.cpp +++ b/src/corelib/kernel/qeventdispatcher_win.cpp @@ -877,8 +877,8 @@ void QEventDispatcherWin32::activateEventNotifiers() for (int i = 0; i < d->winEventNotifierList.count(); ++i) { QWinEventNotifier *notifier = d->winEventNotifierList.at(i); QWinEventNotifierPrivate *nd = QWinEventNotifierPrivate::get(notifier); - if (nd->signaledCount.loadRelaxed() != 0) { - --nd->signaledCount; + if (nd->signaled.loadRelaxed()) { + nd->signaled.storeRelaxed(false); nd->unregisterWaitObject(); d->activateEventNotifier(notifier); } diff --git a/src/corelib/kernel/qwineventnotifier.cpp b/src/corelib/kernel/qwineventnotifier.cpp index 8cf6b018d48..5a3ad9ed5d5 100644 --- a/src/corelib/kernel/qwineventnotifier.cpp +++ b/src/corelib/kernel/qwineventnotifier.cpp @@ -202,7 +202,7 @@ void QWinEventNotifier::setEnabled(bool enable) } if (enable) { - d->signaledCount = 0; + d->signaled.storeRelaxed(false); eventDispatcher->registerEventNotifier(this); } else { eventDispatcher->unregisterEventNotifier(this); @@ -245,7 +245,7 @@ static void CALLBACK wfsoCallback(void *context, BOOLEAN /*ignore*/) QEventDispatcherWin32Private *edp = QEventDispatcherWin32Private::get( static_cast(eventDispatcher)); - ++nd->signaledCount; + nd->signaled.storeRelaxed(true); edp->postActivateEventNotifiers(); } diff --git a/src/corelib/kernel/qwineventnotifier_p.h b/src/corelib/kernel/qwineventnotifier_p.h index 8bb2c3159a2..f8f7cd8effe 100644 --- a/src/corelib/kernel/qwineventnotifier_p.h +++ b/src/corelib/kernel/qwineventnotifier_p.h @@ -74,7 +74,7 @@ public: HANDLE handleToEvent; HANDLE waitHandle = NULL; - QAtomicInt signaledCount; + QAtomicInt signaled; bool enabled; };