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/6] 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/6] 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/6] 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/6] 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/6] 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 From 83e7eb58b9a0877450ac1fd867e94f11cb4ddd09 Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Thu, 12 Nov 2015 16:36:06 -0800 Subject: [PATCH 6/6] add special packets and nack packets to outbound stats --- .../src/octree/OctreeInboundPacketProcessor.cpp | 6 +++++- assignment-client/src/octree/OctreeSendThread.cpp | 12 +++++++++++- assignment-client/src/octree/OctreeSendThread.h | 3 +++ assignment-client/src/octree/OctreeServer.cpp | 10 ++++++++++ 4 files changed, 29 insertions(+), 2 deletions(-) diff --git a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp index 92c08152f7..0cdc7f9921 100644 --- a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp +++ b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp @@ -240,6 +240,7 @@ int OctreeInboundPacketProcessor::sendNackPackets() { auto nodeList = DependencyManager::get(); int packetsSent = 0; + int totalBytesSent = 0; NodeToSenderStatsMapIterator i = _singleSenderStats.begin(); while (i != _singleSenderStats.end()) { @@ -291,12 +292,15 @@ int OctreeInboundPacketProcessor::sendNackPackets() { packetsSent += nackPacketList->getNumPackets(); // send the list of nack packets - nodeList->sendPacketList(std::move(nackPacketList), *destinationNode); + totalBytesSent += nodeList->sendPacketList(std::move(nackPacketList), *destinationNode); } ++i; } + OctreeSendThread::_totalPackets += packetsSent; + OctreeSendThread::_totalBytes += totalBytesSent; + return packetsSent; } diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index 1906cb7979..1d92ed917f 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -118,6 +118,10 @@ AtomicUIntStat OctreeSendThread::_totalBytes { 0 }; AtomicUIntStat OctreeSendThread::_totalWastedBytes { 0 }; AtomicUIntStat OctreeSendThread::_totalPackets { 0 }; +AtomicUIntStat OctreeSendThread::_totalSpecialBytes { 0 }; +AtomicUIntStat OctreeSendThread::_totalSpecialPackets { 0 }; + + int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytesSent, int& truePacketsSent) { OctreeServer::didHandlePacketSend(this); @@ -580,11 +584,17 @@ int OctreeSendThread::packetDistributor(OctreeQueryNode* nodeData, bool viewFrus // send the environment packet // TODO: should we turn this into a while loop to better handle sending multiple special packets if (_myServer->hasSpecialPacketsToSend(_node) && !nodeData->isShuttingDown()) { - int specialPacketsSent; + int specialPacketsSent = 0; trueBytesSent += _myServer->sendSpecialPackets(_node, nodeData, specialPacketsSent); nodeData->resetOctreePacket(); // because nodeData's _sequenceNumber has changed truePacketsSent += specialPacketsSent; packetsSentThisInterval += specialPacketsSent; + + _totalPackets += specialPacketsSent; + _totalBytes += trueBytesSent; + + _totalSpecialPackets += specialPacketsSent; + _totalSpecialBytes += trueBytesSent; } // Re-send packets that were nacked by the client diff --git a/assignment-client/src/octree/OctreeSendThread.h b/assignment-client/src/octree/OctreeSendThread.h index 69ea0be567..6e640942e7 100644 --- a/assignment-client/src/octree/OctreeSendThread.h +++ b/assignment-client/src/octree/OctreeSendThread.h @@ -38,6 +38,9 @@ public: static AtomicUIntStat _totalWastedBytes; static AtomicUIntStat _totalPackets; + static AtomicUIntStat _totalSpecialBytes; + static AtomicUIntStat _totalSpecialPackets; + static AtomicUIntStat _usleepTime; static AtomicUIntStat _usleepCalls; diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 818d54ee97..ad3df11474 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -415,6 +415,9 @@ bool OctreeServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url quint64 totalBytesOfBitMasks = OctreePacketData::getTotalBytesOfBitMasks(); quint64 totalBytesOfColor = OctreePacketData::getTotalBytesOfColor(); + quint64 totalOutboundSpecialPackets = OctreeSendThread::_totalSpecialPackets; + quint64 totalOutboundSpecialBytes = OctreeSendThread::_totalSpecialBytes; + statsString += QString(" Total Clients Connected: %1 clients\r\n") .arg(locale.toString((uint)getCurrentClientCount()).rightJustified(COLUMN_WIDTH, ' ')); @@ -606,6 +609,13 @@ bool OctreeServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url .arg(locale.toString((uint)totalOutboundPackets).rightJustified(COLUMN_WIDTH, ' ')); statsString += QString(" Total Outbound Bytes: %1 bytes\r\n") .arg(locale.toString((uint)totalOutboundBytes).rightJustified(COLUMN_WIDTH, ' ')); + + statsString += QString(" Total Outbound Special Packets: %1 packets\r\n") + .arg(locale.toString((uint)totalOutboundSpecialPackets).rightJustified(COLUMN_WIDTH, ' ')); + statsString += QString(" Total Outbound Special Bytes: %1 bytes\r\n") + .arg(locale.toString((uint)totalOutboundSpecialBytes).rightJustified(COLUMN_WIDTH, ' ')); + + statsString += QString(" Total Wasted Bytes: %1 bytes\r\n") .arg(locale.toString((uint)totalWastedBytes).rightJustified(COLUMN_WIDTH, ' ')); statsString += QString().sprintf(" Total OctalCode Bytes: %s bytes (%5.2f%%)\r\n",