summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel/qmetatype.cpp
diff options
context:
space:
mode:
authorJędrzej Nowacki <jedrzej.nowacki@nokia.com>2011-11-29 10:07:38 +0100
committerQt by Nokia <qt-info@nokia.com>2011-11-29 23:17:13 +0100
commitfa7f690178d2f74db168a23064a688fe421cb1e6 (patch)
treea2998113727266d57e77c0a6ec83aba355c62edc /src/corelib/kernel/qmetatype.cpp
parent8dca04f47f528fbcf9d6b6b34d8c4a81dc347941 (diff)
Fix a deadlock in QMetaType.
QMetaType should unlock all mutexes guarding custom types data before calling an user code. Task-number: QTBUG-22930 Change-Id: I501d011d6cbd467d8f22402d668e84aa848061b8 Reviewed-by: Olivier Goffart <ogoffart@woboq.com> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Rohan McGovern <rohan.mcgovern@nokia.com>
Diffstat (limited to 'src/corelib/kernel/qmetatype.cpp')
-rw-r--r--src/corelib/kernel/qmetatype.cpp20
1 files changed, 12 insertions, 8 deletions
diff --git a/src/corelib/kernel/qmetatype.cpp b/src/corelib/kernel/qmetatype.cpp
index e3a8293ee6..76537c79cb 100644
--- a/src/corelib/kernel/qmetatype.cpp
+++ b/src/corelib/kernel/qmetatype.cpp
@@ -1430,10 +1430,12 @@ private:
{
QMetaType::Constructor ctor = 0;
const QVector<QCustomTypeInfo> * const ct = customTypes();
- QReadLocker locker(customTypesLock());
- if (type < QMetaType::User || !ct || ct->count() <= type - QMetaType::User)
- return 0;
- ctor = ct->at(type - QMetaType::User).constructor;
+ {
+ QReadLocker locker(customTypesLock());
+ if (type < QMetaType::User || !ct || ct->count() <= type - QMetaType::User)
+ return 0;
+ ctor = ct->at(type - QMetaType::User).constructor;
+ }
return ctor ? ctor(where, copy) : 0;
}
@@ -1519,10 +1521,12 @@ private:
{
QMetaType::Destructor dtor = 0;
const QVector<QCustomTypeInfo> * const ct = customTypes();
- QReadLocker locker(customTypesLock());
- if (type < QMetaType::User || !ct || ct->count() <= type - QMetaType::User)
- return;
- dtor = ct->at(type - QMetaType::User).destructor;
+ {
+ QReadLocker locker(customTypesLock());
+ if (type < QMetaType::User || !ct || ct->count() <= type - QMetaType::User)
+ return;
+ dtor = ct->at(type - QMetaType::User).destructor;
+ }
if (!dtor)
return;
dtor(where);