summaryrefslogtreecommitdiff
path: root/src/plugins/qmldesigner/designercore/metainfo/nodehints.cpp
diff options
context:
space:
mode:
authorTim Jenssen <tim.jenssen@qt.io>2017-01-26 12:07:14 +0100
committerThomas Hartmann <thomas.hartmann@qt.io>2017-01-27 09:35:02 +0000
commitd46857c2ec05b9f86219a1e4b11b67b385a2e34b (patch)
treefc5175b50cde079118efa9a58ee84470ead2fb9a /src/plugins/qmldesigner/designercore/metainfo/nodehints.cpp
parent1ce6cfd809e931c919a7090142e4cc10e0a7dd39 (diff)
downloadqt-creator-d46857c2ec05b9f86219a1e4b11b67b385a2e34b.tar.gz
QmlDesigner: Clean singleton implementation
this new implementation is thread safe and does not leak. Change-Id: Ia37be10eea9cb36154bf5884e94935ac5ea2665e Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
Diffstat (limited to 'src/plugins/qmldesigner/designercore/metainfo/nodehints.cpp')
-rw-r--r--src/plugins/qmldesigner/designercore/metainfo/nodehints.cpp15
1 files changed, 9 insertions, 6 deletions
diff --git a/src/plugins/qmldesigner/designercore/metainfo/nodehints.cpp b/src/plugins/qmldesigner/designercore/metainfo/nodehints.cpp
index 94fa949581..af54f08b1f 100644
--- a/src/plugins/qmldesigner/designercore/metainfo/nodehints.cpp
+++ b/src/plugins/qmldesigner/designercore/metainfo/nodehints.cpp
@@ -46,22 +46,25 @@
#include <QJSEngine>
-namespace QmlDesigner {
+#include <memory>
+#include <mutex>
+namespace QmlDesigner {
namespace Internal {
-static QJSEngine *s_qJSEngine = nullptr;
+static std::once_flag s_singletonFlag;
+static std::unique_ptr<QJSEngine> s_qJSEngine;
static JSObject *s_jsObject = nullptr;
static QVariant evaluateExpression(const QString &expression, const ModelNode &modelNode, const ModelNode &otherNode)
{
- if (!s_qJSEngine) {
- s_qJSEngine = new QJSEngine;
- s_jsObject = new JSObject(s_qJSEngine);
+ std::call_once(s_singletonFlag, []() {
+ s_qJSEngine.reset(new QJSEngine);
+ s_jsObject = new JSObject(s_qJSEngine.get());
QJSValue jsValue = s_qJSEngine->newQObject(s_jsObject);
s_qJSEngine->globalObject().setProperty("model", jsValue);
- }
+ });
s_jsObject->setModelNode(modelNode);
s_jsObject->setOtherNode(otherNode);