summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2017-05-17 13:07:14 +0200
committerLars Knoll <lars.knoll@qt.io>2017-05-17 13:42:47 +0000
commit51f095e655ce8b4b1d73d0d11817bb839a91c1df (patch)
tree51748dc09aceacedee36b166562c133a27e93abd
parent3f1548ae82d4321b6fdbbf127dafbdf385374be0 (diff)
Revert "Merge the QDBusMetaType's custom information to QDBusConnectionManager"
This reverts commit daeb334039e9dcc01485995f53552749131a06b7. The commit was causing race conditions, and random failures in CI. Task-number: QTBUG-60792 Change-Id: I6e49b733965632a1a268f0e88809794098465ec0 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
-rw-r--r--src/dbus/qdbusconnection.cpp1
-rw-r--r--src/dbus/qdbusconnectionmanager_p.h3
-rw-r--r--src/dbus/qdbusintegrator.cpp1
-rw-r--r--src/dbus/qdbusmetatype.cpp185
-rw-r--r--src/dbus/qdbusmetatype_p.h27
-rw-r--r--src/dbus/qdbusmisc.cpp3
6 files changed, 93 insertions, 127 deletions
diff --git a/src/dbus/qdbusconnection.cpp b/src/dbus/qdbusconnection.cpp
index 8fae11c8cd..75c1e92f96 100644
--- a/src/dbus/qdbusconnection.cpp
+++ b/src/dbus/qdbusconnection.cpp
@@ -190,7 +190,6 @@ void QDBusConnectionManager::run()
}
}
connectionHash.clear();
- customTypes.clear();
// allow deletion from any thread without warning
moveToThread(Q_NULLPTR);
diff --git a/src/dbus/qdbusconnectionmanager_p.h b/src/dbus/qdbusconnectionmanager_p.h
index fd6cd84677..1c7dea811d 100644
--- a/src/dbus/qdbusconnectionmanager_p.h
+++ b/src/dbus/qdbusconnectionmanager_p.h
@@ -55,14 +55,13 @@
#include <QtDBus/private/qtdbusglobal_p.h>
#include "qdbusconnection_p.h"
-#include "qdbusmetatype_p.h"
#include "private/qthread_p.h"
#ifndef QT_NO_DBUS
QT_BEGIN_NAMESPACE
-class QDBusConnectionManager : public QDaemonThread, public QDBusMetaTypeId
+class QDBusConnectionManager : public QDaemonThread
{
Q_OBJECT
struct ConnectionRequestData;
diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp
index e1e588b850..16cd021d0d 100644
--- a/src/dbus/qdbusintegrator.cpp
+++ b/src/dbus/qdbusintegrator.cpp
@@ -1039,6 +1039,7 @@ QDBusConnectionPrivate::QDBusConnectionPrivate(QObject *p)
qdbusThreadDebug = qdbusDefaultThreadDebug;
#endif
+ QDBusMetaTypeId::init();
connect(this, &QDBusConnectionPrivate::dispatchStatusChanged,
this, &QDBusConnectionPrivate::doDispatch, Qt::QueuedConnection);
connect(this, &QDBusConnectionPrivate::spyHooksFinished,
diff --git a/src/dbus/qdbusmetatype.cpp b/src/dbus/qdbusmetatype.cpp
index 9ab3c345bb..fb2b407997 100644
--- a/src/dbus/qdbusmetatype.cpp
+++ b/src/dbus/qdbusmetatype.cpp
@@ -1,7 +1,6 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtDBus module of the Qt Toolkit.
@@ -40,15 +39,19 @@
#include "qdbusmetatype.h"
#include "qdbusmetatype_p.h"
-#include "qdbus_symbols_p.h"
#include <string.h>
+#include "qdbus_symbols_p.h"
+
+#include <qbytearray.h>
+#include <qglobal.h>
+#include <qreadwritelock.h>
+#include <qvector.h>
#include "qdbusargument_p.h"
#include "qdbusutil_p.h"
#include "qdbusunixfiledescriptor.h"
#ifndef QT_BOOTSTRAPPED
-#include "qdbusconnectionmanager_p.h"
#include "qdbusmessage.h"
#endif
@@ -61,72 +64,82 @@
QT_BEGIN_NAMESPACE
-static void registerMarshallOperatorsNoLock(QVector<QDBusCustomTypeInfo> &ct, int id,
- QDBusMetaType::MarshallFunction mf,
- QDBusMetaType::DemarshallFunction df);
+class QDBusCustomTypeInfo
+{
+public:
+ QDBusCustomTypeInfo() : signature(), marshall(0), demarshall(0)
+ { }
+
+ // Suggestion:
+ // change 'signature' to char* and make QDBusCustomTypeInfo a Movable type
+ QByteArray signature;
+ QDBusMetaType::MarshallFunction marshall;
+ QDBusMetaType::DemarshallFunction demarshall;
+};
template<typename T>
-inline static void registerHelper(QVector<QDBusCustomTypeInfo> &ct)
+inline static void registerHelper(T * = 0)
{
void (*mf)(QDBusArgument &, const T *) = qDBusMarshallHelper<T>;
void (*df)(const QDBusArgument &, T *) = qDBusDemarshallHelper<T>;
- registerMarshallOperatorsNoLock(ct, qMetaTypeId<T>(),
+ QDBusMetaType::registerMarshallOperators(qMetaTypeId<T>(),
reinterpret_cast<QDBusMetaType::MarshallFunction>(mf),
reinterpret_cast<QDBusMetaType::DemarshallFunction>(df));
}
-QDBusMetaTypeId *QDBusMetaTypeId::instance()
+void QDBusMetaTypeId::init()
{
-#ifdef QT_BOOTSTRAPPED
- static QDBusMetaTypeId self;
- return &self;
-#else
- return QDBusConnectionManager::instance();
-#endif
-}
-
-QDBusMetaTypeId::QDBusMetaTypeId()
-{
- // register our types with Qt Core (calling qMetaTypeId<T>() does this implicitly)
- (void)message();
- (void)argument();
- (void)variant();
- (void)objectpath();
- (void)signature();
- (void)error();
- (void)unixfd();
+ static QBasicAtomicInt initialized = Q_BASIC_ATOMIC_INITIALIZER(false);
+
+ // reentrancy is not a problem since everything else is locked on their own
+ // set the guard variable at the end
+ if (!initialized.load()) {
+ // register our types with Qt Core (calling qMetaTypeId<T>() does this implicitly)
+ (void)message();
+ (void)argument();
+ (void)variant();
+ (void)objectpath();
+ (void)signature();
+ (void)error();
+ (void)unixfd();
#ifndef QDBUS_NO_SPECIALTYPES
- // and register Qt Core's with us
- registerHelper<QDate>(customTypes);
- registerHelper<QTime>(customTypes);
- registerHelper<QDateTime>(customTypes);
- registerHelper<QRect>(customTypes);
- registerHelper<QRectF>(customTypes);
- registerHelper<QSize>(customTypes);
- registerHelper<QSizeF>(customTypes);
- registerHelper<QPoint>(customTypes);
- registerHelper<QPointF>(customTypes);
- registerHelper<QLine>(customTypes);
- registerHelper<QLineF>(customTypes);
- registerHelper<QVariantList>(customTypes);
- registerHelper<QVariantMap>(customTypes);
- registerHelper<QVariantHash>(customTypes);
-
- registerHelper<QList<bool> >(customTypes);
- registerHelper<QList<short> >(customTypes);
- registerHelper<QList<ushort> >(customTypes);
- registerHelper<QList<int> >(customTypes);
- registerHelper<QList<uint> >(customTypes);
- registerHelper<QList<qlonglong> >(customTypes);
- registerHelper<QList<qulonglong> >(customTypes);
- registerHelper<QList<double> >(customTypes);
- registerHelper<QList<QDBusObjectPath> >(customTypes);
- registerHelper<QList<QDBusSignature> >(customTypes);
- registerHelper<QList<QDBusUnixFileDescriptor> >(customTypes);
+ // and register Qt Core's with us
+ registerHelper<QDate>();
+ registerHelper<QTime>();
+ registerHelper<QDateTime>();
+ registerHelper<QRect>();
+ registerHelper<QRectF>();
+ registerHelper<QSize>();
+ registerHelper<QSizeF>();
+ registerHelper<QPoint>();
+ registerHelper<QPointF>();
+ registerHelper<QLine>();
+ registerHelper<QLineF>();
+ registerHelper<QVariantList>();
+ registerHelper<QVariantMap>();
+ registerHelper<QVariantHash>();
+
+ qDBusRegisterMetaType<QList<bool> >();
+ qDBusRegisterMetaType<QList<short> >();
+ qDBusRegisterMetaType<QList<ushort> >();
+ qDBusRegisterMetaType<QList<int> >();
+ qDBusRegisterMetaType<QList<uint> >();
+ qDBusRegisterMetaType<QList<qlonglong> >();
+ qDBusRegisterMetaType<QList<qulonglong> >();
+ qDBusRegisterMetaType<QList<double> >();
+ qDBusRegisterMetaType<QList<QDBusObjectPath> >();
+ qDBusRegisterMetaType<QList<QDBusSignature> >();
+ qDBusRegisterMetaType<QList<QDBusUnixFileDescriptor> >();
#endif
+
+ initialized.store(true);
+ }
}
+Q_GLOBAL_STATIC(QVector<QDBusCustomTypeInfo>, customTypes)
+Q_GLOBAL_STATIC(QReadWriteLock, customTypesLock)
+
/*!
\class QDBusMetaType
\inmodule QtDBus
@@ -204,22 +217,14 @@ void QDBusMetaType::registerMarshallOperators(int id, MarshallFunction mf,
DemarshallFunction df)
{
QByteArray var;
- QDBusMetaTypeId *mgr = QDBusMetaTypeId::instance();
- if (id < 0 || !mf || !df || !mgr)
+ QVector<QDBusCustomTypeInfo> *ct = customTypes();
+ if (id < 0 || !mf || !df || !ct)
return; // error!
- QWriteLocker locker(&mgr->customTypesLock);
- QVector<QDBusCustomTypeInfo> &ct = mgr->customTypes;
- registerMarshallOperatorsNoLock(ct, id, mf, df);
-}
-
-static void registerMarshallOperatorsNoLock(QVector<QDBusCustomTypeInfo> &ct, int id,
- QDBusMetaType::MarshallFunction mf,
- QDBusMetaType::DemarshallFunction df)
-{
- if (id >= ct.size())
- ct.resize(id + 1);
- QDBusCustomTypeInfo &info = ct[id];
+ QWriteLocker locker(customTypesLock());
+ if (id >= ct->size())
+ ct->resize(id + 1);
+ QDBusCustomTypeInfo &info = (*ct)[id];
info.marshall = mf;
info.demarshall = df;
}
@@ -236,16 +241,12 @@ bool QDBusMetaType::marshall(QDBusArgument &arg, int id, const void *data)
MarshallFunction mf;
{
- const QDBusMetaTypeId *mgr = QDBusMetaTypeId::instance();
- if (!mgr)
- return false; // shutting down
-
- QReadLocker locker(&mgr->customTypesLock);
- const QVector<QDBusCustomTypeInfo> &ct = mgr->customTypes;
- if (id >= ct.size())
+ QReadLocker locker(customTypesLock());
+ QVector<QDBusCustomTypeInfo> *ct = customTypes();
+ if (id >= ct->size())
return false; // non-existent
- const QDBusCustomTypeInfo &info = ct.at(id);
+ const QDBusCustomTypeInfo &info = (*ct).at(id);
if (!info.marshall) {
mf = 0; // make gcc happy
return false;
@@ -269,16 +270,12 @@ bool QDBusMetaType::demarshall(const QDBusArgument &arg, int id, void *data)
DemarshallFunction df;
{
- const QDBusMetaTypeId *mgr = QDBusMetaTypeId::instance();
- if (!mgr)
- return false; // shutting down
-
- QReadLocker locker(&mgr->customTypesLock);
- const QVector<QDBusCustomTypeInfo> &ct = mgr->customTypes;
- if (id >= ct.size())
+ QReadLocker locker(customTypesLock());
+ QVector<QDBusCustomTypeInfo> *ct = customTypes();
+ if (id >= ct->size())
return false; // non-existent
- const QDBusCustomTypeInfo &info = ct.at(id);
+ const QDBusCustomTypeInfo &info = (*ct).at(id);
if (!info.demarshall) {
df = 0; // make gcc happy
return false;
@@ -437,11 +434,7 @@ const char *QDBusMetaType::typeToSignature(int type)
DBUS_TYPE_BYTE_AS_STRING; // ay
}
- // try the database
- QDBusMetaTypeId *mgr = QDBusMetaTypeId::instance();
- if (!mgr)
- return Q_NULLPTR; // shutting down
-
+ QDBusMetaTypeId::init();
if (type == QDBusMetaTypeId::variant())
return DBUS_TYPE_VARIANT_AS_STRING;
else if (type == QDBusMetaTypeId::objectpath())
@@ -451,13 +444,14 @@ const char *QDBusMetaType::typeToSignature(int type)
else if (type == QDBusMetaTypeId::unixfd())
return DBUS_TYPE_UNIX_FD_AS_STRING;
+ // try the database
+ QVector<QDBusCustomTypeInfo> *ct = customTypes();
{
- QReadLocker locker(&mgr->customTypesLock);
- const QVector<QDBusCustomTypeInfo> &ct = mgr->customTypes;
- if (type >= ct.size())
+ QReadLocker locker(customTypesLock());
+ if (type >= ct->size())
return 0; // type not registered with us
- const QDBusCustomTypeInfo &info = ct.at(type);
+ const QDBusCustomTypeInfo &info = (*ct).at(type);
if (!info.signature.isNull())
return info.signature;
@@ -474,9 +468,8 @@ const char *QDBusMetaType::typeToSignature(int type)
QByteArray signature = QDBusArgumentPrivate::createSignature(type);
// re-acquire lock
- QWriteLocker locker(&mgr->customTypesLock);
- QVector<QDBusCustomTypeInfo> &ct = mgr->customTypes;
- info = &ct[type];
+ QWriteLocker locker(customTypesLock());
+ info = &(*ct)[type];
info->signature = signature;
}
return info->signature;
diff --git a/src/dbus/qdbusmetatype_p.h b/src/dbus/qdbusmetatype_p.h
index 1f7e61318a..1aa11552df 100644
--- a/src/dbus/qdbusmetatype_p.h
+++ b/src/dbus/qdbusmetatype_p.h
@@ -1,7 +1,6 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtDBus module of the Qt Toolkit.
@@ -61,27 +60,10 @@
#include <qdbuserror.h>
#include <qdbusunixfiledescriptor.h>
-#include <qbytearray.h>
-#include <qreadwritelock.h>
-#include <qvector.h>
-
#ifndef QT_NO_DBUS
QT_BEGIN_NAMESPACE
-class QDBusCustomTypeInfo
-{
-public:
- QDBusCustomTypeInfo() : signature(), marshall(0), demarshall(0)
- { }
-
- // Suggestion:
- // change 'signature' to char* and make QDBusCustomTypeInfo a Movable type
- QByteArray signature;
- QDBusMetaType::MarshallFunction marshall;
- QDBusMetaType::DemarshallFunction demarshall;
-};
-
struct QDBusMetaTypeId
{
static int message(); // QDBusMessage
@@ -92,14 +74,7 @@ struct QDBusMetaTypeId
static int error(); // QDBusError
static int unixfd(); // QDBusUnixFileDescriptor
- static void init() { instance(); }
- static QDBusMetaTypeId *instance();
-
- mutable QReadWriteLock customTypesLock;
- QVector<QDBusCustomTypeInfo> customTypes;
-
-protected:
- QDBusMetaTypeId();
+ static void init();
};
inline int QDBusMetaTypeId::message()
diff --git a/src/dbus/qdbusmisc.cpp b/src/dbus/qdbusmisc.cpp
index 01436da481..930c3bd2da 100644
--- a/src/dbus/qdbusmisc.cpp
+++ b/src/dbus/qdbusmisc.cpp
@@ -144,9 +144,8 @@ int qDBusParametersForMethod(const QMetaMethod &mm, QVector<int> &metaTypes, QSt
int qDBusParametersForMethod(const QList<QByteArray> &parameterTypes, QVector<int>& metaTypes, QString &errorMsg)
{
+ QDBusMetaTypeId::init();
metaTypes.clear();
- if (!QDBusMetaTypeId::instance())
- return -1;
metaTypes.append(0); // return type
int inputCount = 0;