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 b94317050c..1d92ed917f 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -112,12 +112,15 @@ 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 }; +AtomicUIntStat OctreeSendThread::_totalBytes { 0 }; +AtomicUIntStat OctreeSendThread::_totalWastedBytes { 0 }; +AtomicUIntStat OctreeSendThread::_totalPackets { 0 }; + +AtomicUIntStat OctreeSendThread::_totalSpecialBytes { 0 }; +AtomicUIntStat OctreeSendThread::_totalSpecialPackets { 0 }; -quint64 OctreeSendThread::_totalBytes = 0; -quint64 OctreeSendThread::_totalWastedBytes = 0; -quint64 OctreeSendThread::_totalPackets = 0; int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytesSent, int& truePacketsSent) { OctreeServer::didHandlePacketSend(this); @@ -581,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 78f480b5eb..6e640942e7 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,15 @@ 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 _totalSpecialBytes; + static AtomicUIntStat _totalSpecialPackets; + + static AtomicUIntStat _usleepTime; + static AtomicUIntStat _usleepCalls; protected: /// Implements generic processing behavior for this thread. 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", diff --git a/libraries/octree/src/OctreeElement.cpp b/libraries/octree/src/OctreeElement.cpp index 17ebe492ce..5f03627f1a 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,12 @@ bool OctreeElement::isParentOf(OctreeElementPointer possibleChild) const { return false; } -quint64 OctreeElement::_getChildAtIndexTime = 0; -quint64 OctreeElement::_getChildAtIndexCalls = 0; -quint64 OctreeElement::_setChildAtIndexTime = 0; -quint64 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::_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]; 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..811e96fcf4 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),