From 887ebd5365c4323e34cae348a10582a67068fafd Mon Sep 17 00:00:00 2001 From: ksuprynowicz Date: Sun, 26 Feb 2023 13:55:22 +0100 Subject: [PATCH] Removed deadlock in signal proxy disconnect again --- .../script-engine/src/v8/ScriptEngineV8.cpp | 3 ++- .../script-engine/src/v8/ScriptEngineV8.h | 6 ++++-- .../src/v8/ScriptObjectV8Proxy.cpp | 18 ++++++++++-------- .../system/controllers/controllerDispatcher.js | 4 ++-- 4 files changed, 18 insertions(+), 13 deletions(-) diff --git a/libraries/script-engine/src/v8/ScriptEngineV8.cpp b/libraries/script-engine/src/v8/ScriptEngineV8.cpp index 534cd754e6..94592d3997 100644 --- a/libraries/script-engine/src/v8/ScriptEngineV8.cpp +++ b/libraries/script-engine/src/v8/ScriptEngineV8.cpp @@ -408,7 +408,8 @@ ScriptEngineV8::ScriptEngineV8(ScriptManager* scriptManager) : // --jitless - might improve debugging performance due to no JIT? // --assert-types - v8::V8::SetFlagsFromString("--stack-size=256 --verify-heap"); + v8::V8::InitializeICU(); + v8::V8::SetFlagsFromString("--stack-size=256 --verify-heap --assert-types"); //v8::V8::SetFlagsFromString("--stack-size=256 --single-threaded"); v8::Platform* platform = getV8Platform(); v8::V8::InitializePlatform(platform); diff --git a/libraries/script-engine/src/v8/ScriptEngineV8.h b/libraries/script-engine/src/v8/ScriptEngineV8.h index 98138b5555..9d134b5abd 100644 --- a/libraries/script-engine/src/v8/ScriptEngineV8.h +++ b/libraries/script-engine/src/v8/ScriptEngineV8.h @@ -136,7 +136,7 @@ public: // ScriptEngine implementation QString scriptValueDebugDetailsV8(const V8ScriptValue &value); virtual QString scriptValueDebugListMembers(const ScriptValue &value) override; QString scriptValueDebugListMembersV8(const V8ScriptValue &v8Value); - virtual void logBacktrace(const QString &title) override; + virtual void logBacktrace(const QString &title = QString("")) override; // helper to detect and log warnings when other code invokes QScriptEngine/BaseScriptEngine in thread-unsafe ways inline bool IS_THREADSAFE_INVOCATION(const QString& method) { return ScriptEngine::IS_THREADSAFE_INVOCATION(method); } @@ -185,7 +185,9 @@ public: // not for public use, but I don't like how Qt strings this along with p bool convertJSObjectToVariant(v8::Local object, QVariant &dest); V8ScriptValue castVariantToValue(const QVariant& val); QString valueType(const V8ScriptValue& val); - v8::Isolate* getIsolate() {return _v8Isolate;} + v8::Isolate* getIsolate() { + Q_ASSERT(_v8Isolate != nullptr); + return _v8Isolate;} v8::Local getContext(); const v8::Local getConstContext() const; QString formatErrorMessageFromTryCatch(v8::TryCatch &tryCatch); diff --git a/libraries/script-engine/src/v8/ScriptObjectV8Proxy.cpp b/libraries/script-engine/src/v8/ScriptObjectV8Proxy.cpp index 58708be9c6..c2df964dab 100644 --- a/libraries/script-engine/src/v8/ScriptObjectV8Proxy.cpp +++ b/libraries/script-engine/src/v8/ScriptObjectV8Proxy.cpp @@ -1186,14 +1186,15 @@ int ScriptSignalV8Proxy::qt_metacall(QMetaObject::Call call, int id, void** argu args[arg] = _engine->castVariantToValue(argValue).get(); }*/ - /*QList connections; + QList connections; withReadLock([&]{ connections = _connections; - });*/ + }); // V8TODO: this may cause deadlocks on connect/disconnect, so the connect/disconnect procedure needs to be reworked. // It should probably add events to a separate list that would be processed before and after all the events for the signal. - withReadLock([&]{ + //withReadLock([&]{ + { // V8TODO: check all other lambda functions to make sure they have handle scope - could they cause crashes otherwise? v8::HandleScope handleScope(isolate); // V8TODO: should we use function creation context, or context in which connect happened? @@ -1201,14 +1202,14 @@ int ScriptSignalV8Proxy::qt_metacall(QMetaObject::Call call, int id, void** argu v8::Context::Scope contextScope(context); v8::Local args[Q_METAMETHOD_INVOKE_MAX_ARGS]; int numArgs = _meta.parameterCount(); - //for (ConnectionList::iterator iter = connections.begin(); iter != connections.end(); ++iter) { for (int arg = 0; arg < numArgs; ++arg) { int methodArgTypeId = _meta.parameterType(arg); Q_ASSERT(methodArgTypeId != QMetaType::UnknownType); - QVariant argValue(methodArgTypeId, arguments[arg+1]); + QVariant argValue(methodArgTypeId, arguments[arg + 1]); args[arg] = _engine->castVariantToValue(argValue).get(); } - for (ConnectionList::iterator iter = _connections.begin(); iter != _connections.end(); ++iter) { + //for (ConnectionList::iterator iter = _connections.begin(); iter != _connections.end(); ++iter) { + for (ConnectionList::iterator iter = connections.begin(); iter != connections.end(); ++iter) { Connection& conn = *iter; { /*if (!conn.callback.get()->IsFunction()) { @@ -1228,7 +1229,7 @@ int ScriptSignalV8Proxy::qt_metacall(QMetaObject::Call call, int id, void** argu Q_ASSERT(!conn.callback.get().IsEmpty()); Q_ASSERT(!conn.callback.get()->IsUndefined()); - if(conn.callback.get()->IsNull()) { + if (conn.callback.get()->IsNull()) { qDebug() << "ScriptSignalV8Proxy::qt_metacall: Connection callback is Null"; _engine->popContext(); continue; @@ -1258,7 +1259,8 @@ int ScriptSignalV8Proxy::qt_metacall(QMetaObject::Call call, int id, void** argu //_engine->popContext(); } } - }); + } + //}); _totalCallTime_s += callTimer.elapsed() / 1000.0; diff --git a/scripts/system/controllers/controllerDispatcher.js b/scripts/system/controllers/controllerDispatcher.js index 99dbf7e77e..611a480803 100644 --- a/scripts/system/controllers/controllerDispatcher.js +++ b/scripts/system/controllers/controllerDispatcher.js @@ -259,7 +259,7 @@ Script.include("/~/system/libraries/controllerDispatcherUtils.js"); // find 3d overlays near each hand var nearbyOverlayIDs = []; var h; - for (h = LEFT_HAND; h <= RIGHT_HAND; h++) { + /*for (h = LEFT_HAND; h <= RIGHT_HAND; h++) { if (controllerLocations[h].valid) { var nearbyOverlays = Overlays.findOverlays(controllerLocations[h].position, NEAR_MAX_RADIUS * sensorScaleFactor); @@ -293,7 +293,7 @@ Script.include("/~/system/libraries/controllerDispatcherUtils.js"); } else { nearbyOverlayIDs.push([]); } - } + }*/ // find entities near each hand var nearbyEntityProperties = [[], []];