From 322ac729450351c4f1faf5a96a564f16bfbc6547 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Thu, 20 Jun 2019 02:13:12 +0200 Subject: 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 Reviewed-by: Olivier Goffart (Woboq GmbH) --- src/corelib/kernel/qobject.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/corelib/kernel/qobject.cpp') 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 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) -- cgit v1.2.3