From fa7f690178d2f74db168a23064a688fe421cb1e6 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C4=99drzej=20Nowacki?= Date: Tue, 29 Nov 2011 10:07:38 +0100 Subject: [PATCH] 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 Reviewed-by: Thiago Macieira Reviewed-by: Rohan McGovern --- src/corelib/kernel/qmetatype.cpp | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/corelib/kernel/qmetatype.cpp b/src/corelib/kernel/qmetatype.cpp index e3a8293..76537c7 100644 --- a/src/corelib/kernel/qmetatype.cpp +++ b/src/corelib/kernel/qmetatype.cpp @@ -1430,10 +1430,12 @@ private: { QMetaType::Constructor ctor = 0; const QVector * 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 * 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); -- 2.7.4