From 3bc457d4d2ea981f3c12bb8605bfe078f9c180bf Mon Sep 17 00:00:00 2001 From: wangyix Date: Mon, 9 Jun 2014 11:14:02 -0700 Subject: [PATCH] added octree scene stats locking and unlocking --- .../src/octree/OctreeQueryNode.cpp | 8 +-- .../src/octree/OctreeSendThread.cpp | 3 - interface/src/Application.cpp | 69 ++++++++++++------- libraries/octree/src/OctreeSceneStats.h | 4 +- 4 files changed, 49 insertions(+), 35 deletions(-) diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index cf01e9a864..5cfe5501e1 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -382,11 +382,9 @@ bool OctreeQueryNode::hasNextNackedPacket() const { } const QByteArray* OctreeQueryNode::getNextNackedPacket() { - if (!_nackedSequenceNumbers.isEmpty()) { - const QByteArray* nextPacket = _sentPacketHistory.getPacket(_nackedSequenceNumbers.first()); - _nackedSequenceNumbers.pop_front(); - return nextPacket; // could be null + // could return null if packet is not in the history + return _sentPacketHistory.getPacket(_nackedSequenceNumbers.takeFirst()); } return NULL; -} \ No newline at end of file +} diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index cb8a773a64..6f39cd28dc 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -288,18 +288,15 @@ NodeList::getInstance()->writeDatagram2(nodeData->getSequenceNumber(), (char*)no int OctreeSendThread::resendNackedPackets(OctreeQueryNode* nodeData) { const int MAX_PACKETS_RESEND = 10; - int packetsSent = 0; const QByteArray* packet; while (nodeData->hasNextNackedPacket() && packetsSent < MAX_PACKETS_RESEND) { packet = nodeData->getNextNackedPacket(); - // packet will be NULL if it's not in nodeData's packet history if (packet) { NodeList::getInstance()->writeDatagram(*packet, _node); packetsSent++; - // ?????? _totalBytes += packet->size(); _totalPackets++; _totalWastedBytes += MAX_PACKET_SIZE - packet->size(); // ??? diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 87e82b21a2..f8152bb62b 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2107,6 +2107,21 @@ void Application::updateMyAvatar(float deltaTime) { } } +/*/ Attempt to identify the sender from it's address. + if (sendingNode) { + QUuid nodeUUID = sendingNode->getUUID(); + + // now that we know the node ID, let's add these stats to the stats for that node... + _octreeSceneStatsLock.lockForWrite(); + if (_octreeServerSceneStats.find(nodeUUID) != _octreeServerSceneStats.end()) { + OctreeSceneStats& stats = _octreeServerSceneStats[nodeUUID]; + stats.trackIncomingOctreePacket(packet, wasStatsPacket, sendingNode->getClockSkewUsec()); + } + _octreeSceneStatsLock.unlock(); + } + */ + + void Application::sendNack() { @@ -2122,13 +2137,6 @@ void Application::sendNack() { || node->getType() == NodeType::ModelServer) ) { - //_octreeSceneStatsLock.lockForWrite(); - - OctreeSceneStats& stats = _octreeServerSceneStats[node->getUUID()]; - int numSequenceNumbersAvailable = stats.getNumSequenceNumbersToNack(); - if (numSequenceNumbersAvailable == 0) - continue; - char* dataAt = packet; int bytesRemaining = MAX_PACKET_SIZE; @@ -2136,28 +2144,39 @@ void Application::sendNack() { int numBytesPacketHeader = populatePacketHeader(packet, PacketTypeOctreeDataNack); dataAt += numBytesPacketHeader; bytesRemaining -= numBytesPacketHeader; - - int numPacketsRoomFor = (bytesRemaining - sizeof(uint16_t)) / sizeof(OCTREE_PACKET_SEQUENCE); + int numSequenceNumbersRoomFor = (bytesRemaining - sizeof(uint16_t)) / sizeof(OCTREE_PACKET_SEQUENCE); - // calculate and pack number of sequence numbers - uint16_t numSequenceNumbers = min(numSequenceNumbersAvailable, numPacketsRoomFor); - uint16_t* numSequenceNumbersAt = (uint16_t*)dataAt; - *numSequenceNumbersAt = numSequenceNumbers; - dataAt += sizeof(uint16_t); + QUuid nodeUUID = node->getUUID(); - // pack sequence numbers -//printf("\n\t sending nack...\n"); -//printf("\t\t packed %d seq #s:", numSequenceNumbers); - for (int i = 0; i < numSequenceNumbers; i++) { - OCTREE_PACKET_SEQUENCE* sequenceNumberAt = (OCTREE_PACKET_SEQUENCE*)dataAt; - *sequenceNumberAt = stats.getNextSequenceNumberToNack(); - dataAt += sizeof(OCTREE_PACKET_SEQUENCE); -//printf(" %d,", *sequenceNumberAt); + _octreeSceneStatsLock.lockForWrite(); + if (_octreeServerSceneStats.find(nodeUUID) != _octreeServerSceneStats.end()) { + OctreeSceneStats& stats = _octreeServerSceneStats[nodeUUID]; + + int numSequenceNumbersAvailable = stats.getNumSequenceNumbersToNack(); + if (numSequenceNumbersAvailable == 0) { + _octreeSceneStatsLock.unlock(); + continue; + } + + // calculate and pack number of sequence numbers + uint16_t numSequenceNumbers = min(numSequenceNumbersAvailable, numSequenceNumbersRoomFor); + uint16_t* numSequenceNumbersAt = (uint16_t*)dataAt; + *numSequenceNumbersAt = numSequenceNumbers; + dataAt += sizeof(uint16_t); + + // pack sequence numbers + //printf("\n\t sending nack...\n"); + //printf("\t\t packed %d seq #s:", numSequenceNumbers); + for (int i = 0; i < numSequenceNumbers; i++) { + OCTREE_PACKET_SEQUENCE* sequenceNumberAt = (OCTREE_PACKET_SEQUENCE*)dataAt; + *sequenceNumberAt = stats.getNextSequenceNumberToNack(); + dataAt += sizeof(OCTREE_PACKET_SEQUENCE); + //printf(" %d,", *sequenceNumberAt); + } + //printf("\n"); } -//printf("\n"); - - //_octreeSceneStatsLock.unlock(); + _octreeSceneStatsLock.unlock(); // make sure we still have an active socket???? nodeList->writeUnverifiedDatagram(packet, dataAt-packet, node); diff --git a/libraries/octree/src/OctreeSceneStats.h b/libraries/octree/src/OctreeSceneStats.h index ca9bf7c74b..ac9b1606c1 100644 --- a/libraries/octree/src/OctreeSceneStats.h +++ b/libraries/octree/src/OctreeSceneStats.h @@ -275,8 +275,8 @@ private: quint32 _incomingLate; /// out of order later than expected quint32 _incomingReallyLate; /// out of order and later than MAX_MISSING_SEQUENCE_OLD_AGE late quint32 _incomingPossibleDuplicate; /// out of order possibly a duplicate - QSet _missingSequenceNumbers; -QSet _sequenceNumbersToNack; + QSet _missingSequenceNumbers; +QSet _sequenceNumbersToNack; SimpleMovingAverage _incomingFlightTimeAverage; // features related items