Merge pull request #7929 from zzmp/fix/script-downloaded-shutdown

fix crash on shutdown from scriptDownloaded callback
This commit is contained in:
Brad Hefta-Gaub 2016-05-20 09:31:04 -07:00
commit 8760cd0807
2 changed files with 26 additions and 19 deletions

View file

@ -9,6 +9,8 @@
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
// //
#include "ScriptCache.h"
#include <QCoreApplication> #include <QCoreApplication>
#include <QEventLoop> #include <QEventLoop>
#include <QNetworkAccessManager> #include <QNetworkAccessManager>
@ -20,7 +22,7 @@
#include <assert.h> #include <assert.h>
#include <SharedUtil.h> #include <SharedUtil.h>
#include "ScriptCache.h" #include "ScriptEngines.h"
#include "ScriptEngineLogging.h" #include "ScriptEngineLogging.h"
ScriptCache::ScriptCache(QObject* parent) { ScriptCache::ScriptCache(QObject* parent) {
@ -78,22 +80,25 @@ void ScriptCache::scriptDownloaded() {
QList<ScriptUser*> scriptUsers = _scriptUsers.values(url); QList<ScriptUser*> scriptUsers = _scriptUsers.values(url);
_scriptUsers.remove(url); _scriptUsers.remove(url);
if (req->getResult() == ResourceRequest::Success) { if (!DependencyManager::get<ScriptEngines>()->isStopped()) {
auto scriptContents = req->getData(); if (req->getResult() == ResourceRequest::Success) {
_scriptCache[url] = scriptContents; auto scriptContents = req->getData();
lock.unlock(); _scriptCache[url] = scriptContents;
qCDebug(scriptengine) << "Done downloading script at:" << url.toString(); lock.unlock();
qCDebug(scriptengine) << "Done downloading script at:" << url.toString();
foreach(ScriptUser* user, scriptUsers) { foreach(ScriptUser* user, scriptUsers) {
user->scriptContentsAvailable(url, scriptContents); user->scriptContentsAvailable(url, scriptContents);
} }
} else { } else {
lock.unlock(); lock.unlock();
qCWarning(scriptengine) << "Error loading script from URL " << url; qCWarning(scriptengine) << "Error loading script from URL " << url;
foreach(ScriptUser* user, scriptUsers) { foreach(ScriptUser* user, scriptUsers) {
user->errorInLoadingScript(url); user->errorInLoadingScript(url);
}
} }
} }
req->deleteLater(); req->deleteLater();
} }
@ -162,9 +167,11 @@ void ScriptCache::scriptContentAvailable() {
} }
} }
foreach(contentAvailableCallback thisCallback, allCallbacks) {
thisCallback(url.toString(), scriptContent, true, success);
}
req->deleteLater(); req->deleteLater();
}
if (!DependencyManager::get<ScriptEngines>()->isStopped()) {
foreach(contentAvailableCallback thisCallback, allCallbacks) {
thisCallback(url.toString(), scriptContent, true, success);
}
}
}

View file

@ -68,6 +68,7 @@ public:
// Called at shutdown time // Called at shutdown time
void shutdownScripting(); void shutdownScripting();
bool isStopped() const { return _isStopped; }
signals: signals:
void scriptCountChanged(); void scriptCountChanged();
@ -86,7 +87,6 @@ protected:
void onScriptEngineLoaded(const QString& scriptFilename); void onScriptEngineLoaded(const QString& scriptFilename);
void onScriptEngineError(const QString& scriptFilename); void onScriptEngineError(const QString& scriptFilename);
void launchScriptEngine(ScriptEngine* engine); void launchScriptEngine(ScriptEngine* engine);
bool isStopped() const { return _isStopped; }
QReadWriteLock _scriptEnginesHashLock; QReadWriteLock _scriptEnginesHashLock;
QHash<QUrl, ScriptEngine*> _scriptEnginesHash; QHash<QUrl, ScriptEngine*> _scriptEnginesHash;