diff options
author | Simon Hausmann <simon.hausmann@nokia.com> | 2011-12-13 10:04:40 +0100 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-12-15 12:05:08 +0100 |
commit | a401d0756f6ac3cee5597d5528515061326c3bfa (patch) | |
tree | 4c5b5ec54d856dc188da54bc8faf0d9de37c9ee7 /src/declarative/qml/v8/qv8engine_p.h | |
parent | 4bb5b4f01c1b38fce9f1a11346de5bd4ee3c6fd4 (diff) |
Fix that QJSEngine cannot be used from threads other than the gui thread
Implicitly allocate & enter an isolate per thread if needed, store it in TLS and
exit it upon thread destruction. As the code that represents QObject
dependencies in the GC through implicit dependencies uses its own context,
its per-thread data is folded into the v8engine TLS to ensure that it is
destructed before the isolate is exited.
Task-number: QTBUG-23099
Change-Id: I86538b54939b2fe64db843052eac04c7fd31813e
Reviewed-by: Aaron Kennedy <aaron.kennedy@nokia.com>
Diffstat (limited to 'src/declarative/qml/v8/qv8engine_p.h')
-rw-r--r-- | src/declarative/qml/v8/qv8engine_p.h | 29 |
1 files changed, 14 insertions, 15 deletions
diff --git a/src/declarative/qml/v8/qv8engine_p.h b/src/declarative/qml/v8/qv8engine_p.h index 7df4c523c0..4e6d3de91f 100644 --- a/src/declarative/qml/v8/qv8engine_p.h +++ b/src/declarative/qml/v8/qv8engine_p.h @@ -230,7 +230,6 @@ private: public: static void garbageCollectorPrologueCallback(v8::GCType, v8::GCCallbackFlags); static void registerGcPrologueCallback(); - static void releaseWorkerThreadGcPrologueCallbackData(); class Q_AUTOTEST_EXPORT Referencer { public: @@ -243,7 +242,7 @@ public: static v8::Persistent<v8::Object> *findOwnerAndStrength(QObject *qobjectOwner, bool *shouldBeStrong); v8::Persistent<v8::Object> strongReferencer; v8::Persistent<v8::Context> context; - friend class QV8GCCallback::ThreadData; + friend class QV8GCCallback; }; class Q_AUTOTEST_EXPORT Node { @@ -257,19 +256,6 @@ public: }; static void addGcCallbackNode(Node *node); - -private: - class ThreadData { - public: - ThreadData() : gcPrologueCallbackRegistered(false) { } - ~ThreadData(); - Referencer referencer; - bool gcPrologueCallbackRegistered; - QIntrusiveList<Node, &Node::node> gcCallbackNodes; - }; - - static void initializeThreadData(); - static QThreadStorage<ThreadData *> threadData; }; class Q_DECLARATIVE_EXPORT QV8Engine @@ -465,6 +451,19 @@ public: static QDateTime qtDateTimeFromJsDate(double jsDate); + struct ThreadData { + ThreadData(); + ~ThreadData(); + v8::Isolate* isolate; + QV8GCCallback::Referencer* referencer; + bool gcPrologueCallbackRegistered; + QIntrusiveList<QV8GCCallback::Node, &QV8GCCallback::Node::node> gcCallbackNodes; + }; + + static bool hasThreadData(); + static ThreadData* threadData(); + static void ensurePerThreadIsolate(); + protected: QJSEngine* q; QDeclarativeEngine *m_engine; |