summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel
diff options
context:
space:
mode:
authorFrederik Gladhorn <frederik.gladhorn@digia.com>2013-01-16 01:22:45 +0100
committerFrederik Gladhorn <frederik.gladhorn@digia.com>2013-01-16 01:22:45 +0100
commit7075e291998612a3c0a530bb37a515dd07739e28 (patch)
tree4e1992498d82ee3f6f92fd6d42754c92928dd581 /src/corelib/kernel
parent1161a8a62907796ea45b1877bec31e66aeef77f6 (diff)
parent3d9a40038f01bc2a3df0027a9be04e7fa3ce3850 (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.cpp36
-rw-r--r--src/corelib/kernel/qsharedmemory_unix.cpp6
-rw-r--r--src/corelib/kernel/qsystemsemaphore_unix.cpp4
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();