summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel/qobject.cpp
diff options
context:
space:
mode:
authorMarc Mutz <marc.mutz@kdab.com>2019-06-20 02:13:12 +0200
committerMarc Mutz <marc.mutz@kdab.com>2019-06-20 02:21:10 +0200
commit322ac729450351c4f1faf5a96a564f16bfbc6547 (patch)
treeda5608e339d68e6cad05637da48f8043345d109a /src/corelib/kernel/qobject.cpp
parent08103d3a527d32c782ba9e3f6701e6676ac81a57 (diff)
QObject: fix memory order on load/store of signal spy callback set
QSignalSpyCallbackSet is a set of pointers, so when we store a pointer to it for later dereferencing, we need to use a release fence for the store and a corresponding acquire on load, lest the two don't synchronize with each other and we end up with a data race. Amends a65752c71bd25bbb66bf33d3a82f7901419c5d95. Change-Id: Ic2983d76237c5c5b00eb2a3575b10beb84d57190 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Olivier Goffart (Woboq GmbH) <ogoffart@woboq.com>
Diffstat (limited to 'src/corelib/kernel/qobject.cpp')
-rw-r--r--src/corelib/kernel/qobject.cpp4
1 files changed, 2 insertions, 2 deletions
diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp
index 7eba9b05ff..8f80be30bd 100644
--- a/src/corelib/kernel/qobject.cpp
+++ b/src/corelib/kernel/qobject.cpp
@@ -82,7 +82,7 @@ Q_CORE_EXPORT QBasicAtomicPointer<QSignalSpyCallbackSet> qt_signal_spy_callback_
void qt_register_signal_spy_callbacks(QSignalSpyCallbackSet *callback_set)
{
- qt_signal_spy_callback_set.store(callback_set);
+ qt_signal_spy_callback_set.storeRelease(callback_set);
}
QDynamicMetaObjectData::~QDynamicMetaObjectData()
@@ -3696,7 +3696,7 @@ void doActivate(QObject *sender, int signal_index, void **argv)
signal_index, argv);
}
- const QSignalSpyCallbackSet *signal_spy_set = callbacks_enabled ? qt_signal_spy_callback_set.load() : nullptr;
+ const QSignalSpyCallbackSet *signal_spy_set = callbacks_enabled ? qt_signal_spy_callback_set.loadAcquire() : nullptr;
void *empty_argv[] = { nullptr };
if (!argv)