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>
This commit is contained in:
parent
08103d3a52
commit
322ac72945
@ -82,7 +82,7 @@ Q_CORE_EXPORT QBasicAtomicPointer<QSignalSpyCallbackSet> qt_signal_spy_callback_
|
|||||||
|
|
||||||
void qt_register_signal_spy_callbacks(QSignalSpyCallbackSet *callback_set)
|
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()
|
QDynamicMetaObjectData::~QDynamicMetaObjectData()
|
||||||
@ -3696,7 +3696,7 @@ void doActivate(QObject *sender, int signal_index, void **argv)
|
|||||||
signal_index, 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 };
|
void *empty_argv[] = { nullptr };
|
||||||
if (!argv)
|
if (!argv)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user