diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index 500772c1b5..2c5e6a90c9 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -239,6 +239,10 @@ void AvatarMixer::start() { }, &lockWait, &nodeTransform, &functor); auto end = usecTimestampNow(); _processQueuedAvatarDataPacketsElapsedTime += (end - start); + + _broadcastAvatarDataLockWait += lockWait; + _broadcastAvatarDataNodeTransform += nodeTransform; + _broadcastAvatarDataNodeFunctor += functor; } // process pending display names... this doesn't currently run on multiple threads, because it @@ -256,6 +260,10 @@ void AvatarMixer::start() { }, &lockWait, &nodeTransform, &functor); auto end = usecTimestampNow(); _displayNameManagementElapsedTime += (end - start); + + _broadcastAvatarDataLockWait += lockWait; + _broadcastAvatarDataNodeTransform += nodeTransform; + _broadcastAvatarDataNodeFunctor += functor; } // this is where we need to put the real work... diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index eaa02f059e..74ad8fc398 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -558,25 +558,23 @@ SharedNodePointer LimitedNodeList::nodeWithLocalID(Node::LocalID localID) const } void LimitedNodeList::eraseAllNodes() { - QSet killedNodes; + std::vector killedNodes; { // iterate the current nodes - grab them so we can emit that they are dying // and then remove them from the hash QWriteLocker writeLocker(&_nodeMutex); - _localIDMap.clear(); - if (_nodeHash.size() > 0) { qCDebug(networking) << "LimitedNodeList::eraseAllNodes() removing all nodes from NodeList."; - auto it = _nodeHash.begin(); - - while (it != _nodeHash.end()) { - killedNodes.insert(it->second); - it = _nodeHash.unsafe_erase(it); + killedNodes.reserve(_nodeHash.size()); + for (auto& pair : _nodeHash) { + killedNodes.push_back(pair.second); } } + _localIDMap.clear(); + _nodeHash.clear(); } foreach(const SharedNodePointer& killedNode, killedNodes) { @@ -593,18 +591,13 @@ void LimitedNodeList::reset() { } bool LimitedNodeList::killNodeWithUUID(const QUuid& nodeUUID, ConnectionID newConnectionID) { - QReadLocker readLocker(&_nodeMutex); - - NodeHash::iterator it = _nodeHash.find(nodeUUID); - if (it != _nodeHash.end()) { - SharedNodePointer matchingNode = it->second; - - readLocker.unlock(); + auto matchingNode = nodeWithUUID(nodeUUID); + if (matchingNode) { { QWriteLocker writeLocker(&_nodeMutex); _localIDMap.unsafe_erase(matchingNode->getLocalID()); - _nodeHash.unsafe_erase(it); + _nodeHash.unsafe_erase(matchingNode->getUUID()); } handleNodeKill(matchingNode, newConnectionID); @@ -645,30 +638,26 @@ SharedNodePointer LimitedNodeList::addOrUpdateNode(const QUuid& uuid, NodeType_t const HifiSockAddr& publicSocket, const HifiSockAddr& localSocket, Node::LocalID localID, bool isReplicated, bool isUpstream, const QUuid& connectionSecret, const NodePermissions& permissions) { - { - QReadLocker readLocker(&_nodeMutex); - NodeHash::const_iterator it = _nodeHash.find(uuid); + auto matchingNode = nodeWithUUID(uuid); + if (matchingNode) { + matchingNode->setPublicSocket(publicSocket); + matchingNode->setLocalSocket(localSocket); + matchingNode->setPermissions(permissions); + matchingNode->setConnectionSecret(connectionSecret); + matchingNode->setIsReplicated(isReplicated); + matchingNode->setIsUpstream(isUpstream || NodeType::isUpstream(nodeType)); + matchingNode->setLocalID(localID); - if (it != _nodeHash.end()) { - SharedNodePointer& matchingNode = it->second; - - matchingNode->setPublicSocket(publicSocket); - matchingNode->setLocalSocket(localSocket); - matchingNode->setPermissions(permissions); - matchingNode->setConnectionSecret(connectionSecret); - matchingNode->setIsReplicated(isReplicated); - matchingNode->setIsUpstream(isUpstream || NodeType::isUpstream(nodeType)); - matchingNode->setLocalID(localID); - - return matchingNode; - } + return matchingNode; } auto removeOldNode = [&](auto node) { if (node) { - QWriteLocker writeLocker(&_nodeMutex); - _localIDMap.unsafe_erase(node->getLocalID()); - _nodeHash.unsafe_erase(node->getUUID()); + { + QWriteLocker writeLocker(&_nodeMutex); + _localIDMap.unsafe_erase(node->getLocalID()); + _nodeHash.unsafe_erase(node->getUUID()); + } handleNodeKill(node); } }; diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 450fad96a9..57e03ce3b7 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -205,7 +205,10 @@ public: int* lockWaitOut = nullptr, int* nodeTransformOut = nullptr, int* functorOut = nullptr) { - auto start = usecTimestampNow(); + quint64 start, endTransform, endFunctor; + + start = usecTimestampNow(); + std::vector nodes; { QReadLocker readLock(&_nodeMutex); auto endLock = usecTimestampNow(); @@ -216,21 +219,21 @@ public: // Size of _nodeHash could change at any time, // so reserve enough memory for the current size // and then back insert all the nodes found - std::vector nodes; nodes.reserve(_nodeHash.size()); std::transform(_nodeHash.cbegin(), _nodeHash.cend(), std::back_inserter(nodes), [&](const NodeHash::value_type& it) { return it.second; }); - auto endTransform = usecTimestampNow(); + + endTransform = usecTimestampNow(); if (nodeTransformOut) { *nodeTransformOut = (endTransform - endLock); } + } - functor(nodes.cbegin(), nodes.cend()); - auto endFunctor = usecTimestampNow(); - if (functorOut) { - *functorOut = (endFunctor - endTransform); - } + functor(nodes.cbegin(), nodes.cend()); + endFunctor = usecTimestampNow(); + if (functorOut) { + *functorOut = (endFunctor - endTransform); } }