From f1e8343b305c5025e511e9b6753c50c77220419c Mon Sep 17 00:00:00 2001 From: Howard Stearns Date: Fri, 17 May 2019 14:30:30 -0700 Subject: [PATCH 1/4] put DomainServerCheckIn on NodeList thread --- interface/src/Application.cpp | 13 +++---------- libraries/networking/src/NodeList.cpp | 6 ------ 2 files changed, 3 insertions(+), 16 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 7727708c0f..0dba4498d5 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1190,13 +1190,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo // setup a timer for domain-server check ins QTimer* domainCheckInTimer = new QTimer(this); - QWeakPointer nodeListWeak = nodeList; - connect(domainCheckInTimer, &QTimer::timeout, [this, nodeListWeak] { - auto nodeList = nodeListWeak.lock(); - if (!isServerlessMode() && nodeList) { - nodeList->sendDomainServerCheckIn(); - } - }); + connect(domainCheckInTimer, &QTimer::timeout, nodeList.data(), &NodeList::sendDomainServerCheckIn); domainCheckInTimer->start(DOMAIN_SERVER_CHECK_IN_MSECS); connect(this, &QCoreApplication::aboutToQuit, [domainCheckInTimer] { domainCheckInTimer->stop(); @@ -3886,6 +3880,7 @@ void Application::setIsInterstitialMode(bool interstitialMode) { } void Application::setIsServerlessMode(bool serverlessDomain) { + DependencyManager::get()->setSendDomainServerCheckInEnabled(!serverlessDomain); auto tree = getEntities()->getTree(); if (tree) { tree->setIsServerlessMode(serverlessDomain); @@ -5439,9 +5434,7 @@ void Application::init() { qCDebug(interfaceapp) << "Loaded settings"; // fire off an immediate domain-server check in now that settings are loaded - if (!isServerlessMode()) { - DependencyManager::get()->sendDomainServerCheckIn(); - } + QMetaObject::invokeMethod(DependencyManager::get().data(), "sendDomainServerCheckIn"); // This allows collision to be set up properly for shape entities supported by GeometryCache. // This is before entity setup to ensure that it's ready for whenever instance collision is initialized. diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 3a80745115..f6d36a6023 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -292,12 +292,6 @@ void NodeList::addSetOfNodeTypesToNodeInterestSet(const NodeSet& setOfNodeTypes) void NodeList::sendDomainServerCheckIn() { - // This function is called by the server check-in timer thread - // not the NodeList thread. Calling it on the NodeList thread - // resulted in starvation of the server check-in function. - // be VERY CAREFUL modifying this code as members of NodeList - // may be called by multiple threads. - if (!_sendDomainServerCheckInEnabled) { qCDebug(networking_ice) << "Refusing to send a domain-server check in while it is disabled."; return; From 0039fb2f5493d5659cc22b3671692c5a2863298a Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Fri, 17 May 2019 14:47:38 -0700 Subject: [PATCH 2/4] attempt to fix material crash --- libraries/render-utils/src/Model.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 938cc4a485..64a46f3c1e 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -1577,9 +1577,11 @@ void Model::applyMaterialMapping() { priorityMapPerResource[shapeID] = ++_priorityMap[shapeID]; } - auto materialLoaded = [this, networkMaterialResource, shapeIDs, priorityMapPerResource, renderItemsKey, primitiveMode, useDualQuaternionSkinning, - modelMeshRenderItemIDs, modelMeshRenderItemShapes, shouldInvalidatePayloadShapeKeyMap]() { - if (networkMaterialResource->isFailed() || networkMaterialResource->parsedMaterials.names.size() == 0) { + std::weak_ptr weakSelf = shared_from_this(); + auto materialLoaded = [networkMaterialResource, shapeIDs, priorityMapPerResource, renderItemsKey, primitiveMode, useDualQuaternionSkinning, + modelMeshRenderItemIDs, modelMeshRenderItemShapes, shouldInvalidatePayloadShapeKeyMap, weakSelf]() { + std::shared_ptr self = weakSelf.lock(); + if (!self || networkMaterialResource->isFailed() || networkMaterialResource->parsedMaterials.names.size() == 0) { return; } render::Transaction transaction; @@ -1607,8 +1609,8 @@ void Model::applyMaterialMapping() { bool invalidatePayloadShapeKey = shouldInvalidatePayloadShapeKeyMap.at(meshIndex); graphics::MaterialLayer material = graphics::MaterialLayer(networkMaterial, priorityMapPerResource.at(shapeID)); { - std::unique_lock lock(_materialMappingMutex); - _materialMapping[shapeID].push_back(material); + std::unique_lock lock(self->_materialMappingMutex); + self->_materialMapping[shapeID].push_back(material); } transaction.updateItem(itemID, [material, renderItemsKey, invalidatePayloadShapeKey, primitiveMode, useDualQuaternionSkinning](ModelMeshPartPayload& data) { From 3273f46179e6267ec6d52b01f4deac45e46ea25e Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Fri, 17 May 2019 15:29:27 -0700 Subject: [PATCH 3/4] fix avatar loading spheres --- interface/src/avatar/AvatarManager.cpp | 2 +- interface/src/avatar/OtherAvatar.cpp | 2 +- .../src/avatars-renderer/Avatar.cpp | 23 ++++++++++--------- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index df620b9a08..80b9762213 100755 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -412,7 +412,7 @@ AvatarSharedPointer AvatarManager::newSharedAvatar(const QUuid& sessionUUID) { auto otherAvatar = new OtherAvatar(qApp->thread()); otherAvatar->setSessionUUID(sessionUUID); auto nodeList = DependencyManager::get(); - if (!nodeList || !nodeList->isIgnoringNode(sessionUUID)) { + if (nodeList && !nodeList->isIgnoringNode(sessionUUID)) { otherAvatar->createOrb(); } return AvatarSharedPointer(otherAvatar, [](OtherAvatar* ptr) { ptr->deleteLater(); }); diff --git a/interface/src/avatar/OtherAvatar.cpp b/interface/src/avatar/OtherAvatar.cpp index 107932d5ec..06dcd9767d 100755 --- a/interface/src/avatar/OtherAvatar.cpp +++ b/interface/src/avatar/OtherAvatar.cpp @@ -62,7 +62,7 @@ void OtherAvatar::removeOrb() { } void OtherAvatar::updateOrbPosition() { - if (_otherAvatarOrbMeshPlaceholderID.isNull()) { + if (!_otherAvatarOrbMeshPlaceholderID.isNull()) { EntityItemProperties properties; properties.setPosition(getHead()->getPosition()); DependencyManager::get()->editEntity(_otherAvatarOrbMeshPlaceholderID, properties); diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index e836ecf7eb..78481fdc2e 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -1519,18 +1519,19 @@ void Avatar::scaleVectorRelativeToPosition(glm::vec3 &positionToScale) const { } void Avatar::setSkeletonModelURL(const QUrl& skeletonModelURL) { - AvatarData::setSkeletonModelURL(skeletonModelURL); - if (QThread::currentThread() == thread()) { - - if (!isMyAvatar() && !DependencyManager::get()->isIgnoringNode(getSessionUUID())) { - createOrb(); - } - - _skeletonModel->setURL(_skeletonModelURL); - indicateLoadingStatus(LoadingStatus::LoadModel); - } else { - QMetaObject::invokeMethod(_skeletonModel.get(), "setURL", Qt::QueuedConnection, Q_ARG(QUrl, _skeletonModelURL)); + if (QThread::currentThread() != thread()) { + QMetaObject::invokeMethod(this, "setSkeletonModelURL", Q_ARG(const QUrl&, skeletonModelURL)); + return; } + + AvatarData::setSkeletonModelURL(skeletonModelURL); + + if (!isMyAvatar() && !DependencyManager::get()->isIgnoringNode(getSessionUUID())) { + createOrb(); + } + indicateLoadingStatus(LoadingStatus::LoadModel); + + _skeletonModel->setURL(_skeletonModelURL); } void Avatar::setModelURLFinished(bool success) { From 72a9017fdfb2268cb48b8cbd98c63f7794e7dc81 Mon Sep 17 00:00:00 2001 From: Howard Stearns Date: Fri, 17 May 2019 15:30:54 -0700 Subject: [PATCH 4/4] put back modified version of earlier comment --- libraries/networking/src/NodeList.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index f6d36a6023..b3862e4252 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -292,6 +292,13 @@ void NodeList::addSetOfNodeTypesToNodeInterestSet(const NodeSet& setOfNodeTypes) void NodeList::sendDomainServerCheckIn() { + // On ThreadedAssignments (assignment clients), this function + // is called by the server check-in timer thread + // not the NodeList thread. Calling it on the NodeList thread + // resulted in starvation of the server check-in function. + // be VERY CAREFUL modifying this code as members of NodeList + // may be called by multiple threads. + if (!_sendDomainServerCheckInEnabled) { qCDebug(networking_ice) << "Refusing to send a domain-server check in while it is disabled."; return;