From 66a2b38f50ae9362aa69919f7469473bf97e23ee Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Thu, 12 Nov 2015 13:09:51 -0800 Subject: [PATCH 1/5] switch various status to use thread safe atomics --- .../src/octree/OctreeSendThread.cpp | 10 +++---- .../src/octree/OctreeSendThread.h | 14 ++++++---- libraries/octree/src/OctreeElement.cpp | 22 +++++++-------- libraries/octree/src/OctreeElement.h | 27 +++++++++++-------- libraries/octree/src/OctreePacketData.cpp | 18 ++++++------- libraries/octree/src/OctreePacketData.h | 20 ++++++++------ libraries/shared/src/PerfStat.h | 8 +++--- 7 files changed, 66 insertions(+), 53 deletions(-) diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index b94317050c..c6f84b9a59 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -112,12 +112,12 @@ bool OctreeSendThread::process() { return isStillRunning(); // keep running till they terminate us } -quint64 OctreeSendThread::_usleepTime = 0; -quint64 OctreeSendThread::_usleepCalls = 0; +AtomicUIntStat OctreeSendThread::_usleepTime = 0; +AtomicUIntStat OctreeSendThread::_usleepCalls = 0; -quint64 OctreeSendThread::_totalBytes = 0; -quint64 OctreeSendThread::_totalWastedBytes = 0; -quint64 OctreeSendThread::_totalPackets = 0; +AtomicUIntStat OctreeSendThread::_totalBytes = 0; +AtomicUIntStat OctreeSendThread::_totalWastedBytes = 0; +AtomicUIntStat OctreeSendThread::_totalPackets = 0; int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytesSent, int& truePacketsSent) { OctreeServer::didHandlePacketSend(this); diff --git a/assignment-client/src/octree/OctreeSendThread.h b/assignment-client/src/octree/OctreeSendThread.h index 78f480b5eb..69ea0be567 100644 --- a/assignment-client/src/octree/OctreeSendThread.h +++ b/assignment-client/src/octree/OctreeSendThread.h @@ -14,6 +14,8 @@ #ifndef hifi_OctreeSendThread_h #define hifi_OctreeSendThread_h +#include + #include #include @@ -21,6 +23,8 @@ class OctreeServer; +using AtomicUIntStat = std::atomic; + /// Threaded processor for sending octree packets to a single client class OctreeSendThread : public GenericThread { Q_OBJECT @@ -30,12 +34,12 @@ public: void setIsShuttingDown(); - static quint64 _totalBytes; - static quint64 _totalWastedBytes; - static quint64 _totalPackets; + static AtomicUIntStat _totalBytes; + static AtomicUIntStat _totalWastedBytes; + static AtomicUIntStat _totalPackets; - static quint64 _usleepTime; - static quint64 _usleepCalls; + static AtomicUIntStat _usleepTime; + static AtomicUIntStat _usleepCalls; protected: /// Implements generic processing behavior for this thread. diff --git a/libraries/octree/src/OctreeElement.cpp b/libraries/octree/src/OctreeElement.cpp index 17ebe492ce..6bb39871bb 100644 --- a/libraries/octree/src/OctreeElement.cpp +++ b/libraries/octree/src/OctreeElement.cpp @@ -28,11 +28,11 @@ #include "OctreeLogging.h" #include "SharedUtil.h" -quint64 OctreeElement::_octreeMemoryUsage = 0; -quint64 OctreeElement::_octcodeMemoryUsage = 0; -quint64 OctreeElement::_externalChildrenMemoryUsage = 0; -quint64 OctreeElement::_voxelNodeCount = 0; -quint64 OctreeElement::_voxelNodeLeafCount = 0; +AtomicUIntStat OctreeElement::_octreeMemoryUsage = 0; +AtomicUIntStat OctreeElement::_octcodeMemoryUsage = 0; +AtomicUIntStat OctreeElement::_externalChildrenMemoryUsage = 0; +AtomicUIntStat OctreeElement::_voxelNodeCount = 0; +AtomicUIntStat OctreeElement::_voxelNodeLeafCount = 0; void OctreeElement::resetPopulationStatistics() { _voxelNodeCount = 0; @@ -245,13 +245,13 @@ bool OctreeElement::isParentOf(OctreeElementPointer possibleChild) const { return false; } -quint64 OctreeElement::_getChildAtIndexTime = 0; -quint64 OctreeElement::_getChildAtIndexCalls = 0; -quint64 OctreeElement::_setChildAtIndexTime = 0; -quint64 OctreeElement::_setChildAtIndexCalls = 0; +AtomicUIntStat OctreeElement::_getChildAtIndexTime = 0; +AtomicUIntStat OctreeElement::_getChildAtIndexCalls = 0; +AtomicUIntStat OctreeElement::_setChildAtIndexTime = 0; +AtomicUIntStat OctreeElement::_setChildAtIndexCalls = 0; -quint64 OctreeElement::_externalChildrenCount = 0; -quint64 OctreeElement::_childrenCount[NUMBER_OF_CHILDREN + 1] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 }; +AtomicUIntStat OctreeElement::_externalChildrenCount = 0; +AtomicUIntStat OctreeElement::_childrenCount[NUMBER_OF_CHILDREN + 1] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 }; OctreeElementPointer OctreeElement::getChildAtIndex(int childIndex) const { #ifdef SIMPLE_CHILD_ARRAY diff --git a/libraries/octree/src/OctreeElement.h b/libraries/octree/src/OctreeElement.h index 6ccef31d4f..d705b64acd 100644 --- a/libraries/octree/src/OctreeElement.h +++ b/libraries/octree/src/OctreeElement.h @@ -15,6 +15,8 @@ //#define SIMPLE_CHILD_ARRAY #define SIMPLE_EXTERNAL_CHILDREN +#include + #include #include @@ -24,6 +26,9 @@ #include "ViewFrustum.h" #include "OctreeConstants.h" +using AtomicUIntStat = std::atomic; + + class EncodeBitstreamParams; class Octree; class OctreeElement; @@ -290,20 +295,20 @@ protected: //static QReadWriteLock _updateHooksLock; static std::vector _updateHooks; - static quint64 _voxelNodeCount; - static quint64 _voxelNodeLeafCount; + static AtomicUIntStat _voxelNodeCount; + static AtomicUIntStat _voxelNodeLeafCount; - static quint64 _octreeMemoryUsage; - static quint64 _octcodeMemoryUsage; - static quint64 _externalChildrenMemoryUsage; + static AtomicUIntStat _octreeMemoryUsage; + static AtomicUIntStat _octcodeMemoryUsage; + static AtomicUIntStat _externalChildrenMemoryUsage; - static quint64 _getChildAtIndexTime; - static quint64 _getChildAtIndexCalls; - static quint64 _setChildAtIndexTime; - static quint64 _setChildAtIndexCalls; + static AtomicUIntStat _getChildAtIndexTime; + static AtomicUIntStat _getChildAtIndexCalls; + static AtomicUIntStat _setChildAtIndexTime; + static AtomicUIntStat _setChildAtIndexCalls; - static quint64 _externalChildrenCount; - static quint64 _childrenCount[NUMBER_OF_CHILDREN + 1]; + static AtomicUIntStat _externalChildrenCount; + static AtomicUIntStat _childrenCount[NUMBER_OF_CHILDREN + 1]; }; #endif // hifi_OctreeElement_h diff --git a/libraries/octree/src/OctreePacketData.cpp b/libraries/octree/src/OctreePacketData.cpp index 8430e21d79..5ed891fc7c 100644 --- a/libraries/octree/src/OctreePacketData.cpp +++ b/libraries/octree/src/OctreePacketData.cpp @@ -16,14 +16,12 @@ #include "OctreePacketData.h" bool OctreePacketData::_debug = false; -quint64 OctreePacketData::_totalBytesOfOctalCodes = 0; -quint64 OctreePacketData::_totalBytesOfBitMasks = 0; -quint64 OctreePacketData::_totalBytesOfColor = 0; -quint64 OctreePacketData::_totalBytesOfValues = 0; -quint64 OctreePacketData::_totalBytesOfPositions = 0; -quint64 OctreePacketData::_totalBytesOfRawData = 0; - - +AtomicUIntStat OctreePacketData::_totalBytesOfOctalCodes = 0; +AtomicUIntStat OctreePacketData::_totalBytesOfBitMasks = 0; +AtomicUIntStat OctreePacketData::_totalBytesOfColor = 0; +AtomicUIntStat OctreePacketData::_totalBytesOfValues = 0; +AtomicUIntStat OctreePacketData::_totalBytesOfPositions = 0; +AtomicUIntStat OctreePacketData::_totalBytesOfRawData = 0; OctreePacketData::OctreePacketData(bool enableCompression, int targetSize) { changeSettings(enableCompression, targetSize); // does reset... @@ -490,8 +488,8 @@ bool OctreePacketData::appendRawData(QByteArray data) { } -quint64 OctreePacketData::_compressContentTime = 0; -quint64 OctreePacketData::_compressContentCalls = 0; +AtomicUIntStat OctreePacketData::_compressContentTime = 0; +AtomicUIntStat OctreePacketData::_compressContentCalls = 0; bool OctreePacketData::compressContent() { PerformanceWarning warn(false, "OctreePacketData::compressContent()", false, &_compressContentTime, &_compressContentCalls); diff --git a/libraries/octree/src/OctreePacketData.h b/libraries/octree/src/OctreePacketData.h index 44737d37da..2c86d518ad 100644 --- a/libraries/octree/src/OctreePacketData.h +++ b/libraries/octree/src/OctreePacketData.h @@ -22,6 +22,8 @@ #ifndef hifi_OctreePacketData_h #define hifi_OctreePacketData_h +#include + #include #include #include @@ -35,6 +37,8 @@ #include "OctreeConstants.h" #include "OctreeElement.h" +using AtomicUIntStat = std::atomic; + typedef unsigned char OCTREE_PACKET_FLAGS; typedef uint16_t OCTREE_PACKET_SEQUENCE; const uint16_t MAX_OCTREE_PACKET_SEQUENCE = 65535; @@ -286,15 +290,15 @@ private: static bool _debug; - static quint64 _compressContentTime; - static quint64 _compressContentCalls; + static AtomicUIntStat _compressContentTime; + static AtomicUIntStat _compressContentCalls; - static quint64 _totalBytesOfOctalCodes; - static quint64 _totalBytesOfBitMasks; - static quint64 _totalBytesOfColor; - static quint64 _totalBytesOfValues; - static quint64 _totalBytesOfPositions; - static quint64 _totalBytesOfRawData; + static AtomicUIntStat _totalBytesOfOctalCodes; + static AtomicUIntStat _totalBytesOfBitMasks; + static AtomicUIntStat _totalBytesOfColor; + static AtomicUIntStat _totalBytesOfValues; + static AtomicUIntStat _totalBytesOfPositions; + static AtomicUIntStat _totalBytesOfRawData; }; #endif // hifi_OctreePacketData_h diff --git a/libraries/shared/src/PerfStat.h b/libraries/shared/src/PerfStat.h index 523bee0808..f8903a7ef3 100644 --- a/libraries/shared/src/PerfStat.h +++ b/libraries/shared/src/PerfStat.h @@ -24,19 +24,21 @@ #include #include +using AtomicUIntStat = std::atomic; + class PerformanceWarning { private: quint64 _start; const char* _message; bool _renderWarningsOn; bool _alwaysDisplay; - quint64* _runningTotal; - quint64* _totalCalls; + AtomicUIntStat* _runningTotal; + AtomicUIntStat* _totalCalls; static bool _suppressShortTimings; public: PerformanceWarning(bool renderWarnings, const char* message, bool alwaysDisplay = false, - quint64* runningTotal = NULL, quint64* totalCalls = NULL) : + AtomicUIntStat* runningTotal = NULL, AtomicUIntStat* totalCalls = NULL) : _start(usecTimestampNow()), _message(message), _renderWarningsOn(renderWarnings), From 14a6e1fb6b043d27a1f2e3ff39b76525bf2da671 Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Thu, 12 Nov 2015 13:24:25 -0800 Subject: [PATCH 2/5] fix mac compiler error --- assignment-client/src/octree/OctreeSendThread.cpp | 11 +++++------ libraries/octree/src/OctreeElement.cpp | 11 +++++------ libraries/octree/src/OctreePacketData.cpp | 12 ++++++------ 3 files changed, 16 insertions(+), 18 deletions(-) diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index c6f84b9a59..1906cb7979 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -112,12 +112,11 @@ bool OctreeSendThread::process() { return isStillRunning(); // keep running till they terminate us } -AtomicUIntStat OctreeSendThread::_usleepTime = 0; -AtomicUIntStat OctreeSendThread::_usleepCalls = 0; - -AtomicUIntStat OctreeSendThread::_totalBytes = 0; -AtomicUIntStat OctreeSendThread::_totalWastedBytes = 0; -AtomicUIntStat OctreeSendThread::_totalPackets = 0; +AtomicUIntStat OctreeSendThread::_usleepTime { 0 }; +AtomicUIntStat OctreeSendThread::_usleepCalls { 0 }; +AtomicUIntStat OctreeSendThread::_totalBytes { 0 }; +AtomicUIntStat OctreeSendThread::_totalWastedBytes { 0 }; +AtomicUIntStat OctreeSendThread::_totalPackets { 0 }; int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytesSent, int& truePacketsSent) { OctreeServer::didHandlePacketSend(this); diff --git a/libraries/octree/src/OctreeElement.cpp b/libraries/octree/src/OctreeElement.cpp index 6bb39871bb..48172bd9fe 100644 --- a/libraries/octree/src/OctreeElement.cpp +++ b/libraries/octree/src/OctreeElement.cpp @@ -245,12 +245,11 @@ bool OctreeElement::isParentOf(OctreeElementPointer possibleChild) const { return false; } -AtomicUIntStat OctreeElement::_getChildAtIndexTime = 0; -AtomicUIntStat OctreeElement::_getChildAtIndexCalls = 0; -AtomicUIntStat OctreeElement::_setChildAtIndexTime = 0; -AtomicUIntStat OctreeElement::_setChildAtIndexCalls = 0; - -AtomicUIntStat OctreeElement::_externalChildrenCount = 0; +AtomicUIntStat OctreeElement::_getChildAtIndexTime { 0 }; +AtomicUIntStat OctreeElement::_getChildAtIndexCalls { 0 }; +AtomicUIntStat OctreeElement::_setChildAtIndexTime { 0 }; +AtomicUIntStat OctreeElement::_setChildAtIndexCalls { 0 }; +AtomicUIntStat OctreeElement::_externalChildrenCount { 0 }; AtomicUIntStat OctreeElement::_childrenCount[NUMBER_OF_CHILDREN + 1] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 }; OctreeElementPointer OctreeElement::getChildAtIndex(int childIndex) const { diff --git a/libraries/octree/src/OctreePacketData.cpp b/libraries/octree/src/OctreePacketData.cpp index 5ed891fc7c..7a255ad648 100644 --- a/libraries/octree/src/OctreePacketData.cpp +++ b/libraries/octree/src/OctreePacketData.cpp @@ -16,12 +16,12 @@ #include "OctreePacketData.h" bool OctreePacketData::_debug = false; -AtomicUIntStat OctreePacketData::_totalBytesOfOctalCodes = 0; -AtomicUIntStat OctreePacketData::_totalBytesOfBitMasks = 0; -AtomicUIntStat OctreePacketData::_totalBytesOfColor = 0; -AtomicUIntStat OctreePacketData::_totalBytesOfValues = 0; -AtomicUIntStat OctreePacketData::_totalBytesOfPositions = 0; -AtomicUIntStat OctreePacketData::_totalBytesOfRawData = 0; +AtomicUIntStat OctreePacketData::_totalBytesOfOctalCodes { 0 }; +AtomicUIntStat OctreePacketData::_totalBytesOfBitMasks { 0 }; +AtomicUIntStat OctreePacketData::_totalBytesOfColor { 0 }; +AtomicUIntStat OctreePacketData::_totalBytesOfValues { 0 }; +AtomicUIntStat OctreePacketData::_totalBytesOfPositions { 0 }; +AtomicUIntStat OctreePacketData::_totalBytesOfRawData { 0 }; OctreePacketData::OctreePacketData(bool enableCompression, int targetSize) { changeSettings(enableCompression, targetSize); // does reset... From 33110eda30e2e0eb91192b91a31f79e4dff1df98 Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Thu, 12 Nov 2015 13:25:50 -0800 Subject: [PATCH 3/5] fix mac compiler error --- libraries/octree/src/OctreeElement.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/octree/src/OctreeElement.cpp b/libraries/octree/src/OctreeElement.cpp index 48172bd9fe..74d23f14cc 100644 --- a/libraries/octree/src/OctreeElement.cpp +++ b/libraries/octree/src/OctreeElement.cpp @@ -250,7 +250,7 @@ AtomicUIntStat OctreeElement::_getChildAtIndexCalls { 0 }; AtomicUIntStat OctreeElement::_setChildAtIndexTime { 0 }; AtomicUIntStat OctreeElement::_setChildAtIndexCalls { 0 }; AtomicUIntStat OctreeElement::_externalChildrenCount { 0 }; -AtomicUIntStat OctreeElement::_childrenCount[NUMBER_OF_CHILDREN + 1] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 }; +AtomicUIntStat OctreeElement::_childrenCount[NUMBER_OF_CHILDREN + 1] { 0, 0, 0, 0, 0, 0, 0, 0, 0 }; OctreeElementPointer OctreeElement::getChildAtIndex(int childIndex) const { #ifdef SIMPLE_CHILD_ARRAY From 8bfb368a61021975ffd1d4fcfae06aa5049075a0 Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Thu, 12 Nov 2015 13:32:43 -0800 Subject: [PATCH 4/5] fix mac compiler error --- libraries/octree/src/OctreeElement.cpp | 10 +++++----- libraries/octree/src/OctreePacketData.cpp | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/libraries/octree/src/OctreeElement.cpp b/libraries/octree/src/OctreeElement.cpp index 74d23f14cc..2cff868035 100644 --- a/libraries/octree/src/OctreeElement.cpp +++ b/libraries/octree/src/OctreeElement.cpp @@ -28,11 +28,11 @@ #include "OctreeLogging.h" #include "SharedUtil.h" -AtomicUIntStat OctreeElement::_octreeMemoryUsage = 0; -AtomicUIntStat OctreeElement::_octcodeMemoryUsage = 0; -AtomicUIntStat OctreeElement::_externalChildrenMemoryUsage = 0; -AtomicUIntStat OctreeElement::_voxelNodeCount = 0; -AtomicUIntStat OctreeElement::_voxelNodeLeafCount = 0; +AtomicUIntStat OctreeElement::_octreeMemoryUsage { 0 }; +AtomicUIntStat OctreeElement::_octcodeMemoryUsage { 0 }; +AtomicUIntStat OctreeElement::_externalChildrenMemoryUsage { 0 }; +AtomicUIntStat OctreeElement::_voxelNodeCount { 0 }; +AtomicUIntStat OctreeElement::_voxelNodeLeafCount { 0 }; void OctreeElement::resetPopulationStatistics() { _voxelNodeCount = 0; diff --git a/libraries/octree/src/OctreePacketData.cpp b/libraries/octree/src/OctreePacketData.cpp index 7a255ad648..811e96fcf4 100644 --- a/libraries/octree/src/OctreePacketData.cpp +++ b/libraries/octree/src/OctreePacketData.cpp @@ -488,8 +488,8 @@ bool OctreePacketData::appendRawData(QByteArray data) { } -AtomicUIntStat OctreePacketData::_compressContentTime = 0; -AtomicUIntStat OctreePacketData::_compressContentCalls = 0; +AtomicUIntStat OctreePacketData::_compressContentTime { 0 }; +AtomicUIntStat OctreePacketData::_compressContentCalls { 0 }; bool OctreePacketData::compressContent() { PerformanceWarning warn(false, "OctreePacketData::compressContent()", false, &_compressContentTime, &_compressContentCalls); From da651ac47555c0aa31c48e7406cedf45a61a54c5 Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Thu, 12 Nov 2015 13:47:27 -0800 Subject: [PATCH 5/5] fix mac compiler error --- libraries/octree/src/OctreeElement.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/octree/src/OctreeElement.cpp b/libraries/octree/src/OctreeElement.cpp index 2cff868035..5f03627f1a 100644 --- a/libraries/octree/src/OctreeElement.cpp +++ b/libraries/octree/src/OctreeElement.cpp @@ -250,7 +250,7 @@ AtomicUIntStat OctreeElement::_getChildAtIndexCalls { 0 }; AtomicUIntStat OctreeElement::_setChildAtIndexTime { 0 }; AtomicUIntStat OctreeElement::_setChildAtIndexCalls { 0 }; AtomicUIntStat OctreeElement::_externalChildrenCount { 0 }; -AtomicUIntStat OctreeElement::_childrenCount[NUMBER_OF_CHILDREN + 1] { 0, 0, 0, 0, 0, 0, 0, 0, 0 }; +AtomicUIntStat OctreeElement::_childrenCount[NUMBER_OF_CHILDREN + 1]; OctreeElementPointer OctreeElement::getChildAtIndex(int childIndex) const { #ifdef SIMPLE_CHILD_ARRAY