diff options
| author | Erik Verbruggen <erik.verbruggen@theqtcompany.com> | 2016-04-05 16:44:51 +0200 |
|---|---|---|
| committer | Erik Verbruggen <erik.verbruggen@qt.io> | 2016-05-03 08:53:53 +0000 |
| commit | 2410be7f45b8688c9910336ec9b8a79d3232b9c7 (patch) | |
| tree | 88a875ff49c3660b6caf7c8e0a8acd9ce7718012 /src/corelib/kernel/qobject.cpp | |
| parent | 16f3c6e4a1397926e088a0ae6e81d62e781afc9a (diff) | |
Tune fast-exit for signal activation for QML.
When using QML, it quite often happens that only the QML engine is
connected to a signal, and no C++ handlers. By splitting up the
fast-exit case and handling QML separately, we can prevent a call to
QThread::currentThreadId, and locking+unlocking the mutex.
On x86 this saves ~130 instructions according to valgrind.
Change-Id: I947fe42afe351922339ac982a6d498bc2f7b5192
Reviewed-by: Simon Hausmann <simon.hausmann@theqtcompany.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.cpp | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp index 2b0eff37088..04ec7135227 100644 --- a/src/corelib/kernel/qobject.cpp +++ b/src/corelib/kernel/qobject.cpp @@ -3609,18 +3609,21 @@ void QMetaObject::activate(QObject *sender, int signalOffset, int local_signal_i { int signal_index = signalOffset + local_signal_index; - if (!sender->d_func()->isSignalConnected(signal_index) - && !qt_signal_spy_callback_set.signal_begin_callback - && !qt_signal_spy_callback_set.signal_end_callback) { - return; // nothing connected to these signals, and no spy - } - if (sender->d_func()->blockSig) return; - if (sender->d_func()->declarativeData && QAbstractDeclarativeData::signalEmitted) + if (sender->d_func()->isDeclarativeSignalConnected(signal_index) + && QAbstractDeclarativeData::signalEmitted) { QAbstractDeclarativeData::signalEmitted(sender->d_func()->declarativeData, sender, signal_index, argv); + } + + if (!sender->d_func()->isSignalConnected(signal_index, /*checkDeclarative =*/ false) + && !qt_signal_spy_callback_set.signal_begin_callback + && !qt_signal_spy_callback_set.signal_end_callback) { + // The possible declarative connection is done, and nothing else is connected, so: + return; + } void *empty_argv[] = { 0 }; if (qt_signal_spy_callback_set.signal_begin_callback != 0) { |
