diff options
author | Thiago Macieira <thiago.macieira@intel.com> | 2011-11-16 14:47:11 -0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-03-24 17:07:52 +0100 |
commit | e22a6108fda7cac78f5597247ce7b0628b6ba3e2 (patch) | |
tree | 49858a35bf398e8137c853bbd258b826adbe8974 | |
parent | 387ec9c2a35b2b181e2b2ca29079ecb44eac87e9 (diff) |
Use QVector<int> instead of QList<int> for storing metatypes in QtDBus
Change I00020eed fixed a bug present in 64-bit machines because it
tried to access QList<int>'s internal array data, assuming it was a
vector of ints. That worked in 32-bit, but not 64-bit.
The fix involves a conversion between QList and QVector. Now fix it
properly by changing everything to be QVector. The benefit is that on
64-bit, they are real vectors, not the 50%-overhead pointer array that
QList is.
Change-Id: I989ad279d0d8b2c9ab262a1eed413ab2365b5461
Reviewed-by: Stephen Kelly <stephen.kelly@kdab.com>
-rw-r--r-- | src/dbus/qdbusabstractadaptor.cpp | 2 | ||||
-rw-r--r-- | src/dbus/qdbusconnection_p.h | 10 | ||||
-rw-r--r-- | src/dbus/qdbusintegrator.cpp | 8 | ||||
-rw-r--r-- | src/dbus/qdbusintegrator_p.h | 6 | ||||
-rw-r--r-- | src/dbus/qdbusmisc.cpp | 2 | ||||
-rw-r--r-- | src/dbus/qdbuspendingcall.cpp | 7 | ||||
-rw-r--r-- | src/dbus/qdbuspendingcall_p.h | 4 | ||||
-rw-r--r-- | src/dbus/qdbusxmlgenerator.cpp | 2 |
8 files changed, 18 insertions, 23 deletions
diff --git a/src/dbus/qdbusabstractadaptor.cpp b/src/dbus/qdbusabstractadaptor.cpp index 7bdd947a37..e8c56eb990 100644 --- a/src/dbus/qdbusabstractadaptor.cpp +++ b/src/dbus/qdbusabstractadaptor.cpp @@ -296,7 +296,7 @@ void QDBusAdaptorConnector::relay(QObject *senderObj, int lastSignalIdx, void ** realObject = realObject->parent(); // break down the parameter list - QList<int> types; + QVector<int> types; int inputCount = qDBusParametersForMethod(mm, types); if (inputCount == -1) // invalid signal signature diff --git a/src/dbus/qdbusconnection_p.h b/src/dbus/qdbusconnection_p.h index 41a1341e40..5f58b2cf68 100644 --- a/src/dbus/qdbusconnection_p.h +++ b/src/dbus/qdbusconnection_p.h @@ -124,7 +124,7 @@ public: QString service, path, signature; QObject* obj; int midx; - QList<int> params; + QVector<int> params; QStringList argumentMatch; QByteArray matchRule; }; @@ -241,7 +241,7 @@ private: void sendError(const QDBusMessage &msg, QDBusError::ErrorType code); void deliverCall(QObject *object, int flags, const QDBusMessage &msg, - const QList<int> &metaTypes, int slotIdx); + const QVector<int> &metaTypes, int slotIdx); bool isServiceRegisteredByThread(const QString &serviceName) const; @@ -309,7 +309,7 @@ public: public: // static methods - static int findSlot(QObject *obj, const QByteArray &normalizedName, QList<int>& params); + static int findSlot(QObject *obj, const QByteArray &normalizedName, QVector<int> ¶ms); static bool prepareHook(QDBusConnectionPrivate::SignalHook &hook, QString &key, const QString &service, const QString &path, const QString &interface, const QString &name, @@ -321,7 +321,7 @@ public: int idx, const QList<int> &metaTypes, const QDBusMessage &msg); static QDBusCallDeliveryEvent *prepareReply(QDBusConnectionPrivate *target, QObject *object, - int idx, const QList<int> &metaTypes, + int idx, const QVector<int> &metaTypes, const QDBusMessage &msg); static void processFinishedCall(QDBusPendingCallPrivate *call); @@ -335,7 +335,7 @@ public: }; // in qdbusmisc.cpp -extern int qDBusParametersForMethod(const QMetaMethod &mm, QList<int>& metaTypes); +extern int qDBusParametersForMethod(const QMetaMethod &mm, QVector<int> &metaTypes); extern bool qDBusCheckAsyncTag(const char *tag); extern bool qDBusInterfaceInObject(QObject *obj, const QString &interface_name); extern QString qDBusInterfaceFromMetaObject(const QMetaObject *mo); diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp index f0c8224be2..cb91601753 100644 --- a/src/dbus/qdbusintegrator.cpp +++ b/src/dbus/qdbusintegrator.cpp @@ -624,7 +624,7 @@ static void huntAndEmit(DBusConnection *connection, DBusMessage *msg, } static int findSlot(const QMetaObject *mo, const QByteArray &name, int flags, - const QString &signature_, QList<int>& metaTypes) + const QString &signature_, QVector<int> &metaTypes) { QByteArray msgSignature = signature_.toLatin1(); @@ -724,7 +724,7 @@ static QDBusCallDeliveryEvent * const DIRECT_DELIVERY = (QDBusCallDeliveryEvent QDBusCallDeliveryEvent* QDBusConnectionPrivate::prepareReply(QDBusConnectionPrivate *target, QObject *object, int idx, - const QList<int> &metaTypes, + const QVector<int> &metaTypes, const QDBusMessage &msg) { Q_ASSERT(object); @@ -862,7 +862,7 @@ bool QDBusConnectionPrivate::activateCall(QObject* object, int flags, const QDBu } void QDBusConnectionPrivate::deliverCall(QObject *object, int /*flags*/, const QDBusMessage &msg, - const QList<int> &metaTypes, int slotIdx) + const QVector<int> &metaTypes, int slotIdx) { Q_ASSERT_X(!object || QThread::currentThread() == object->thread(), "QDBusConnection: internal threading error", @@ -1238,7 +1238,7 @@ void QDBusConnectionPrivate::serviceOwnerChangedNoLock(const QString &name, } int QDBusConnectionPrivate::findSlot(QObject* obj, const QByteArray &normalizedName, - QList<int> ¶ms) + QVector<int> ¶ms) { int midx = obj->metaObject()->indexOfMethod(normalizedName); if (midx == -1) diff --git a/src/dbus/qdbusintegrator_p.h b/src/dbus/qdbusintegrator_p.h index c9a2efc57d..f910d2d009 100644 --- a/src/dbus/qdbusintegrator_p.h +++ b/src/dbus/qdbusintegrator_p.h @@ -84,7 +84,7 @@ struct QDBusSlotCache { int flags; int slotIdx; - QList<int> metaTypes; + QVector<int> metaTypes; }; typedef QMultiHash<QString, Data> Hash; Hash hash; @@ -94,7 +94,7 @@ class QDBusCallDeliveryEvent: public QMetaCallEvent { public: QDBusCallDeliveryEvent(const QDBusConnection &c, int id, QObject *sender, - const QDBusMessage &msg, const QList<int> &types, int f = 0) + const QDBusMessage &msg, const QVector<int> &types, int f = 0) : QMetaCallEvent(0, id, 0, sender, -1), connection(c), message(msg), metaTypes(types), flags(f) { } @@ -106,7 +106,7 @@ public: private: QDBusConnection connection; // just for refcounting QDBusMessage message; - QList<int> metaTypes; + QVector<int> metaTypes; int flags; }; diff --git a/src/dbus/qdbusmisc.cpp b/src/dbus/qdbusmisc.cpp index 7d68bf1185..8a0778f216 100644 --- a/src/dbus/qdbusmisc.cpp +++ b/src/dbus/qdbusmisc.cpp @@ -126,7 +126,7 @@ bool qDBusInterfaceInObject(QObject *obj, const QString &interface_name) // metaTypes.count() >= retval + 1 in all cases // // sig must be the normalised signature for the method -int qDBusParametersForMethod(const QMetaMethod &mm, QList<int>& metaTypes) +int qDBusParametersForMethod(const QMetaMethod &mm, QVector<int> &metaTypes) { QDBusMetaTypeId::init(); diff --git a/src/dbus/qdbuspendingcall.cpp b/src/dbus/qdbuspendingcall.cpp index 65d4b5533b..8e74ecbdde 100644 --- a/src/dbus/qdbuspendingcall.cpp +++ b/src/dbus/qdbuspendingcall.cpp @@ -180,12 +180,7 @@ bool QDBusPendingCallPrivate::setReplyCallback(QObject *target, const char *memb if (metaTypes.at(count) == QDBusMetaTypeId::message) --count; - if (count == 0) { - setMetaTypes(count, 0); - } else { - QVector<int> types = QVector<int>::fromList(metaTypes); - setMetaTypes(count, types.constData() + 1); - } + setMetaTypes(count, count ? metaTypes.constData() + 1 : 0); return true; } diff --git a/src/dbus/qdbuspendingcall_p.h b/src/dbus/qdbuspendingcall_p.h index 2aaae7b494..ca3b782a75 100644 --- a/src/dbus/qdbuspendingcall_p.h +++ b/src/dbus/qdbuspendingcall_p.h @@ -56,7 +56,7 @@ #include <qshareddata.h> #include <qpointer.h> -#include <qlist.h> +#include <qvector.h> #include <qmutex.h> #include <qwaitcondition.h> @@ -82,7 +82,7 @@ public: // for the callback mechanism (see setReplyCallback and QDBusConnectionPrivate::sendWithReplyAsync) QPointer<QObject> receiver; - QList<int> metaTypes; + QVector<int> metaTypes; int methodIdx; bool autoDelete; diff --git a/src/dbus/qdbusxmlgenerator.cpp b/src/dbus/qdbusxmlgenerator.cpp index a6572b2c86..99edf49868 100644 --- a/src/dbus/qdbusxmlgenerator.cpp +++ b/src/dbus/qdbusxmlgenerator.cpp @@ -168,7 +168,7 @@ static QString generateInterfaceXml(const QMetaObject *mo, int flags, int method continue; // wasn't a valid type QList<QByteArray> names = mm.parameterNames(); - QList<int> types; + QVector<int> types; int inputCount = qDBusParametersForMethod(mm, types); if (inputCount == -1) continue; // invalid form |