From 8754d522f342e3c2fe5138027e11fb906ef9dbe1 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Tue, 30 Aug 2016 14:48:04 -0700 Subject: [PATCH 1/4] Fix incorrect fence delete --- libraries/gpu-gl/src/gpu/gl/GLTextureTransfer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/gpu-gl/src/gpu/gl/GLTextureTransfer.cpp b/libraries/gpu-gl/src/gpu/gl/GLTextureTransfer.cpp index 9b933cfb90..1d22ae7a52 100644 --- a/libraries/gpu-gl/src/gpu/gl/GLTextureTransfer.cpp +++ b/libraries/gpu-gl/src/gpu/gl/GLTextureTransfer.cpp @@ -104,7 +104,7 @@ bool GLTextureTransferHelper::processQueueItems(const Queue& messages) { QThread::usleep(1); result = glClientWaitSync(fence, 0, 0); } - glDeleteSync(package.fence); + glDeleteSync(fence); } object->_contentStamp = texturePointer->getDataStamp(); From aeaae4ccc820a720efaf2f8c9706a58038419383 Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Fri, 23 Sep 2016 14:27:47 -0700 Subject: [PATCH 2/4] reload qml with scripts --- libraries/gl/src/gl/OffscreenQmlSurface.cpp | 4 ++++ libraries/gl/src/gl/OffscreenQmlSurface.h | 2 ++ libraries/script-engine/CMakeLists.txt | 2 ++ libraries/script-engine/src/ScriptEngines.cpp | 20 ++++++++----------- 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/libraries/gl/src/gl/OffscreenQmlSurface.cpp b/libraries/gl/src/gl/OffscreenQmlSurface.cpp index 6a16256198..bdfa359b8b 100644 --- a/libraries/gl/src/gl/OffscreenQmlSurface.cpp +++ b/libraries/gl/src/gl/OffscreenQmlSurface.cpp @@ -545,6 +545,10 @@ QObject* OffscreenQmlSurface::load(const QUrl& qmlSource, std::functionengine()->clearComponentCache(); +} + void OffscreenQmlSurface::requestUpdate() { _polish = true; _render = true; diff --git a/libraries/gl/src/gl/OffscreenQmlSurface.h b/libraries/gl/src/gl/OffscreenQmlSurface.h index a4a5ecba7e..a9a77f2941 100644 --- a/libraries/gl/src/gl/OffscreenQmlSurface.h +++ b/libraries/gl/src/gl/OffscreenQmlSurface.h @@ -40,10 +40,12 @@ public: virtual void create(QOpenGLContext* context); void resize(const QSize& size, bool forceResize = false); QSize size() const; + Q_INVOKABLE QObject* load(const QUrl& qmlSource, std::function f = [](QQmlContext*, QObject*) {}); Q_INVOKABLE QObject* load(const QString& qmlSourceFile, std::function f = [](QQmlContext*, QObject*) {}) { return load(QUrl(qmlSourceFile), f); } + void clearCache(); Q_INVOKABLE void executeOnUiThread(std::function function, bool blocking = false); Q_INVOKABLE QVariant returnFromUiThread(std::function function); diff --git a/libraries/script-engine/CMakeLists.txt b/libraries/script-engine/CMakeLists.txt index 8626a98161..b0dbbc111b 100644 --- a/libraries/script-engine/CMakeLists.txt +++ b/libraries/script-engine/CMakeLists.txt @@ -17,3 +17,5 @@ if (NOT ANDROID) endif () link_hifi_libraries(shared networking octree gpu ui procedural model model-networking recording avatars fbx entities controllers animation audio physics) +# ui includes gl, but link_hifi_libraries does not use transitive includes, so gl must be explicit +include_hifi_library_headers(gl) \ No newline at end of file diff --git a/libraries/script-engine/src/ScriptEngines.cpp b/libraries/script-engine/src/ScriptEngines.cpp index beddc21787..cb6291a8dc 100644 --- a/libraries/script-engine/src/ScriptEngines.cpp +++ b/libraries/script-engine/src/ScriptEngines.cpp @@ -16,6 +16,8 @@ #include #include +#include + #include "ScriptEngine.h" #include "ScriptEngineLogging.h" @@ -367,28 +369,21 @@ QStringList ScriptEngines::getRunningScripts() { void ScriptEngines::stopAllScripts(bool restart) { QReadLocker lock(&_scriptEnginesHashLock); - if (restart) { - // Delete all running scripts from cache so that they are re-downloaded when they are restarted - auto scriptCache = DependencyManager::get(); - for (QHash::const_iterator it = _scriptEnginesHash.constBegin(); - it != _scriptEnginesHash.constEnd(); it++) { - if (!it.value()->isFinished()) { - scriptCache->deleteScript(it.key()); - } - } - } - - // Stop and possibly restart all currently running scripts for (QHash::const_iterator it = _scriptEnginesHash.constBegin(); it != _scriptEnginesHash.constEnd(); it++) { + // skip already stopped scripts if (it.value()->isFinished() || it.value()->isStopping()) { continue; } + + // queue user scripts if restarting if (restart && it.value()->isUserLoaded()) { connect(it.value(), &ScriptEngine::finished, this, [this](QString scriptName, ScriptEngine* engine) { reloadScript(scriptName); }); } + + // stop all scripts it.value()->stop(true); qCDebug(scriptengine) << "stopping script..." << it.key(); } @@ -431,6 +426,7 @@ void ScriptEngines::setScriptsLocation(const QString& scriptsLocation) { void ScriptEngines::reloadAllScripts() { DependencyManager::get()->clearCache(); + DependencyManager::get()->clearCache(); emit scriptsReloading(); stopAllScripts(true); } From cb4d526dcfdbe053330766945fb4f68d6ff1c16a Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 23 Sep 2016 20:17:09 -0700 Subject: [PATCH 3/4] Ask if user want to update home content when available --- server-console/src/main.js | 185 ++++++++++++++++++++++++++----------- 1 file changed, 131 insertions(+), 54 deletions(-) diff --git a/server-console/src/main.js b/server-console/src/main.js index c47308aed6..358422dff1 100644 --- a/server-console/src/main.js +++ b/server-console/src/main.js @@ -486,6 +486,76 @@ function updateTrayMenu(serverState) { const httpStatusPort = 60332; +function deleteResourceDirectories() { + const dsResourceDirectory = getDomainServerClientResourcesDirectory(); + try { + fs.removeSync(dsResourceDirectory); + console.log("Deleted directory " + dsResourceDirectory); + } catch (e) { + console.log(e); + } + const acResourceDirectory = getAssignmentClientResourcesDirectory(); + try { + fs.removeSync(acResourceDirectory); + console.log("Deleted directory " + acResourceDirectory); + } catch (e) { + console.log(e); + } +} + +function deleteResourceDirectoriesAndRestart() { + homeServer.stop(); + deleteResourceDirectories(); + maybeInstallDefaultContentSet(onContentLoaded); +} + +function checkNewContent() { + // Start downloading content set + var req = request.head({ + url: "http://cachefly.highfidelity.com/home.tgz" + }, function (error, response, body) { + if (error === null) { + var localContent = Date.parse(userConfig.get('homeContentLastModified')); + var remoteContent = Date.parse(response.headers['last-modified']); + + var shouldUpdate = isNaN(localContent) || (!isNaN(remoteContent) && (remoteContent > localContent)); + + var wantDebug = false; + if (wantDebug) { + console.log('Last Modified: ' + response.headers['last-modified']); + console.log(localContent + " " + remoteContent + " " + shouldUpdate + " " + new Date()); + console.log("Remote content is " + (shouldUpdate ? "newer" : "older") + " that local content."); + } + + if (shouldUpdate) { + dialog.showMessageBox({ + type: 'question', + buttons: ['Yes', 'No'], + title: 'New home content', + message: 'A newer version of the home content set is available.\nDo you wish to update?' + }, function(idx) { + if (idx === 0) { + dialog.showMessageBox({ + type: 'question', + buttons: ['Yes', 'No'], + title: 'Are you sure?', + message: 'This action will delete your current sandbox content.\nDo you wish to continue?' + }, function(idx) { + if (idx === 0 && homeServer) { + deleteResourceDirectoriesAndRestart(); + } + }); + } else { + // They don't want to update, mark content set as current + userConfig.set('homeContentLastModified', new Date()); + } + }); + } + } + }); +} + + function maybeInstallDefaultContentSet(onComplete) { // Check for existing data const acResourceDirectory = getAssignmentClientResourcesDirectory(); @@ -517,6 +587,8 @@ function maybeInstallDefaultContentSet(onComplete) { if (userHasExistingACData || userHasExistingDSData) { console.log("User has existing data, suppressing downloader"); onComplete(); + + checkNewContent(); return; } @@ -528,6 +600,7 @@ function maybeInstallDefaultContentSet(onComplete) { return console.error(err) } console.log('Copied home content over to: ' + getRootHifiDataDirectory()); + userConfig.set('homeContentLastModified', new Date()); onComplete(); }); return; @@ -607,6 +680,7 @@ function maybeInstallDefaultContentSet(onComplete) { req.pipe(gunzip).pipe(tar.extract(getRootHifiDataDirectory())).on('error', extractError).on('finish', function(){ // response and decompression complete, return console.log("Finished unarchiving home content set"); + userConfig.set('homeContentLastModified', new Date()); sendStateUpdate('complete'); }); @@ -663,6 +737,62 @@ for (var key in trayIcons) { const notificationIcon = path.join(__dirname, '../resources/console-notification.png'); +function onContentLoaded() { + maybeShowSplash(); + + if (buildInfo.releaseType == 'PRODUCTION') { + var currentVersion = null; + try { + currentVersion = parseInt(buildInfo.buildIdentifier); + } catch (e) { + } + + if (currentVersion !== null) { + const CHECK_FOR_UPDATES_INTERVAL_SECONDS = 60 * 30; + var hasShownUpdateNotification = false; + const updateChecker = new updater.UpdateChecker(currentVersion, CHECK_FOR_UPDATES_INTERVAL_SECONDS); + updateChecker.on('update-available', function(latestVersion, url) { + if (!hasShownUpdateNotification) { + notifier.notify({ + icon: notificationIcon, + title: 'An update is available!', + message: 'High Fidelity version ' + latestVersion + ' is available', + wait: true, + url: url + }); + hasShownUpdateNotification = true; + } + }); + notifier.on('click', function(notifierObject, options) { + console.log("Got click", options.url); + shell.openExternal(options.url); + }); + } + } + + deleteOldFiles(logPath, DELETE_LOG_FILES_OLDER_THAN_X_SECONDS, LOG_FILE_REGEX); + + if (dsPath && acPath) { + domainServer = new Process('domain-server', dsPath, ["--get-temp-name"], logPath); + acMonitor = new ACMonitorProcess('ac-monitor', acPath, ['-n6', + '--log-directory', logPath, + '--http-status-port', httpStatusPort], httpStatusPort, logPath); + homeServer = new ProcessGroup('home', [domainServer, acMonitor]); + logWindow = new LogWindow(acMonitor, domainServer); + + var processes = { + home: homeServer + }; + + // handle process updates + homeServer.on('state-update', function(processGroup) { updateTrayMenu(processGroup.state); }); + + // start the home server + homeServer.start(); + } +} + + // This method will be called when Electron has finished // initialization and is ready to create browser windows. app.on('ready', function() { @@ -682,58 +812,5 @@ app.on('ready', function() { updateTrayMenu(ProcessGroupStates.STOPPED); - maybeInstallDefaultContentSet(function() { - maybeShowSplash(); - - if (buildInfo.releaseType == 'PRODUCTION') { - var currentVersion = null; - try { - currentVersion = parseInt(buildInfo.buildIdentifier); - } catch (e) { - } - - if (currentVersion !== null) { - const CHECK_FOR_UPDATES_INTERVAL_SECONDS = 60 * 30; - var hasShownUpdateNotification = false; - const updateChecker = new updater.UpdateChecker(currentVersion, CHECK_FOR_UPDATES_INTERVAL_SECONDS); - updateChecker.on('update-available', function(latestVersion, url) { - if (!hasShownUpdateNotification) { - notifier.notify({ - icon: notificationIcon, - title: 'An update is available!', - message: 'High Fidelity version ' + latestVersion + ' is available', - wait: true, - url: url - }); - hasShownUpdateNotification = true; - } - }); - notifier.on('click', function(notifierObject, options) { - console.log("Got click", options.url); - shell.openExternal(options.url); - }); - } - } - - deleteOldFiles(logPath, DELETE_LOG_FILES_OLDER_THAN_X_SECONDS, LOG_FILE_REGEX); - - if (dsPath && acPath) { - domainServer = new Process('domain-server', dsPath, ["--get-temp-name"], logPath); - acMonitor = new ACMonitorProcess('ac-monitor', acPath, ['-n6', - '--log-directory', logPath, - '--http-status-port', httpStatusPort], httpStatusPort, logPath); - homeServer = new ProcessGroup('home', [domainServer, acMonitor]); - logWindow = new LogWindow(acMonitor, domainServer); - - var processes = { - home: homeServer - }; - - // handle process updates - homeServer.on('state-update', function(processGroup) { updateTrayMenu(processGroup.state); }); - - // start the home server - homeServer.start(); - } - }); + maybeInstallDefaultContentSet(onContentLoaded); }); From f001cf7570150cac91467de64493d885484325c6 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 26 Sep 2016 10:44:59 -0700 Subject: [PATCH 4/4] Make constant for home content URL --- server-console/src/main.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/server-console/src/main.js b/server-console/src/main.js index 358422dff1..82fe6b6b4d 100644 --- a/server-console/src/main.js +++ b/server-console/src/main.js @@ -42,6 +42,8 @@ const appIcon = path.join(__dirname, '../resources/console.png'); const DELETE_LOG_FILES_OLDER_THAN_X_SECONDS = 60 * 60 * 24 * 7; // 7 Days const LOG_FILE_REGEX = /(domain-server|ac-monitor|ac)-.*-std(out|err).txt/; +const HOME_CONTENT_URL = "http://cachefly.highfidelity.com/home.tgz"; + function getBuildInfo() { var buildInfoPath = null; @@ -512,7 +514,7 @@ function deleteResourceDirectoriesAndRestart() { function checkNewContent() { // Start downloading content set var req = request.head({ - url: "http://cachefly.highfidelity.com/home.tgz" + url: HOME_CONTENT_URL }, function (error, response, body) { if (error === null) { var localContent = Date.parse(userConfig.get('homeContentLastModified')); @@ -639,7 +641,7 @@ function maybeInstallDefaultContentSet(onComplete) { // Start downloading content set var req = progress(request.get({ - url: "http://cachefly.highfidelity.com/home.tgz" + url: HOME_CONTENT_URL }, function(error, responseMessage, responseData) { if (aborted) { return;