From be050b04691329b009fcf917a7fb96ef2cb43e05 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 5 Jan 2015 15:13:07 -0800 Subject: [PATCH 1/6] Added missing deletes --- assignment-client/src/Agent.cpp | 1 + domain-server/src/DomainServer.cpp | 3 +++ interface/src/Application.cpp | 2 +- interface/src/ui/ScriptEditorWidget.cpp | 2 ++ interface/src/ui/SnapshotShareDialog.cpp | 1 + interface/src/ui/overlays/BillboardOverlay.cpp | 1 + interface/src/ui/overlays/ImageOverlay.cpp | 1 + libraries/audio/src/Sound.cpp | 1 + libraries/entities-renderer/src/EntityTreeRenderer.cpp | 1 + libraries/networking/src/DomainHandler.cpp | 1 + libraries/script-engine/src/ScriptEngine.cpp | 3 +++ libraries/script-engine/src/XMLHttpRequestClass.cpp | 2 +- 12 files changed, 17 insertions(+), 2 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index adde541504..ac262de8aa 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -185,6 +185,7 @@ void Agent::run() { loop.exec(); QString scriptContents(reply->readAll()); + delete reply; qDebug() << "Downloaded script:" << scriptContents; diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 3da06a9c0e..a094432af2 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -1736,6 +1736,9 @@ bool DomainServer::handleHTTPSRequest(HTTPSConnection* connection, const QUrl &u connection->respond(HTTPConnection::StatusCode302, QByteArray(), HTTPConnection::DefaultContentType, cookieHeaders); + delete tokenReply; + delete profileReply; + // we've redirected the user back to our homepage return true; diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index c2ce4c9077..fa9a492467 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -4008,7 +4008,7 @@ void Application::parseVersionXml() { QString latestVersion; QUrl downloadUrl; QString releaseNotes("Unavailable"); - QObject* sender = QObject::sender(); + QObject* sender = qobject_cast(QObject::sender()); QXmlStreamReader xml(qobject_cast(sender)); diff --git a/interface/src/ui/ScriptEditorWidget.cpp b/interface/src/ui/ScriptEditorWidget.cpp index f4a509baa6..660b9009b6 100644 --- a/interface/src/ui/ScriptEditorWidget.cpp +++ b/interface/src/ui/ScriptEditorWidget.cpp @@ -158,6 +158,8 @@ void ScriptEditorWidget::loadFile(const QString& scriptPath) { QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit); loop.exec(); _scriptEditorWidgetUI->scriptEdit->setPlainText(reply->readAll()); + delete reply; + if (!saveAs()) { static_cast(this->parent()->parent()->parent())->terminateCurrentTab(); } diff --git a/interface/src/ui/SnapshotShareDialog.cpp b/interface/src/ui/SnapshotShareDialog.cpp index 046aa4d12c..47914e0a12 100644 --- a/interface/src/ui/SnapshotShareDialog.cpp +++ b/interface/src/ui/SnapshotShareDialog.cpp @@ -148,6 +148,7 @@ void SnapshotShareDialog::postRequestFinished() { QNetworkReply* requestReply = reinterpret_cast(sender()); QJsonDocument jsonResponse = QJsonDocument::fromJson(requestReply->readAll()); + requestReply->deleteLater(); const QJsonObject& responseObject = jsonResponse.object(); if (responseObject.contains("id")) { diff --git a/interface/src/ui/overlays/BillboardOverlay.cpp b/interface/src/ui/overlays/BillboardOverlay.cpp index bcb69bdce3..b34416f566 100644 --- a/interface/src/ui/overlays/BillboardOverlay.cpp +++ b/interface/src/ui/overlays/BillboardOverlay.cpp @@ -205,6 +205,7 @@ void BillboardOverlay::replyFinished() { QNetworkReply* reply = static_cast(sender()); _billboard = reply->readAll(); _isLoaded = true; + reply->deleteLater(); } bool BillboardOverlay::findRayIntersection(const glm::vec3& origin, const glm::vec3& direction, diff --git a/interface/src/ui/overlays/ImageOverlay.cpp b/interface/src/ui/overlays/ImageOverlay.cpp index d7a6889c05..1ecfc74e44 100644 --- a/interface/src/ui/overlays/ImageOverlay.cpp +++ b/interface/src/ui/overlays/ImageOverlay.cpp @@ -66,6 +66,7 @@ void ImageOverlay::replyFinished() { _textureImage.loadFromData(rawData); _renderImage = true; _isLoaded = true; + reply->deleteLater(); } void ImageOverlay::render(RenderArgs* args) { diff --git a/libraries/audio/src/Sound.cpp b/libraries/audio/src/Sound.cpp index 2608c333d6..54ff61d66a 100644 --- a/libraries/audio/src/Sound.cpp +++ b/libraries/audio/src/Sound.cpp @@ -80,6 +80,7 @@ void Sound::downloadFinished(QNetworkReply* reply) { } _isReady = true; + reply->deleteLater(); } void Sound::downSample(const QByteArray& rawAudioByteArray) { diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 4f0f1c80a8..47e9237ddc 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -145,6 +145,7 @@ QString EntityTreeRenderer::loadScriptContents(const QString& scriptMaybeURLorTe } else { qDebug() << "ERROR Loading file:" << url.toString(); } + delete reply; } } diff --git a/libraries/networking/src/DomainHandler.cpp b/libraries/networking/src/DomainHandler.cpp index 126ef27414..e4f31e666e 100644 --- a/libraries/networking/src/DomainHandler.cpp +++ b/libraries/networking/src/DomainHandler.cpp @@ -240,6 +240,7 @@ void DomainHandler::settingsRequestFinished() { requestDomainSettings(); } } + settingsReply->deleteLater(); } void DomainHandler::parseDTLSRequirementPacket(const QByteArray& dtlsRequirementPacket) { diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index fc9cdc5430..c1cdcb594a 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -194,6 +194,8 @@ void ScriptEngine::handleScriptDownload() { qDebug() << "ERROR Loading file:" << reply->url().toString(); emit errorLoadingScript(_fileNameString); } + + reply->deleteLater(); } void ScriptEngine::init() { @@ -604,6 +606,7 @@ void ScriptEngine::include(const QString& includeFile) { QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); loop.exec(); includeContents = reply->readAll(); + reply->deleteLater(); } else { #ifdef _WIN32 QString fileName = url.toString(); diff --git a/libraries/script-engine/src/XMLHttpRequestClass.cpp b/libraries/script-engine/src/XMLHttpRequestClass.cpp index dec20dface..a756b3fe8f 100644 --- a/libraries/script-engine/src/XMLHttpRequestClass.cpp +++ b/libraries/script-engine/src/XMLHttpRequestClass.cpp @@ -332,7 +332,7 @@ void XMLHttpRequestClass::abortRequest() { if (_reply) { disconnectFromReply(_reply); _reply->abort(); - delete _reply; + _reply->deleteLater(); _reply = NULL; } From 8dbaeeb646430f72cc4e35824afa7771d6dbd504 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 8 Jan 2015 13:08:43 -0800 Subject: [PATCH 2/6] Delete each entityItems --- libraries/entities/src/EntityTreeElement.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libraries/entities/src/EntityTreeElement.cpp b/libraries/entities/src/EntityTreeElement.cpp index 1c8b62de16..cf78574fa0 100644 --- a/libraries/entities/src/EntityTreeElement.cpp +++ b/libraries/entities/src/EntityTreeElement.cpp @@ -26,6 +26,9 @@ EntityTreeElement::EntityTreeElement(unsigned char* octalCode) : OctreeElement() EntityTreeElement::~EntityTreeElement() { _octreeMemoryUsage -= sizeof(EntityTreeElement); + foreach(EntityItem* item, *_entityItems) { + delete item; + } delete _entityItems; _entityItems = NULL; } From 77e4a2ef354c565b6a434bf1fa401a0dc6c896a0 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 8 Jan 2015 17:06:05 -0800 Subject: [PATCH 3/6] Add byte limit to chaches --- libraries/networking/src/ResourceCache.cpp | 23 +++++++++++++++++++++- libraries/networking/src/ResourceCache.h | 6 ++++-- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/libraries/networking/src/ResourceCache.cpp b/libraries/networking/src/ResourceCache.cpp index 5bb327fe63..6db2cba385 100644 --- a/libraries/networking/src/ResourceCache.cpp +++ b/libraries/networking/src/ResourceCache.cpp @@ -67,13 +67,26 @@ QSharedPointer ResourceCache::getResource(const QUrl& url, const QUrl& _resources.insert(url, resource); } else { - _unusedResources.remove(resource->getLRUKey()); + removeUnusedResource(resource); } return resource; } void ResourceCache::addUnusedResource(const QSharedPointer& resource) { const int RETAINED_RESOURCE_COUNT = 50; + const int RETAINED_RESOURCE_SIZE = 100 * 1024 * 1024; + + while (_unusedResourcesTotalBytes + resource->getBytesTotal() > RETAINED_RESOURCE_SIZE && + !_unusedResources.empty()) { + // unload the oldest resource + QMap >::iterator it = _unusedResources.begin(); + + _unusedResourcesTotalBytes -= it.value()->getBytesTotal(); + it.value()->setCache(NULL); + _unusedResources.erase(it); + } + + if (_unusedResources.size() > RETAINED_RESOURCE_COUNT) { // unload the oldest resource QMap >::iterator it = _unusedResources.begin(); @@ -82,6 +95,14 @@ void ResourceCache::addUnusedResource(const QSharedPointer& resource) } resource->setLRUKey(++_lastLRUKey); _unusedResources.insert(resource->getLRUKey(), resource); + _unusedResourcesTotalBytes += resource->getBytesTotal(); +} + +void ResourceCache::removeUnusedResource(const QSharedPointer& resource) { + if (_unusedResources.contains(resource->getLRUKey())) { + _unusedResources.remove(resource->getLRUKey()); + _unusedResourcesTotalBytes -= resource->getBytesTotal(); + } } void ResourceCache::attemptRequest(Resource* resource) { diff --git a/libraries/networking/src/ResourceCache.h b/libraries/networking/src/ResourceCache.h index e1b6327652..0a4121ca5e 100644 --- a/libraries/networking/src/ResourceCache.h +++ b/libraries/networking/src/ResourceCache.h @@ -45,7 +45,8 @@ public: void refresh(const QUrl& url); protected: - + + qint64 _unusedResourcesTotalBytes = 0; QMap > _unusedResources; /// Loads a resource from the specified URL. @@ -58,8 +59,9 @@ protected: /// Creates a new resource. virtual QSharedPointer createResource(const QUrl& url, const QSharedPointer& fallback, bool delayLoad, const void* extra) = 0; - + void addUnusedResource(const QSharedPointer& resource); + void removeUnusedResource(const QSharedPointer& resource); static void attemptRequest(Resource* resource); static void requestCompleted(Resource* resource); From ea832cfd459476acbabd2b975b5f3b1e3f51b854 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 8 Jan 2015 17:33:47 -0800 Subject: [PATCH 4/6] Added constant --- libraries/networking/src/ResourceCache.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libraries/networking/src/ResourceCache.cpp b/libraries/networking/src/ResourceCache.cpp index 6db2cba385..107db03868 100644 --- a/libraries/networking/src/ResourceCache.cpp +++ b/libraries/networking/src/ResourceCache.cpp @@ -73,8 +73,9 @@ QSharedPointer ResourceCache::getResource(const QUrl& url, const QUrl& } void ResourceCache::addUnusedResource(const QSharedPointer& resource) { + static constexpr int BYTES_PER_MEGABYTES = 1024 * 1024; const int RETAINED_RESOURCE_COUNT = 50; - const int RETAINED_RESOURCE_SIZE = 100 * 1024 * 1024; + const int RETAINED_RESOURCE_SIZE = 100 * BYTES_PER_MEGABYTES; while (_unusedResourcesTotalBytes + resource->getBytesTotal() > RETAINED_RESOURCE_SIZE && !_unusedResources.empty()) { From 891d8d5abfb6fad35a7a12a99d571967d265dfd4 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 8 Jan 2015 18:22:25 -0800 Subject: [PATCH 5/6] Removed unecessary foreach --- interface/src/Application.cpp | 4 ++-- libraries/entities/src/EntityTreeElement.cpp | 3 --- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index fa9a492467..859fb3db5f 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -4008,9 +4008,9 @@ void Application::parseVersionXml() { QString latestVersion; QUrl downloadUrl; QString releaseNotes("Unavailable"); - QObject* sender = qobject_cast(QObject::sender()); + QNetworkReply* sender = qobject_cast(QObject::sender()); - QXmlStreamReader xml(qobject_cast(sender)); + QXmlStreamReader xml(sender); while (!xml.atEnd() && !xml.hasError()) { if (xml.tokenType() == QXmlStreamReader::StartElement && xml.name() == operatingSystem) { diff --git a/libraries/entities/src/EntityTreeElement.cpp b/libraries/entities/src/EntityTreeElement.cpp index cf78574fa0..1c8b62de16 100644 --- a/libraries/entities/src/EntityTreeElement.cpp +++ b/libraries/entities/src/EntityTreeElement.cpp @@ -26,9 +26,6 @@ EntityTreeElement::EntityTreeElement(unsigned char* octalCode) : OctreeElement() EntityTreeElement::~EntityTreeElement() { _octreeMemoryUsage -= sizeof(EntityTreeElement); - foreach(EntityItem* item, *_entityItems) { - delete item; - } delete _entityItems; _entityItems = NULL; } From 441a1e4fee319bb65b82380d7461995110aa0021 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 8 Jan 2015 18:35:23 -0800 Subject: [PATCH 6/6] Turns out windows doesn't like constexpr --- libraries/networking/src/ResourceCache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/ResourceCache.cpp b/libraries/networking/src/ResourceCache.cpp index 107db03868..4b769c9a28 100644 --- a/libraries/networking/src/ResourceCache.cpp +++ b/libraries/networking/src/ResourceCache.cpp @@ -73,7 +73,7 @@ QSharedPointer ResourceCache::getResource(const QUrl& url, const QUrl& } void ResourceCache::addUnusedResource(const QSharedPointer& resource) { - static constexpr int BYTES_PER_MEGABYTES = 1024 * 1024; + static const int BYTES_PER_MEGABYTES = 1024 * 1024; const int RETAINED_RESOURCE_COUNT = 50; const int RETAINED_RESOURCE_SIZE = 100 * BYTES_PER_MEGABYTES;