diff options
author | Jędrzej Nowacki <jedrzej.nowacki@nokia.com> | 2011-11-29 10:07:38 +0100 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-11-29 23:17:13 +0100 |
commit | fa7f690178d2f74db168a23064a688fe421cb1e6 (patch) | |
tree | a2998113727266d57e77c0a6ec83aba355c62edc /src/corelib/kernel/qmetatype.cpp | |
parent | 8dca04f47f528fbcf9d6b6b34d8c4a81dc347941 (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.cpp | 20 |
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); |