summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Trotsenko <alex1973tr@gmail.com>2020-09-17 16:41:45 +0300
committerAlex Trotsenko <alex1973tr@gmail.com>2020-09-18 17:07:19 +0300
commitc6d1e7ad389a6db61a33016347772f885bf5e7d9 (patch)
tree7b9260746fb7767b94cee2b76af50b6481bd32db
parent8716413afcb4718352a93d90adb6f38491ad236e (diff)
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 <joerg.bornemann@qt.io>
-rw-r--r--src/corelib/kernel/qeventdispatcher_win.cpp4
-rw-r--r--src/corelib/kernel/qwineventnotifier.cpp4
-rw-r--r--src/corelib/kernel/qwineventnotifier_p.h2
3 files changed, 5 insertions, 5 deletions
diff --git a/src/corelib/kernel/qeventdispatcher_win.cpp b/src/corelib/kernel/qeventdispatcher_win.cpp
index 792260fb98..9cf426dd73 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 8cf6b018d4..5a3ad9ed5d 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<QEventDispatcherWin32 *>(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 8bb2c3159a..f8f7cd8eff 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;
};