diff options
author | Frederik Gladhorn <frederik.gladhorn@digia.com> | 2013-01-16 01:22:45 +0100 |
---|---|---|
committer | Frederik Gladhorn <frederik.gladhorn@digia.com> | 2013-01-16 01:22:45 +0100 |
commit | 7075e291998612a3c0a530bb37a515dd07739e28 (patch) | |
tree | 4e1992498d82ee3f6f92fd6d42754c92928dd581 /src/corelib/kernel | |
parent | 1161a8a62907796ea45b1877bec31e66aeef77f6 (diff) | |
parent | 3d9a40038f01bc2a3df0027a9be04e7fa3ce3850 (diff) |
Merge remote-tracking branch 'origin/stable' into dev
Conflicts:
src/widgets/styles/qstyleanimation.cpp
Change-Id: Iae570895be6544de80f9c1ec309d1a08c59daff8
Diffstat (limited to 'src/corelib/kernel')
-rw-r--r-- | src/corelib/kernel/qmetatype.cpp | 36 | ||||
-rw-r--r-- | src/corelib/kernel/qsharedmemory_unix.cpp | 6 | ||||
-rw-r--r-- | src/corelib/kernel/qsystemsemaphore_unix.cpp | 4 |
3 files changed, 36 insertions, 10 deletions
diff --git a/src/corelib/kernel/qmetatype.cpp b/src/corelib/kernel/qmetatype.cpp index 82b6ed54d1..c47270b83b 100644 --- a/src/corelib/kernel/qmetatype.cpp +++ b/src/corelib/kernel/qmetatype.cpp @@ -646,11 +646,26 @@ int QMetaType::registerNormalizedType(const NS(QByteArray) &normalizedTypeName, "size %i, now registering size %i.", normalizedTypeName.constData(), idx, previousSize, size); } + + // Ignore WasDeclaredAsMetaType inconsitency, to many users were hitting the problem + previousFlags |= WasDeclaredAsMetaType; + flags |= WasDeclaredAsMetaType; + if (previousFlags != flags) { - qFatal("QMetaType::registerType: Binary compatibility break " - "-- Type flags for type '%s' [%i] don't match. Previously " - "registered TypeFlags(0x%x), now registering TypeFlags(0x%x).", - normalizedTypeName.constData(), idx, previousFlags, int(flags)); + const int maskForTypeInfo = NeedsConstruction | NeedsDestruction | MovableType; + const char *msg = "QMetaType::registerType: Binary compatibility break. " + "\nType flags for type '%s' [%i] don't match. Previously " + "registered TypeFlags(0x%x), now registering TypeFlags(0x%x). " + "This is an ODR break, which means that your application depends on a C++ undefined behavior." + "\nHint: %s"; + QT_PREPEND_NAMESPACE(QByteArray) hint; + if ((previousFlags & maskForTypeInfo) != (flags & maskForTypeInfo)) { + hint += "\nIt seems that the type was registered at least twice in a different translation units, " + "but Q_DECLARE_TYPEINFO is not visible from all the translations unit or different flags were used." + "Remember that Q_DECLARE_TYPEINFO should be declared before QMetaType registration, " + "preferably it should be placed just after the type declaration and before Q_DECLARE_METATYPE"; + } + qFatal(msg, normalizedTypeName.constData(), idx, previousFlags, int(flags), hint.constData()); } return idx; @@ -1722,6 +1737,9 @@ const QMetaObject *QMetaType::metaObjectForType(int type) \snippet code/src_corelib_kernel_qmetatype.cpp 9 + \warning This function is useful only for registering an alias (typedef) + for every other use case Q_DECLARE_METATYPE and qMetaTypeId() should be used instead. + \sa qRegisterMetaTypeStreamOperators(), QMetaType::isRegistered(), Q_DECLARE_METATYPE() */ @@ -1767,7 +1785,7 @@ const QMetaObject *QMetaType::metaObjectForType(int type) */ /*! - \fn int qRegisterMetaType(const char *typeName) + \fn int qRegisterMetaType() \relates QMetaType \threadsafe \since 4.2 @@ -1779,6 +1797,14 @@ const QMetaObject *QMetaType::metaObjectForType(int type) \snippet code/src_corelib_kernel_qmetatype.cpp 7 + This function requires that \c{T} is a fully defined type at the point + where the function is called. For pointer types, it also requires that the + pointed to type is fully defined. Use Q_DECLARE_OPAQUE_POINTER() to be able + to register pointers to forward declared types. + + After a type has been registered, you can create and destroy + objects of that type dynamically at run-time. + To use the type \c T in QVariant, using Q_DECLARE_METATYPE() is sufficient. To use the type \c T in queued signal and slot connections, \c{qRegisterMetaType<T>()} must be called before the first connection diff --git a/src/corelib/kernel/qsharedmemory_unix.cpp b/src/corelib/kernel/qsharedmemory_unix.cpp index fd2bc97b2d..6bcb4076b4 100644 --- a/src/corelib/kernel/qsharedmemory_unix.cpp +++ b/src/corelib/kernel/qsharedmemory_unix.cpp @@ -197,7 +197,7 @@ bool QSharedMemoryPrivate::create(int size) } // create - if (-1 == shmget(unix_key, size, 0666 | IPC_CREAT | IPC_EXCL)) { + if (-1 == shmget(unix_key, size, 0600 | IPC_CREAT | IPC_EXCL)) { QString function = QLatin1String("QSharedMemory::create"); switch (errno) { case EINVAL: @@ -218,7 +218,7 @@ bool QSharedMemoryPrivate::create(int size) bool QSharedMemoryPrivate::attach(QSharedMemory::AccessMode mode) { // grab the shared memory segment id - int id = shmget(unix_key, 0, (mode == QSharedMemory::ReadOnly ? 0444 : 0660)); + int id = shmget(unix_key, 0, (mode == QSharedMemory::ReadOnly ? 0400 : 0600)); if (-1 == id) { setErrorString(QLatin1String("QSharedMemory::attach (shmget)")); return false; @@ -263,7 +263,7 @@ bool QSharedMemoryPrivate::detach() size = 0; // Get the number of current attachments - int id = shmget(unix_key, 0, 0444); + int id = shmget(unix_key, 0, 0400); cleanHandle(); struct shmid_ds shmid_ds; diff --git a/src/corelib/kernel/qsystemsemaphore_unix.cpp b/src/corelib/kernel/qsystemsemaphore_unix.cpp index e67fb42285..303f0c7725 100644 --- a/src/corelib/kernel/qsystemsemaphore_unix.cpp +++ b/src/corelib/kernel/qsystemsemaphore_unix.cpp @@ -136,10 +136,10 @@ key_t QSystemSemaphorePrivate::handle(QSystemSemaphore::AccessMode mode) } // Get semaphore - semaphore = semget(unix_key, 1, 0666 | IPC_CREAT | IPC_EXCL); + semaphore = semget(unix_key, 1, 0600 | IPC_CREAT | IPC_EXCL); if (-1 == semaphore) { if (errno == EEXIST) - semaphore = semget(unix_key, 1, 0666 | IPC_CREAT); + semaphore = semget(unix_key, 1, 0600 | IPC_CREAT); if (-1 == semaphore) { setErrorString(QLatin1String("QSystemSemaphore::handle")); cleanHandle(); |