From 08373f8b1ebc6fbd7777375ffbf7d8d3028e2a51 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Fri, 5 Dec 2014 15:02:35 -0800 Subject: [PATCH] Fix for message upload stats. --- .../metavoxels/src/DatagramSequencer.cpp | 24 ++++++++++++------- libraries/metavoxels/src/DatagramSequencer.h | 8 ++++++- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/libraries/metavoxels/src/DatagramSequencer.cpp b/libraries/metavoxels/src/DatagramSequencer.cpp index 1aeef8e450..94b92910ee 100644 --- a/libraries/metavoxels/src/DatagramSequencer.cpp +++ b/libraries/metavoxels/src/DatagramSequencer.cpp @@ -707,8 +707,9 @@ void ReliableChannel::endMessage() { quint32 length = _buffer.pos() - _messageLengthPlaceholder; _buffer.writeBytes(_messageLengthPlaceholder, sizeof(quint32), (const char*)&length); - _messageReceivedOffset = getBytesWritten(); - _messageSize = length; + + pruneOutgoingMessageStats(); + _outgoingMessageStats.append(OffsetSizePair(getBytesWritten(), length)); } void ReliableChannel::sendMessage(const QVariant& message) { @@ -717,12 +718,14 @@ void ReliableChannel::sendMessage(const QVariant& message) { endMessage(); } -bool ReliableChannel::getMessageSendProgress(int& sent, int& total) const { - if (!_messagesEnabled || _offset >= _messageReceivedOffset) { +bool ReliableChannel::getMessageSendProgress(int& sent, int& total) { + pruneOutgoingMessageStats(); + if (!_messagesEnabled || _outgoingMessageStats.isEmpty()) { return false; } - sent = qMax(0, _messageSize - (_messageReceivedOffset - _offset)); - total = _messageSize; + const OffsetSizePair& stat = _outgoingMessageStats.first(); + sent = qMax(0, stat.second - (stat.first - _offset)); + total = stat.second; return true; } @@ -762,8 +765,7 @@ ReliableChannel::ReliableChannel(DatagramSequencer* sequencer, int index, bool o _offset(0), _writePosition(0), _writePositionResetPacketNumber(0), - _messagesEnabled(true), - _messageReceivedOffset(0) { + _messagesEnabled(true) { _buffer.open(output ? QIODevice::WriteOnly : QIODevice::ReadOnly); _dataStream.setByteOrder(QDataStream::LittleEndian); @@ -934,3 +936,9 @@ void ReliableChannel::readData(QDataStream& in) { } } +void ReliableChannel::pruneOutgoingMessageStats() { + while (!_outgoingMessageStats.isEmpty() && _offset >= _outgoingMessageStats.first().first) { + _outgoingMessageStats.removeFirst(); + } +} + diff --git a/libraries/metavoxels/src/DatagramSequencer.h b/libraries/metavoxels/src/DatagramSequencer.h index 02fbd0f365..7f780d7b4d 100644 --- a/libraries/metavoxels/src/DatagramSequencer.h +++ b/libraries/metavoxels/src/DatagramSequencer.h @@ -384,7 +384,7 @@ public: /// Determines the number of bytes uploaded towards the currently pending message. /// \return true if there is a message pending, in which case the sent and total arguments will be set - bool getMessageSendProgress(int& sent, int& total) const; + bool getMessageSendProgress(int& sent, int& total); /// Determines the number of bytes downloaded towards the currently pending message. /// \return true if there is a message pending, in which case the received and total arguments will be set @@ -416,6 +416,8 @@ private: void readData(QDataStream& in); + void pruneOutgoingMessageStats(); + int _index; bool _output; CircularBuffer _buffer; @@ -430,6 +432,10 @@ private: SpanList _acknowledged; bool _messagesEnabled; int _messageLengthPlaceholder; ///< the location in the buffer of the message length for the current message + + typedef QPair OffsetSizePair; + QVector _outgoingMessageStats; + int _messageReceivedOffset; ///< when reached, indicates that the most recent sent message has been received int _messageSize; ///< the size of the most recent sent message; only valid when _messageReceivedOffset has been set };