diff --git a/libraries/octree/src/OctreeQuery.cpp b/libraries/octree/src/OctreeQuery.cpp index 3f730d4458..0d56dbb88f 100644 --- a/libraries/octree/src/OctreeQuery.cpp +++ b/libraries/octree/src/OctreeQuery.cpp @@ -34,13 +34,16 @@ int OctreeQuery::getBroadcastData(unsigned char* destinationBuffer) { memcpy(destinationBuffer, &_connectionID, sizeof(_connectionID)); destinationBuffer += sizeof(_connectionID); - // Number of frustums - uint8_t numFrustums = (uint8_t)_conicalViews.size(); - memcpy(destinationBuffer, &numFrustums, sizeof(numFrustums)); - destinationBuffer += sizeof(numFrustums); + { + QMutexLocker lock(&_conicalViewsLock); + // Number of frustums + uint8_t numFrustums = (uint8_t)_conicalViews.size(); + memcpy(destinationBuffer, &numFrustums, sizeof(numFrustums)); + destinationBuffer += sizeof(numFrustums); - for (const auto& view : _conicalViews) { - destinationBuffer += view.serialize(destinationBuffer); + for (const auto& view : _conicalViews) { + destinationBuffer += view.serialize(destinationBuffer); + } } // desired Max Octree PPS @@ -108,11 +111,14 @@ int OctreeQuery::parseData(ReceivedMessage& message) { memcpy(&numFrustums, sourceBuffer, sizeof(numFrustums)); sourceBuffer += sizeof(numFrustums); - _conicalViews.clear(); - for (int i = 0; i < numFrustums; ++i) { - ConicalViewFrustum view; - sourceBuffer += view.deserialize(sourceBuffer); - _conicalViews.push_back(view); + { + QMutexLocker lock(&_conicalViewsLock); + _conicalViews.clear(); + for (int i = 0; i < numFrustums; ++i) { + ConicalViewFrustum view; + sourceBuffer += view.deserialize(sourceBuffer); + _conicalViews.push_back(view); + } } // desired Max Octree PPS diff --git a/libraries/octree/src/OctreeQuery.h b/libraries/octree/src/OctreeQuery.h index 7dfc1cfaaf..0ca75bdeb0 100644 --- a/libraries/octree/src/OctreeQuery.h +++ b/libraries/octree/src/OctreeQuery.h @@ -33,9 +33,10 @@ public: int getBroadcastData(unsigned char* destinationBuffer); int parseData(ReceivedMessage& message) override; - bool hasConicalViews() const { return !_conicalViews.empty(); } - void setConicalViews(ConicalViewFrustums views) { _conicalViews = views; } - void clearConicalViews() { _conicalViews.clear(); } + bool hasConicalViews() const { QMutexLocker lock(&_conicalViewsLock); return !_conicalViews.empty(); } + void setConicalViews(ConicalViewFrustums views) + { QMutexLocker lock(&_conicalViewsLock); _conicalViews = views; } + void clearConicalViews() { QMutexLocker lock(&_conicalViewsLock); _conicalViews.clear(); } // getters/setters for JSON filter QJsonObject getJSONParameters() { QReadLocker locker { &_jsonParametersLock }; return _jsonParameters; } @@ -60,6 +61,7 @@ public slots: void setBoundaryLevelAdjust(int boundaryLevelAdjust) { _boundaryLevelAdjust = boundaryLevelAdjust; } protected: + mutable QMutex _conicalViewsLock; ConicalViewFrustums _conicalViews; // octree server sending items diff --git a/libraries/octree/src/OctreeQueryNode.cpp b/libraries/octree/src/OctreeQueryNode.cpp index 2d1d89a11c..0c1c108f68 100644 --- a/libraries/octree/src/OctreeQueryNode.cpp +++ b/libraries/octree/src/OctreeQueryNode.cpp @@ -153,7 +153,7 @@ bool OctreeQueryNode::updateCurrentViewFrustum() { bool currentViewFrustumChanged = false; { // if there has been a change, then recalculate - QMutexLocker viewLocker(&_viewMutex); + QMutexLocker lock(&_conicalViewsLock); if (_conicalViews.size() == _currentConicalViews.size()) { for (size_t i = 0; i < _conicalViews.size(); ++i) { diff --git a/libraries/octree/src/OctreeQueryNode.h b/libraries/octree/src/OctreeQueryNode.h index d984e048c1..a76c950e08 100644 --- a/libraries/octree/src/OctreeQueryNode.h +++ b/libraries/octree/src/OctreeQueryNode.h @@ -95,7 +95,6 @@ private: int _duplicatePacketCount { 0 }; quint64 _firstSuppressedPacket { usecTimestampNow() }; - mutable QMutex _viewMutex { QMutex::Recursive }; ConicalViewFrustums _currentConicalViews; bool _viewFrustumChanging { false }; bool _viewFrustumJustStoppedChanging { true };