added octree scene stats locking and unlocking

This commit is contained in:
wangyix 2014-06-09 11:14:02 -07:00
parent 5286090812
commit 3bc457d4d2
4 changed files with 49 additions and 35 deletions

View file

@ -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;
}
}

View file

@ -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(); // ???

View file

@ -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);

View file

@ -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<uint16_t> _missingSequenceNumbers;
QSet<uint16_t> _sequenceNumbersToNack;
QSet<OCTREE_PACKET_SEQUENCE> _missingSequenceNumbers;
QSet<OCTREE_PACKET_SEQUENCE> _sequenceNumbersToNack;
SimpleMovingAverage _incomingFlightTimeAverage;
// features related items