Dispose of WorkerScripts in correct Isolate
authorAaron Kennedy <aaron.kennedy@nokia.com>
Tue, 7 Jun 2011 06:34:04 +0000 (16:34 +1000)
committerAaron Kennedy <aaron.kennedy@nokia.com>
Tue, 7 Jun 2011 07:00:11 +0000 (17:00 +1000)
We were disposing them in the main thread isolate which caused
corruption of the v8 heap.  Specifically this showed in asserting
allocations of persistent handles.

src/declarative/qml/qdeclarativeworkerscript.cpp
tests/auto/declarative/qdeclarativeworkerscript/data/stressDispose.js [new file with mode: 0644]
tests/auto/declarative/qdeclarativeworkerscript/data/stressDispose.qml [new file with mode: 0644]
tests/auto/declarative/qdeclarativeworkerscript/tst_qdeclarativeworkerscript.cpp

index ad3ca58..fd2b924 100644 (file)
@@ -477,8 +477,6 @@ QDeclarativeWorkerScriptEngine::QDeclarativeWorkerScriptEngine(QDeclarativeEngin
 QDeclarativeWorkerScriptEngine::~QDeclarativeWorkerScriptEngine()
 {
     d->m_lock.lock();
-    qDeleteAll(d->workers);
-    d->workers.clear();
     QCoreApplication::postEvent(d, new QEvent((QEvent::Type)QDeclarativeWorkerScriptEnginePrivate::WorkerDestroyEvent));
     d->m_lock.unlock();
 
@@ -530,7 +528,7 @@ void QDeclarativeWorkerScriptEngine::run()
 {
     d->m_lock.lock();
 
-    v8::Isolate *isolate = v8::Isolate::New();
+    v8::Isolate *isolate = v8::Isolate::New(); 
     isolate->Enter();
 
     d->workerEngine = new QDeclarativeWorkerScriptEnginePrivate::WorkerEngine(d);
@@ -542,6 +540,9 @@ void QDeclarativeWorkerScriptEngine::run()
 
     exec();
 
+    qDeleteAll(d->workers);
+    d->workers.clear();
+
     delete d->workerEngine; d->workerEngine = 0;
 
     isolate->Exit();
diff --git a/tests/auto/declarative/qdeclarativeworkerscript/data/stressDispose.js b/tests/auto/declarative/qdeclarativeworkerscript/data/stressDispose.js
new file mode 100644 (file)
index 0000000..5c4c5ec
--- /dev/null
@@ -0,0 +1,6 @@
+WorkerScript.onMessage = function() {
+}
+for (var ii = 0; ii < 100; ++ii) {
+    var a = "HELLO WORLD";
+}
+
diff --git a/tests/auto/declarative/qdeclarativeworkerscript/data/stressDispose.qml b/tests/auto/declarative/qdeclarativeworkerscript/data/stressDispose.qml
new file mode 100644 (file)
index 0000000..d05918a
--- /dev/null
@@ -0,0 +1,13 @@
+import QtQuick 1.0
+
+Item {
+    WorkerScript {
+        id: worker
+        source: "stressDispose.js"
+    }
+
+    Component.onCompleted: {
+        worker.sendMessage(10);
+    }
+}
+
index dd99a18..2c85040 100644 (file)
@@ -80,6 +80,7 @@ private slots:
     void script_included();
     void scriptError_onLoad();
     void scriptError_onCall();
+    void stressDispose();
 
 private:
     void waitForEchoMessage(QDeclarativeWorkerScript *worker) {
@@ -283,6 +284,18 @@ void tst_QDeclarativeWorkerScript::scriptError_onCall()
     delete worker;
 }
 
+// Rapidly create and destroy worker scripts to test resources are being disposed
+// in the correct isolate
+void tst_QDeclarativeWorkerScript::stressDispose()
+{
+    for (int ii = 0; ii < 100; ++ii) {
+        QDeclarativeEngine engine;
+        QDeclarativeComponent component(&engine, SRCDIR "/data/stressDispose.qml");
+        QObject *o = component.create();
+        QVERIFY(o);
+        delete o;
+    }
+}
 
 QTEST_MAIN(tst_QDeclarativeWorkerScript)