From e819ab8475bfed2a6365defee8f0b4fa3fb9ecae Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 11 May 2016 09:59:02 -0700 Subject: [PATCH] Add mutex protection around octal code getters --- libraries/octree/src/JurisdictionMap.cpp | 26 +++++++++++++++++++---- libraries/octree/src/JurisdictionMap.h | 9 ++++---- libraries/octree/src/OctreeSceneStats.cpp | 11 ++++------ libraries/shared/src/OctalCode.cpp | 2 +- libraries/shared/src/OctalCode.h | 3 ++- 5 files changed, 34 insertions(+), 17 deletions(-) diff --git a/libraries/octree/src/JurisdictionMap.cpp b/libraries/octree/src/JurisdictionMap.cpp index 86de7467d3..30a8de1bda 100644 --- a/libraries/octree/src/JurisdictionMap.cpp +++ b/libraries/octree/src/JurisdictionMap.cpp @@ -70,7 +70,12 @@ void JurisdictionMap::copyContents(const OctalCodePtr& rootCodeIn, const std::ve void JurisdictionMap::copyContents(const JurisdictionMap& other) { _nodeType = other._nodeType; - init(other.getRootOctalCode(), other.getEndNodeOctalCodes()); + OctalCodePtr rootOctalCode; + OctalCodePtrList endNodes; + + std::tie(rootOctalCode, endNodes) = other.getRootOctalCodeAndEndNodes(); + + init(rootOctalCode, endNodes); } JurisdictionMap::~JurisdictionMap() { @@ -120,6 +125,20 @@ JurisdictionMap::JurisdictionMap(const char* rootHexCode, const char* endNodesHe } } +std::tuple JurisdictionMap::getRootOctalCodeAndEndNodes() const { + std::lock_guard lock(_octalCodeMutex); + return std::tuple>(_rootOctalCode, _endNodes); +} + +OctalCodePtr JurisdictionMap::getRootOctalCode() const { + std::lock_guard lock(_octalCodeMutex); + return _rootOctalCode; +} + +OctalCodePtrList JurisdictionMap::getEndNodeOctalCodes() const { + std::lock_guard lock(_octalCodeMutex); + return _endNodes; +} void JurisdictionMap::init(OctalCodePtr rootOctalCode, const std::vector& endNodes) { std::lock_guard lock(_octalCodeMutex); @@ -160,7 +179,7 @@ bool JurisdictionMap::readFromFile(const char* filename) { qCDebug(octree) << "rootCode=" << rootCode; std::lock_guard lock(_octalCodeMutex); - _rootOctalCode = std::shared_ptr(hexStringToOctalCode(rootCode)); + _rootOctalCode = hexStringToOctalCode(rootCode); printOctalCode(_rootOctalCode.get()); settings.beginGroup("endNodes"); @@ -195,11 +214,10 @@ void JurisdictionMap::displayDebugDetails() const { bool JurisdictionMap::writeToFile(const char* filename) { - std::lock_guard lock(_octalCodeMutex); - QString settingsFile(filename); QSettings settings(settingsFile, QSettings::IniFormat); + std::lock_guard lock(_octalCodeMutex); QString rootNodeValue = octalCodeToHexString(_rootOctalCode.get()); diff --git a/libraries/octree/src/JurisdictionMap.h b/libraries/octree/src/JurisdictionMap.h index 0deedb41e1..3b08fb221c 100644 --- a/libraries/octree/src/JurisdictionMap.h +++ b/libraries/octree/src/JurisdictionMap.h @@ -51,10 +51,11 @@ public: bool writeToFile(const char* filename); bool readFromFile(const char* filename); - OctalCodePtr getRootOctalCode() const { return _rootOctalCode; } - std::vector getEndNodeOctalCodes() const { return _endNodes; } + std::tuple JurisdictionMap::getRootOctalCodeAndEndNodes() const; + OctalCodePtr getRootOctalCode() const; + OctalCodePtrList getEndNodeOctalCodes() const; - void copyContents(const OctalCodePtr& rootCodeIn, const std::vector& endNodesIn); + void copyContents(const OctalCodePtr& rootCodeIn, const OctalCodePtrList& endNodesIn); int unpackFromPacket(ReceivedMessage& message); std::unique_ptr packIntoPacket(); @@ -73,7 +74,7 @@ private: mutable std::mutex _octalCodeMutex; OctalCodePtr _rootOctalCode { nullptr }; - std::vector _endNodes; + OctalCodePtrList _endNodes; NodeType_t _nodeType; }; diff --git a/libraries/octree/src/OctreeSceneStats.cpp b/libraries/octree/src/OctreeSceneStats.cpp index fd770ccd67..ca2bff32a4 100644 --- a/libraries/octree/src/OctreeSceneStats.cpp +++ b/libraries/octree/src/OctreeSceneStats.cpp @@ -154,15 +154,12 @@ void OctreeSceneStats::sceneStarted(bool isFullScene, bool isMoving, OctreeEleme _isFullScene = isFullScene; _isMoving = isMoving; - _jurisdictionRoot = nullptr; - - // clear existing endNodes before copying new ones... - _jurisdictionEndNodes.clear(); - // setup jurisdictions if (jurisdictionMap) { - _jurisdictionRoot = jurisdictionMap->getRootOctalCode(); - _jurisdictionEndNodes = jurisdictionMap->getEndNodeOctalCodes(); + std::tie(_jurisdictionRoot, _jurisdictionEndNodes) = jurisdictionMap->getRootOctalCodeAndEndNodes(); + } else { + _jurisdictionRoot = nullptr; + _jurisdictionEndNodes.clear(); } } diff --git a/libraries/shared/src/OctalCode.cpp b/libraries/shared/src/OctalCode.cpp index 802ddbbb64..85b6c2b632 100644 --- a/libraries/shared/src/OctalCode.cpp +++ b/libraries/shared/src/OctalCode.cpp @@ -304,7 +304,7 @@ bool isAncestorOf(const unsigned char* possibleAncestor, const unsigned char* po return true; } -std::shared_ptr hexStringToOctalCode(const QString& input) { +OctalCodePtr hexStringToOctalCode(const QString& input) { const int HEX_NUMBER_BASE = 16; const int HEX_BYTE_SIZE = 2; int stringIndex = 0; diff --git a/libraries/shared/src/OctalCode.h b/libraries/shared/src/OctalCode.h index e8892fb40b..7d1424d954 100644 --- a/libraries/shared/src/OctalCode.h +++ b/libraries/shared/src/OctalCode.h @@ -24,6 +24,7 @@ const int GREEN_INDEX = 1; const int BLUE_INDEX = 2; using OctalCodePtr = std::shared_ptr; +using OctalCodePtrList = std::vector; void printOctalCode(const unsigned char* octalCode); size_t bytesRequiredForCodeLength(unsigned char threeBitCodes); @@ -61,6 +62,6 @@ typedef enum { OctalCodeComparison compareOctalCodes(const unsigned char* code1, const unsigned char* code2); QString octalCodeToHexString(const unsigned char* octalCode); -std::shared_ptr hexStringToOctalCode(const QString& input); +OctalCodePtr hexStringToOctalCode(const QString& input); #endif // hifi_OctalCode_h