diff options
Diffstat (limited to 'src/dbus/qdbusmetatype.cpp')
-rw-r--r-- | src/dbus/qdbusmetatype.cpp | 89 |
1 files changed, 56 insertions, 33 deletions
diff --git a/src/dbus/qdbusmetatype.cpp b/src/dbus/qdbusmetatype.cpp index a70190995d..3ae7589480 100644 --- a/src/dbus/qdbusmetatype.cpp +++ b/src/dbus/qdbusmetatype.cpp @@ -53,14 +53,14 @@ void QDBusMetaTypeId::init() // reentrancy is not a problem since everything else is locked on their own // set the guard variable at the end if (!initialized.loadRelaxed()) { - // 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(); + // register our types with Qt Core + message().registerType(); + argument().registerType(); + variant().registerType(); + objectpath().registerType(); + signature().registerType(); + error().registerType(); + unixfd().registerType(); #ifndef QDBUS_NO_SPECIALTYPES // and register Qt Core's with us @@ -78,7 +78,6 @@ void QDBusMetaTypeId::init() qDBusRegisterMetaType<QVariantList>(); qDBusRegisterMetaType<QVariantMap>(); qDBusRegisterMetaType<QVariantHash>(); - qDBusRegisterMetaType<QDBusObjectPath>(); qDBusRegisterMetaType<QList<bool> >(); qDBusRegisterMetaType<QList<short> >(); @@ -88,6 +87,9 @@ void QDBusMetaTypeId::init() qDBusRegisterMetaType<QList<qlonglong> >(); qDBusRegisterMetaType<QList<qulonglong> >(); qDBusRegisterMetaType<QList<double> >(); + + // plus lists of our own types + qDBusRegisterMetaType<QList<QDBusVariant> >(); qDBusRegisterMetaType<QList<QDBusObjectPath> >(); qDBusRegisterMetaType<QList<QDBusSignature> >(); qDBusRegisterMetaType<QList<QDBusUnixFileDescriptor> >(); @@ -97,9 +99,13 @@ void QDBusMetaTypeId::init() } } -using QDBusCustomTypeHash = QHash<int, QDBusCustomTypeInfo>; -Q_GLOBAL_STATIC(QDBusCustomTypeHash, customTypes) -Q_GLOBAL_STATIC(QReadWriteLock, customTypesLock) +struct QDBusCustomTypes +{ + QReadWriteLock lock; + QHash<int, QDBusCustomTypeInfo> hash; +}; + +Q_GLOBAL_STATIC(QDBusCustomTypes, customTypes) /*! \class QDBusMetaType @@ -123,7 +129,7 @@ Q_GLOBAL_STATIC(QReadWriteLock, customTypesLock) */ /*! - \fn int qDBusRegisterMetaType() + \fn template<typename T> QMetaType qDBusRegisterMetaType() \relates QDBusArgument \threadsafe \since 4.2 @@ -180,12 +186,15 @@ void QDBusMetaType::registerMarshallOperators(QMetaType metaType, MarshallFuncti DemarshallFunction df) { int id = metaType.id(); - auto *ct = customTypes(); - if (id < 0 || !mf || !df || !ct) + if (id < 0 || !mf || !df) return; // error! - QWriteLocker locker(customTypesLock()); - QDBusCustomTypeInfo &info = (*ct)[id]; + auto *ct = customTypes(); + if (!ct) + return; + + QWriteLocker locker(&ct->lock); + QDBusCustomTypeInfo &info = ct->hash[id]; info.marshall = mf; info.demarshall = df; } @@ -198,15 +207,19 @@ void QDBusMetaType::registerMarshallOperators(QMetaType metaType, MarshallFuncti */ bool QDBusMetaType::marshall(QDBusArgument &arg, QMetaType metaType, const void *data) { + auto *ct = customTypes(); + if (!ct) + return false; + int id = metaType.id(); QDBusMetaTypeId::init(); MarshallFunction mf; { - QReadLocker locker(customTypesLock()); - auto *ct = customTypes(); - auto it = ct->constFind(id); - if (it == ct->cend()) + QReadLocker locker(&ct->lock); + + auto it = ct->hash.constFind(id); + if (it == ct->hash.cend()) return false; // non-existent const QDBusCustomTypeInfo &info = *it; @@ -229,15 +242,19 @@ bool QDBusMetaType::marshall(QDBusArgument &arg, QMetaType metaType, const void */ bool QDBusMetaType::demarshall(const QDBusArgument &arg, QMetaType metaType, void *data) { + auto *ct = customTypes(); + if (!ct) + return false; + int id = metaType.id(); QDBusMetaTypeId::init(); DemarshallFunction df; { - QReadLocker locker(customTypesLock()); - auto *ct = customTypes(); - auto it = ct->constFind(id); - if (it == ct->cend()) + QReadLocker locker(&ct->lock); + + auto it = ct->hash.constFind(id); + if (it == ct->hash.cend()) return false; // non-existent const QDBusCustomTypeInfo &info = *it; @@ -355,8 +372,11 @@ QMetaType QDBusMetaType::signatureToMetaType(const char *signature) void QDBusMetaType::registerCustomType(QMetaType type, const QByteArray &signature) { auto *ct = customTypes(); - QWriteLocker locker(customTypesLock()); - auto &info = (*ct)[type.id()]; + if (!ct) + return; + + QWriteLocker locker(&ct->lock); + auto &info = ct->hash[type.id()]; info.signature = signature; // note how marshall/demarshall are not set, the type is never used at runtime } @@ -428,10 +448,13 @@ const char *QDBusMetaType::typeToSignature(QMetaType type) // try the database auto *ct = customTypes(); + if (!ct) + return nullptr; + { - QReadLocker locker(customTypesLock()); - auto it = ct->constFind(type.id()); - if (it == ct->end()) + QReadLocker locker(&ct->lock); + auto it = ct->hash.constFind(type.id()); + if (it == ct->hash.end()) return nullptr; const QDBusCustomTypeInfo &info = *it; @@ -448,11 +471,11 @@ const char *QDBusMetaType::typeToSignature(QMetaType type) { // createSignature will never return a null QByteArray // if there was an error, it'll return "" - QByteArray signature = QDBusArgumentPrivate::createSignature(type.id()); + QByteArray signature = QDBusArgumentPrivate::createSignature(type); // re-acquire lock - QWriteLocker locker(customTypesLock()); - info = &(*ct)[type.id()]; + QWriteLocker locker(&ct->lock); + info = &ct->hash[type.id()]; info->signature = signature; } return info->signature; |