From 9b5a55101d7c519446c1cf3706a235dea81ad4de Mon Sep 17 00:00:00 2001 From: Alan Alpert Date: Thu, 24 Jan 2013 14:07:29 -0800 Subject: Add qmlClearRegisteredTypes Function Registered types are stored in a global static variable, not on an engine instance. For applications managing multiple engines over their lifetime, there needs to be a way to clear the existing types so they can register new ones and avoid memory leaks. Task-Number: QTBUG-28572 Change-Id: Ic70a4dd1e29d99399b21fb42eaf10d4a52bf2adf Reviewed-by: Christopher Adams --- src/qml/qml/qqmlmetatype.cpp | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'src/qml/qml/qqmlmetatype.cpp') diff --git a/src/qml/qml/qqmlmetatype.cpp b/src/qml/qml/qqmlmetatype.cpp index 0f3a27aeff..b29df4d252 100644 --- a/src/qml/qml/qqmlmetatype.cpp +++ b/src/qml/qml/qqmlmetatype.cpp @@ -46,6 +46,7 @@ #include #include #include +#include #include #include @@ -1068,6 +1069,29 @@ QQmlType *QQmlTypeModuleVersion::type(const QHashedV8String &name) const else return 0; } +void qmlClearTypeRegistrations() // Declared in qqml.h +{ + //Only cleans global static, assumed no running engine + QWriteLocker lock(metaTypeDataLock()); + QQmlMetaTypeData *data = metaTypeData(); + + for (int i = 0; i < data->types.count(); ++i) + delete data->types.at(i); + + QQmlMetaTypeData::TypeModules::const_iterator i = data->uriToModule.constBegin(); + for (; i != data->uriToModule.constEnd(); ++i) + delete *i; + + data->types.clear(); + data->idToType.clear(); + data->nameToType.clear(); + data->urlToType.clear(); + data->metaObjectToType.clear(); + data->uriToModule.clear(); + + QQmlEnginePrivate::baseModulesUninitialized = true; //So the engine re-registers its types + qmlClearEnginePlugins(); +} int registerAutoParentFunction(QQmlPrivate::RegisterAutoParent &autoparent) { -- cgit v1.2.3