added code for AC to send nack packets; no locking yet

This commit is contained in:
wangyix 2014-06-12 11:37:05 -07:00
parent 7955979599
commit 15bd0878c4
6 changed files with 79 additions and 2 deletions

View file

@ -212,4 +212,4 @@ void SingleSenderStats::trackInboundPacket(unsigned short int incomingSequence,
_totalLockWaitTime += lockWaitTime;
_totalElementsInPacket += editsInPacket;
_totalPackets++;
}
}

View file

@ -35,6 +35,7 @@ public:
void trackInboundPacket(unsigned short int incomingSequence, quint64 transitTime,
int editsInPacket, quint64 processTime, quint64 lockWaitTime);
const QSet<unsigned short int>& getMissingSequenceNumbers() const { return _missingSequenceNumbers; }
quint64 _totalTransitTime;
@ -71,6 +72,7 @@ public:
void resetStats();
NodeToSenderStatsMap& getSingleSenderStats() { return _singleSenderStats; }
const NodeToSenderStatsMap& getSingleSenderStats() const { return _singleSenderStats; }
protected:
virtual void processPacket(const SharedNodePointer& sendingNode, const QByteArray& packet);

View file

@ -85,6 +85,7 @@ bool OctreeSendThread::process() {
if (nodeData && !nodeData->isShuttingDown()) {
bool viewFrustumChanged = nodeData->updateCurrentViewFrustum();
packetDistributor(nodeData, viewFrustumChanged);
sendNack(nodeData);
}
}
}
@ -111,6 +112,75 @@ bool OctreeSendThread::process() {
return isStillRunning(); // keep running till they terminate us
}
int OctreeSendThread::sendNack(OctreeQueryNode* nodeData) {
// if we're shutting down, then exit early
if (nodeData->isShuttingDown()) {
return 0;
}
const OctreeInboundPacketProcessor* myServerPacketProcessor = _myServer->getInboundPacketProcessor();
// if there are packets from _node that are waiting to be processed,
// don't send a NACK since the missing packets may be among those waiting packets.
if (myServerPacketProcessor->hasPacketsToProcessFrom(_node)) {
return 0;
}
// lock unlock required ????????? prolly: _singleSenderStats may have our node's entry deleted during this or something
// maybe just make a copy instead!!
// lock
const QSet<unsigned short int> missingSequenceNumbersFromNode = myServerPacketProcessor
->getSingleSenderStats().at(_node->getUUID()).getMissingSequenceNumbers();
// check if there are any sequence numbers that need to be nacked
int numSequenceNumbersAvailable = missingSequenceNumbersFromNode.size();
if (numSequenceNumbersAvailable == 0) {
//unlock
return 0;
}
// construct nack packet
char packet[MAX_PACKET_SIZE];
char* dataAt = packet;
int bytesRemaining = MAX_PACKET_SIZE;
// pack header
int numBytesPacketHeader = populatePacketHeader(packet, PacketTypeOctreeEditNack);
dataAt += numBytesPacketHeader;
bytesRemaining -= numBytesPacketHeader;
int numSequenceNumbersRoomFor = (bytesRemaining - sizeof(uint16_t)) / sizeof(unsigned short int);
// calculate and pack the number of sequence numbers
uint16_t numSequenceNumbers = std::min(numSequenceNumbersAvailable, numSequenceNumbersRoomFor);
uint16_t* numSequenceNumbersAt = (uint16_t*)dataAt;
*numSequenceNumbersAt = numSequenceNumbers;
dataAt += sizeof(uint16_t);
// pack sequence numbers
QSet<unsigned short int>::const_iterator begin = missingSequenceNumbersFromNode.begin(), end = missingSequenceNumbersFromNode.end();
for (QSet<unsigned short int>::const_iterator i = begin; i != end; i++) {
unsigned short int* sequenceNumberAt = (unsigned short int*)dataAt;
*sequenceNumberAt = *i;
dataAt += sizeof(unsigned short int);
}
// send it
OctreeServer::didCallWriteDatagram(this);
NodeList::getInstance()->writeDatagram((char*)packet, dataAt - packet, _node);
return 1;
}
quint64 OctreeSendThread::_usleepTime = 0;
quint64 OctreeSendThread::_usleepCalls = 0;

View file

@ -50,6 +50,8 @@ private:
int handlePacketSend(OctreeQueryNode* nodeData, int& trueBytesSent, int& truePacketsSent);
int packetDistributor(OctreeQueryNode* nodeData, bool viewFrustumChanged);
int sendNack(OctreeQueryNode* nodeData);
OctreePacketData _packetData;

View file

@ -51,6 +51,8 @@ public:
int getPacketsPerClientPerSecond() const { return getPacketsPerClientPerInterval() * INTERVALS_PER_SECOND; }
int getPacketsTotalPerInterval() const { return _packetsTotalPerInterval; }
int getPacketsTotalPerSecond() const { return getPacketsTotalPerInterval() * INTERVALS_PER_SECOND; }
const OctreeInboundPacketProcessor* getInboundPacketProcessor() const { return _octreeInboundPacketProcessor; }
static int getCurrentClientCount() { return _clientCount; }
static void clientConnected() { _clientCount++; }

View file

@ -66,7 +66,8 @@ enum PacketType {
PacketTypeModelAddOrEdit,
PacketTypeModelErase,
PacketTypeModelAddResponse,
PacketTypeOctreeDataNack
PacketTypeOctreeDataNack,
PacketTypeOctreeEditNack,
};
typedef char PacketVersion;