summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel
diff options
context:
space:
mode:
authorMilian Wolff <milian.wolff@kdab.com>2013-12-19 17:40:47 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-01-09 21:03:25 +0100
commit9a789a965aabc20b2084104a334a69932da60cb6 (patch)
treed5280b58e30acf5840bbd8175b03f7d9edf48852 /src/corelib/kernel
parent955d0df8736577eea0061e61a924104e34d3915d (diff)
Optimize QObject::senderSignalIndex to only iterate the d->senders once.
QObject::senderSignalIndex is, combined with ::sender(), the current hotspot in the QWebChannel which makes heavy use of it in its 1-to-many QSignalSpy implementation. This patch optimizes the senderSignalIndex by only iterating over the linked senders list once, instead of twice. I.e. it first iterated over it to find the signal index, then again to find the sender to convert to a method-offset. Change-Id: Ic86aed0dce891b87b953a6ec2364a81695bd4876 Reviewed-by: Olivier Goffart <ogoffart@woboq.com> Reviewed-by: Frederik Gladhorn <frederik.gladhorn@digia.com>
Diffstat (limited to 'src/corelib/kernel')
-rw-r--r--src/corelib/kernel/qobject.cpp37
-rw-r--r--src/corelib/kernel/qobject_p.h1
2 files changed, 13 insertions, 25 deletions
diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp
index ff7a79d587..40e1e8bcc5 100644
--- a/src/corelib/kernel/qobject.cpp
+++ b/src/corelib/kernel/qobject.cpp
@@ -2327,11 +2327,19 @@ QObject *QObject::sender() const
int QObject::senderSignalIndex() const
{
Q_D(const QObject);
- int signal_index = d->senderSignalIndex();
- if (signal_index < 0)
- return signal_index;
- // Convert from signal range to method range
- return QMetaObjectPrivate::signal(sender()->metaObject(), signal_index).methodIndex();
+
+ QMutexLocker locker(signalSlotLock(this));
+ if (!d->currentSender)
+ return -1;
+
+ for (QObjectPrivate::Connection *c = d->senders; c; c = c->next) {
+ if (c->sender == d->currentSender->sender) {
+ // Convert from signal range to method range
+ return QMetaObjectPrivate::signal(c->sender->metaObject(), d->currentSender->signal).methodIndex();
+ }
+ }
+
+ return -1;
}
/*!
@@ -3714,25 +3722,6 @@ void QMetaObject::activate(QObject *sender, int signal_index, void **argv)
/*!
\internal
- Implementation of QObject::senderSignalIndex()
-*/
-int QObjectPrivate::senderSignalIndex() const
-{
- Q_Q(const QObject);
- QMutexLocker locker(signalSlotLock(q));
- if (!currentSender)
- return -1;
-
- for (QObjectPrivate::Connection *c = senders; c; c = c->next) {
- if (c->sender == currentSender->sender)
- return currentSender->signal;
- }
-
- return -1;
-}
-
-/*!
- \internal
Returns the signal index used in the internal connectionLists vector.
It is different from QMetaObject::indexOfSignal(): indexOfSignal is the same as indexOfMethod
diff --git a/src/corelib/kernel/qobject_p.h b/src/corelib/kernel/qobject_p.h
index 011e140e3b..193fa78403 100644
--- a/src/corelib/kernel/qobject_p.h
+++ b/src/corelib/kernel/qobject_p.h
@@ -199,7 +199,6 @@ public:
return o->d_func();
}
- int senderSignalIndex() const;
int signalIndex(const char *signalName, const QMetaObject **meta = 0) const;
inline bool isSignalConnected(uint signalIdx) const;