From 373a7277db0583fbbb8ed61f9f61d6f77ed95da4 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Fri, 24 Aug 2012 12:06:03 +0200 Subject: QDBusMetaTypeId: don't cache the result of qMetaTypeId<>() in static ints There's not much point in caching the result of qMetaTypeId<>, because it's already internally memoised. In addition, the code that initialised the static int caches wasn't protected against concurrent access under the assumption that the operations performed were thread-safe. That is true for most of them, but not for the stores to the static ints, which race against each other: // Thread A // Thread B r1 = initialized /*=false*/ r1 = initialized /*=false*/ r2 = qMetaTypeId<...>(); r2 = qMetaTypeId<...>(); message = r2; message = r2; // race, ditto for all other ints To fix, turn the ints into inline functions that just call the respective qMetaTypeId<>() function. Change-Id: I5aa80c624872c3867232abc26ffdcde70cd54022 Reviewed-by: Thiago Macieira --- src/dbus/qdbusmarshaller.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/dbus/qdbusmarshaller.cpp') diff --git a/src/dbus/qdbusmarshaller.cpp b/src/dbus/qdbusmarshaller.cpp index 00ef7fd9d8..0a91a7c38e 100644 --- a/src/dbus/qdbusmarshaller.cpp +++ b/src/dbus/qdbusmarshaller.cpp @@ -185,7 +185,7 @@ inline bool QDBusMarshaller::append(const QDBusVariant &arg) QByteArray tmpSignature; const char *signature = 0; - if (id == QDBusMetaTypeId::argument) { + if (id == QDBusMetaTypeId::argument()) { // take the signature from the QDBusArgument object we're marshalling tmpSignature = qvariant_cast(value).currentSignature().toLatin1(); @@ -372,7 +372,7 @@ bool QDBusMarshaller::appendVariantInternal(const QVariant &arg) } // intercept QDBusArgument parameters here - if (id == QDBusMetaTypeId::argument) { + if (id == QDBusMetaTypeId::argument()) { QDBusArgument dbusargument = qvariant_cast(arg); QDBusArgumentPrivate *d = QDBusArgumentPrivate::d(dbusargument); if (!d->message) -- cgit v1.2.3