Fix a deadlock in QMetaType.
authorJędrzej Nowacki <jedrzej.nowacki@nokia.com>
Tue, 29 Nov 2011 09:07:38 +0000 (10:07 +0100)
committerQt by Nokia <qt-info@nokia.com>
Tue, 29 Nov 2011 22:17:13 +0000 (23:17 +0100)
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>
src/corelib/kernel/qmetatype.cpp

index e3a8293..76537c7 100644 (file)
@@ -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);