From e22a6108fda7cac78f5597247ce7b0628b6ba3e2 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Wed, 16 Nov 2011 14:47:11 -0200 Subject: [PATCH] Use QVector instead of QList for storing metatypes in QtDBus Change I00020eed fixed a bug present in 64-bit machines because it tried to access QList'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 --- src/dbus/qdbusabstractadaptor.cpp | 2 +- src/dbus/qdbusconnection_p.h | 10 +++++----- src/dbus/qdbusintegrator.cpp | 8 ++++---- src/dbus/qdbusintegrator_p.h | 6 +++--- src/dbus/qdbusmisc.cpp | 2 +- src/dbus/qdbuspendingcall.cpp | 7 +------ src/dbus/qdbuspendingcall_p.h | 4 ++-- 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 7bdd947a37f..e8c56eb9905 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 types; + QVector 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 41a1341e403..5f58b2cf68a 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 params; + QVector 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 &metaTypes, int slotIdx); + const QVector &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& params); + static int findSlot(QObject *obj, const QByteArray &normalizedName, QVector ¶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 &metaTypes, const QDBusMessage &msg); static QDBusCallDeliveryEvent *prepareReply(QDBusConnectionPrivate *target, QObject *object, - int idx, const QList &metaTypes, + int idx, const QVector &metaTypes, const QDBusMessage &msg); static void processFinishedCall(QDBusPendingCallPrivate *call); @@ -335,7 +335,7 @@ public: }; // in qdbusmisc.cpp -extern int qDBusParametersForMethod(const QMetaMethod &mm, QList& metaTypes); +extern int qDBusParametersForMethod(const QMetaMethod &mm, QVector &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 f0c8224be24..cb916017530 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& metaTypes) + const QString &signature_, QVector &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 &metaTypes, + const QVector &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 &metaTypes, int slotIdx) + const QVector &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 ¶ms) + QVector ¶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 c9a2efc57df..f910d2d0092 100644 --- a/src/dbus/qdbusintegrator_p.h +++ b/src/dbus/qdbusintegrator_p.h @@ -84,7 +84,7 @@ struct QDBusSlotCache { int flags; int slotIdx; - QList metaTypes; + QVector metaTypes; }; typedef QMultiHash 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 &types, int f = 0) + const QDBusMessage &msg, const QVector &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 metaTypes; + QVector metaTypes; int flags; }; diff --git a/src/dbus/qdbusmisc.cpp b/src/dbus/qdbusmisc.cpp index 7d68bf11855..8a0778f216e 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& metaTypes) +int qDBusParametersForMethod(const QMetaMethod &mm, QVector &metaTypes) { QDBusMetaTypeId::init(); diff --git a/src/dbus/qdbuspendingcall.cpp b/src/dbus/qdbuspendingcall.cpp index 65d4b5533bc..8e74ecbddef 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 types = QVector::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 2aaae7b494c..ca3b782a756 100644 --- a/src/dbus/qdbuspendingcall_p.h +++ b/src/dbus/qdbuspendingcall_p.h @@ -56,7 +56,7 @@ #include #include -#include +#include #include #include @@ -82,7 +82,7 @@ public: // for the callback mechanism (see setReplyCallback and QDBusConnectionPrivate::sendWithReplyAsync) QPointer receiver; - QList metaTypes; + QVector metaTypes; int methodIdx; bool autoDelete; diff --git a/src/dbus/qdbusxmlgenerator.cpp b/src/dbus/qdbusxmlgenerator.cpp index a6572b2c86c..99edf49868d 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 names = mm.parameterNames(); - QList types; + QVector types; int inputCount = qDBusParametersForMethod(mm, types); if (inputCount == -1) continue; // invalid form