edit nacks seem to be working;

added mutex for releaseQueuedPacket() to prevent duplicate packets being
queued up due to the steps of queueing the packet and clearing it not
being atomic.
This commit is contained in:
wangyix 2014-06-17 10:42:56 -07:00
parent 06f8464ec9
commit dc71f87ea4
4 changed files with 29 additions and 7 deletions

View file

@ -282,7 +282,7 @@ SingleSenderStats::SingleSenderStats()
void SingleSenderStats::trackInboundPacket(unsigned short int incomingSequence, quint64 transitTime,
int editsInPacket, quint64 processTime, quint64 lockWaitTime) {
printf("\t\t tracked seq %d\n", incomingSequence);
printf("\t\t tracked seq %hu\n", incomingSequence);
const int UINT16_RANGE = UINT16_MAX + 1;

View file

@ -21,7 +21,7 @@ SentPacketHistory::SentPacketHistory(int size)
void SentPacketHistory::packetSent(uint16_t sequenceNumber, const QByteArray& packet) {
if (sequenceNumber != 0 && sequenceNumber != _newestSequenceNumber + 1) {
printf("\t packet history received unexpected seq number! prev: %d received: %d\n", _newestSequenceNumber, sequenceNumber);
printf("\t\tpacket history received unexpected seq number! prev: %hu received: %hu **************** \n", _newestSequenceNumber, sequenceNumber);
}

View file

@ -104,12 +104,28 @@ void OctreeEditPacketSender::queuePacketToNode(const QUuid& nodeUUID, const unsi
// extract sequence number and add packet to history
int numBytesPacketHeader = numBytesForPacketHeader(packet);
const char* dataAt = reinterpret_cast<const char*>(packet.data());
unsigned short int sequence = (*((unsigned short int*)(dataAt + numBytesPacketHeader)));
const char* dataAt = reinterpret_cast<const char*>(packet.data()) + numBytesPacketHeader;
unsigned short int sequence = *((unsigned short int*)dataAt);
/*
// debug
dataAt += sizeof(unsigned short int);
// extract time stamp
quint64 sentTime = *((quint64*)dataAt);
dataAt += sizeof(quint64);
PacketType type = packetTypeForPacket(packet);
printf("adding packet to history. size: %d\n", packet.length());
printf("type: %d, seq: %hu, time: %llu\n", (unsigned char)type, sequence, sentTime);
printf("destination node: %s\n", nodeUUID.toString().toLatin1().data());
fflush(stdout);
*/
_sentPacketHistories[nodeUUID].packetSent(sequence, packet);
if (!send) {
printf("\t\t dropped packet %d !!!\n", sequence);
printf("\t dropped packet %d !!! ---------------------------\n", sequence);
}
// debugging output...
@ -307,11 +323,15 @@ void OctreeEditPacketSender::releaseQueuedMessages() {
}
void OctreeEditPacketSender::releaseQueuedPacket(EditPacketBuffer& packetBuffer) {
_releaseQueuedPacketMutex.lock();
if (packetBuffer._currentSize > 0 && packetBuffer._currentType != PacketTypeUnknown) {
queuePacketToNode(packetBuffer._nodeUUID, &packetBuffer._currentBuffer[0], packetBuffer._currentSize);
packetBuffer._currentSize = 0;
packetBuffer._currentType = PacketTypeUnknown;
}
packetBuffer._currentSize = 0;
packetBuffer._currentType = PacketTypeUnknown;
_releaseQueuedPacketMutex.unlock();
}
void OctreeEditPacketSender::initializePacket(EditPacketBuffer& packetBuffer, PacketType type) {

View file

@ -122,5 +122,7 @@ protected:
// TODO: garbage-collect this and _pendingEditPackets
QHash<QUuid, SentPacketHistory> _sentPacketHistories;
QMutex _releaseQueuedPacketMutex;
};
#endif // hifi_OctreeEditPacketSender_h