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>
This commit is contained in:
parent
387ec9c2a3
commit
e22a6108fd
@ -296,7 +296,7 @@ void QDBusAdaptorConnector::relay(QObject *senderObj, int lastSignalIdx, void **
|
|||||||
realObject = realObject->parent();
|
realObject = realObject->parent();
|
||||||
|
|
||||||
// break down the parameter list
|
// break down the parameter list
|
||||||
QList<int> types;
|
QVector<int> types;
|
||||||
int inputCount = qDBusParametersForMethod(mm, types);
|
int inputCount = qDBusParametersForMethod(mm, types);
|
||||||
if (inputCount == -1)
|
if (inputCount == -1)
|
||||||
// invalid signal signature
|
// invalid signal signature
|
||||||
|
@ -124,7 +124,7 @@ public:
|
|||||||
QString service, path, signature;
|
QString service, path, signature;
|
||||||
QObject* obj;
|
QObject* obj;
|
||||||
int midx;
|
int midx;
|
||||||
QList<int> params;
|
QVector<int> params;
|
||||||
QStringList argumentMatch;
|
QStringList argumentMatch;
|
||||||
QByteArray matchRule;
|
QByteArray matchRule;
|
||||||
};
|
};
|
||||||
@ -241,7 +241,7 @@ private:
|
|||||||
|
|
||||||
void sendError(const QDBusMessage &msg, QDBusError::ErrorType code);
|
void sendError(const QDBusMessage &msg, QDBusError::ErrorType code);
|
||||||
void deliverCall(QObject *object, int flags, const QDBusMessage &msg,
|
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;
|
bool isServiceRegisteredByThread(const QString &serviceName) const;
|
||||||
|
|
||||||
@ -309,7 +309,7 @@ public:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
// static methods
|
// 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,
|
static bool prepareHook(QDBusConnectionPrivate::SignalHook &hook, QString &key,
|
||||||
const QString &service,
|
const QString &service,
|
||||||
const QString &path, const QString &interface, const QString &name,
|
const QString &path, const QString &interface, const QString &name,
|
||||||
@ -321,7 +321,7 @@ public:
|
|||||||
int idx, const QList<int> &metaTypes,
|
int idx, const QList<int> &metaTypes,
|
||||||
const QDBusMessage &msg);
|
const QDBusMessage &msg);
|
||||||
static QDBusCallDeliveryEvent *prepareReply(QDBusConnectionPrivate *target, QObject *object,
|
static QDBusCallDeliveryEvent *prepareReply(QDBusConnectionPrivate *target, QObject *object,
|
||||||
int idx, const QList<int> &metaTypes,
|
int idx, const QVector<int> &metaTypes,
|
||||||
const QDBusMessage &msg);
|
const QDBusMessage &msg);
|
||||||
static void processFinishedCall(QDBusPendingCallPrivate *call);
|
static void processFinishedCall(QDBusPendingCallPrivate *call);
|
||||||
|
|
||||||
@ -335,7 +335,7 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
// in qdbusmisc.cpp
|
// 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 qDBusCheckAsyncTag(const char *tag);
|
||||||
extern bool qDBusInterfaceInObject(QObject *obj, const QString &interface_name);
|
extern bool qDBusInterfaceInObject(QObject *obj, const QString &interface_name);
|
||||||
extern QString qDBusInterfaceFromMetaObject(const QMetaObject *mo);
|
extern QString qDBusInterfaceFromMetaObject(const QMetaObject *mo);
|
||||||
|
@ -624,7 +624,7 @@ static void huntAndEmit(DBusConnection *connection, DBusMessage *msg,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int findSlot(const QMetaObject *mo, const QByteArray &name, int flags,
|
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();
|
QByteArray msgSignature = signature_.toLatin1();
|
||||||
|
|
||||||
@ -724,7 +724,7 @@ static QDBusCallDeliveryEvent * const DIRECT_DELIVERY = (QDBusCallDeliveryEvent
|
|||||||
|
|
||||||
QDBusCallDeliveryEvent* QDBusConnectionPrivate::prepareReply(QDBusConnectionPrivate *target,
|
QDBusCallDeliveryEvent* QDBusConnectionPrivate::prepareReply(QDBusConnectionPrivate *target,
|
||||||
QObject *object, int idx,
|
QObject *object, int idx,
|
||||||
const QList<int> &metaTypes,
|
const QVector<int> &metaTypes,
|
||||||
const QDBusMessage &msg)
|
const QDBusMessage &msg)
|
||||||
{
|
{
|
||||||
Q_ASSERT(object);
|
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,
|
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(),
|
Q_ASSERT_X(!object || QThread::currentThread() == object->thread(),
|
||||||
"QDBusConnection: internal threading error",
|
"QDBusConnection: internal threading error",
|
||||||
@ -1238,7 +1238,7 @@ void QDBusConnectionPrivate::serviceOwnerChangedNoLock(const QString &name,
|
|||||||
}
|
}
|
||||||
|
|
||||||
int QDBusConnectionPrivate::findSlot(QObject* obj, const QByteArray &normalizedName,
|
int QDBusConnectionPrivate::findSlot(QObject* obj, const QByteArray &normalizedName,
|
||||||
QList<int> ¶ms)
|
QVector<int> ¶ms)
|
||||||
{
|
{
|
||||||
int midx = obj->metaObject()->indexOfMethod(normalizedName);
|
int midx = obj->metaObject()->indexOfMethod(normalizedName);
|
||||||
if (midx == -1)
|
if (midx == -1)
|
||||||
|
@ -84,7 +84,7 @@ struct QDBusSlotCache
|
|||||||
{
|
{
|
||||||
int flags;
|
int flags;
|
||||||
int slotIdx;
|
int slotIdx;
|
||||||
QList<int> metaTypes;
|
QVector<int> metaTypes;
|
||||||
};
|
};
|
||||||
typedef QMultiHash<QString, Data> Hash;
|
typedef QMultiHash<QString, Data> Hash;
|
||||||
Hash hash;
|
Hash hash;
|
||||||
@ -94,7 +94,7 @@ class QDBusCallDeliveryEvent: public QMetaCallEvent
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
QDBusCallDeliveryEvent(const QDBusConnection &c, int id, QObject *sender,
|
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)
|
: QMetaCallEvent(0, id, 0, sender, -1), connection(c), message(msg), metaTypes(types), flags(f)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
@ -106,7 +106,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
QDBusConnection connection; // just for refcounting
|
QDBusConnection connection; // just for refcounting
|
||||||
QDBusMessage message;
|
QDBusMessage message;
|
||||||
QList<int> metaTypes;
|
QVector<int> metaTypes;
|
||||||
int flags;
|
int flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -126,7 +126,7 @@ bool qDBusInterfaceInObject(QObject *obj, const QString &interface_name)
|
|||||||
// metaTypes.count() >= retval + 1 in all cases
|
// metaTypes.count() >= retval + 1 in all cases
|
||||||
//
|
//
|
||||||
// sig must be the normalised signature for the method
|
// 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();
|
QDBusMetaTypeId::init();
|
||||||
|
|
||||||
|
@ -180,12 +180,7 @@ bool QDBusPendingCallPrivate::setReplyCallback(QObject *target, const char *memb
|
|||||||
if (metaTypes.at(count) == QDBusMetaTypeId::message)
|
if (metaTypes.at(count) == QDBusMetaTypeId::message)
|
||||||
--count;
|
--count;
|
||||||
|
|
||||||
if (count == 0) {
|
setMetaTypes(count, count ? metaTypes.constData() + 1 : 0);
|
||||||
setMetaTypes(count, 0);
|
|
||||||
} else {
|
|
||||||
QVector<int> types = QVector<int>::fromList(metaTypes);
|
|
||||||
setMetaTypes(count, types.constData() + 1);
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -56,7 +56,7 @@
|
|||||||
|
|
||||||
#include <qshareddata.h>
|
#include <qshareddata.h>
|
||||||
#include <qpointer.h>
|
#include <qpointer.h>
|
||||||
#include <qlist.h>
|
#include <qvector.h>
|
||||||
#include <qmutex.h>
|
#include <qmutex.h>
|
||||||
#include <qwaitcondition.h>
|
#include <qwaitcondition.h>
|
||||||
|
|
||||||
@ -82,7 +82,7 @@ public:
|
|||||||
|
|
||||||
// for the callback mechanism (see setReplyCallback and QDBusConnectionPrivate::sendWithReplyAsync)
|
// for the callback mechanism (see setReplyCallback and QDBusConnectionPrivate::sendWithReplyAsync)
|
||||||
QPointer<QObject> receiver;
|
QPointer<QObject> receiver;
|
||||||
QList<int> metaTypes;
|
QVector<int> metaTypes;
|
||||||
int methodIdx;
|
int methodIdx;
|
||||||
|
|
||||||
bool autoDelete;
|
bool autoDelete;
|
||||||
|
@ -168,7 +168,7 @@ static QString generateInterfaceXml(const QMetaObject *mo, int flags, int method
|
|||||||
continue; // wasn't a valid type
|
continue; // wasn't a valid type
|
||||||
|
|
||||||
QList<QByteArray> names = mm.parameterNames();
|
QList<QByteArray> names = mm.parameterNames();
|
||||||
QList<int> types;
|
QVector<int> types;
|
||||||
int inputCount = qDBusParametersForMethod(mm, types);
|
int inputCount = qDBusParametersForMethod(mm, types);
|
||||||
if (inputCount == -1)
|
if (inputCount == -1)
|
||||||
continue; // invalid form
|
continue; // invalid form
|
||||||
|
Loading…
x
Reference in New Issue
Block a user