History

Fix most of the crash causes on script engine reload/shutdown

Karol Suprynowicz committed 3 years ago

Commit 166f7221 parent d62a40d25 files · +221 −83Browse files

Showing the changes to libraries/script-engine/src/ScriptManager.cpp (1 of 25 files). Show all

Unified · Split

libraries/script-engine/src/ScriptManager.cpp+24−6
@@ -67,6 +67,7 @@ · 66 unmodified lines
6767 #include <AddressManager.h>
6868 #include <NetworkingConstants.h>
6969 #include <ThreadHelpers.h>
70+#include <iostream>
7071
7172 const QString ScriptManager::_SETTINGS_ENABLE_EXTENDED_EXCEPTIONS {
7273 "com.highfidelity.experimental.enableExtendedJSExceptions"
@@ -366,7 +367,12 @@ bool ScriptManager::isDebugMode() const { · 293 unmodified lines
366367 #endif
367368 }
368369
369−ScriptManager::~ScriptManager() {}
370+ScriptManager::~ScriptManager() {
371+ qDebug() << "ScriptManager::~ScriptManager() : Script manager deleted, type: " << _type << " name: " << _fileNameString;
372+ if (_type == ScriptManager::Type::ENTITY_CLIENT) {
373+ printf("ScriptManager::~ScriptManager");
374+ }
375+}
370376
371377 void ScriptManager::disconnectNonEssentialSignals() {
372378 disconnect();
@@ -464,11 +470,14 @@ void ScriptManager::waitTillDoneRunning(bool shutdown) { · 91 unmodified lines
464470 }
465471 #else
466472 auto startedWaiting = usecTimestampNow();
467− while (workerThread->isRunning()) {
473+ while (!_isDoneRunning) {
468474 // If the final evaluation takes too long, then tell the script engine to stop running
469475 auto elapsedUsecs = usecTimestampNow() - startedWaiting;
476+ // TODO: This part was very unsafe and was causing crashes all the time.
477+ // I disabled it for now until we find a safer solution.
478+ // With it disabled now we get clean shutdowns and restarts.
470479 // V8TODO: temporarily increased script timeout. Maybe use different timeouts for release and unoptimized debug?
471− static const auto MAX_SCRIPT_EVALUATION_TIME = USECS_PER_SECOND;
480+ /*static const auto MAX_SCRIPT_EVALUATION_TIME = 10 * USECS_PER_SECOND;
472481 if (elapsedUsecs > MAX_SCRIPT_EVALUATION_TIME) {
473482 workerThread->quit();
474483
@@ -485,12 +494,12 @@ void ScriptManager::waitTillDoneRunning(bool shutdown) { · 10 unmodified lines
485494
486495 // Wait for the scripting thread to stop running, as
487496 // flooding it with aborts/exceptions will persist it longer
488− static const auto MAX_SCRIPT_QUITTING_TIME = 0.5 * MSECS_PER_SECOND;
497+ static const auto MAX_SCRIPT_QUITTING_TIME = 50 * MSECS_PER_SECOND;
489498 if (!workerThread->wait(MAX_SCRIPT_QUITTING_TIME)) {
490499 Q_ASSERT(false);
491500 workerThread->terminate();
492501 }
493− }
502+ }*/
494503
495504 if (shutdown) {
496505 // NOTE: This will be called on the main application thread (among other threads) from stopAllScripts.
@@ -502,7 +511,7 @@ void ScriptManager::waitTillDoneRunning(bool shutdown) { · 5 unmodified lines
502511 }
503512
504513 // Avoid a pure busy wait
505− QThread::yieldCurrentThread();
514+ QThread::msleep(1);
506515 }
507516 #endif
508517
@@ -985,6 +994,7 @@ void ScriptManager::run() { · 476 unmodified lines
985994
986995 PROFILE_RANGE(script, "ScriptMainLoop");
987996
997+//#define SCRIPT_DELAY_DEBUG
988998 #ifdef SCRIPT_DELAY_DEBUG
989999 {
9901000 auto actuallySleptUntil = clock::now();
@@ -1064,6 +1074,13 @@ void ScriptManager::run() { · 73 unmodified lines
10641074 _isRunning = false;
10651075 emit runningStateChanged();
10661076 emit doneRunning();
1077+ _engine->disconnectSignalProxies();
1078+ // Process all remaining events
1079+ {
1080+ QEventLoop loop;
1081+ loop.processEvents();
1082+ }
1083+ _isDoneRunning = true;
10671084 }
10681085
10691086 // NOTE: This is private because it must be called on the same thread that created the timers, which is why
@@ -1121,6 +1138,7 @@ void ScriptManager::timerFired() { · 51 unmodified lines
11211138 return; // bail early
11221139 }
11231140
1141+//#define SCRIPT_TIMER_PERFORMANCE_STATISTICS
11241142 #ifdef SCRIPT_TIMER_PERFORMANCE_STATISTICS
11251143 _timerCallCounter++;
11261144 if (_timerCallCounter % 100 == 0) {