Reset ACK in ctor

This commit is contained in:
Atlante45 2017-12-13 16:55:08 -08:00 committed by Stephen Birarda
parent b2beeae6b1
commit 702d2c34a5
3 changed files with 15 additions and 11 deletions

View file

@ -116,14 +116,11 @@ SendQueue& Connection::getSendQueue() {
if (!_hasReceivedHandshakeACK) { if (!_hasReceivedHandshakeACK) {
// First time creating a send queue for this connection // First time creating a send queue for this connection
_sendQueue = SendQueue::create(_parentSocket, _destination, _initialSequenceNumber - 1); _sendQueue = SendQueue::create(_parentSocket, _destination, _initialSequenceNumber - 1, _hasReceivedHandshakeACK);
_lastReceivedACK = _sendQueue->getCurrentSequenceNumber(); _lastReceivedACK = _sendQueue->getCurrentSequenceNumber();
} else { } else {
// Connection already has a handshake from a previous send queue // Connection already has a handshake from a previous send queue
_sendQueue = SendQueue::create(_parentSocket, _destination, _lastReceivedACK); _sendQueue = SendQueue::create(_parentSocket, _destination, _lastReceivedACK, _hasReceivedHandshakeACK);
// This connection has already gone through the handshake
// bypass it in the send queue
_sendQueue->handshakeACK();
} }
#ifdef UDT_CONNECTION_DEBUG #ifdef UDT_CONNECTION_DEBUG

View file

@ -61,10 +61,10 @@ private:
Mutex2& _mutex2; Mutex2& _mutex2;
}; };
std::unique_ptr<SendQueue> SendQueue::create(Socket* socket, HifiSockAddr destination, SequenceNumber currentSequenceNumber) { std::unique_ptr<SendQueue> SendQueue::create(Socket* socket, HifiSockAddr destination, SequenceNumber currentSequenceNumber, bool hasReceivedHandshakeACK) {
Q_ASSERT_X(socket, "SendQueue::create", "Must be called with a valid Socket*"); Q_ASSERT_X(socket, "SendQueue::create", "Must be called with a valid Socket*");
auto queue = std::unique_ptr<SendQueue>(new SendQueue(socket, destination, currentSequenceNumber)); auto queue = std::unique_ptr<SendQueue>(new SendQueue(socket, destination, currentSequenceNumber, hasReceivedHandshakeACK));
// Setup queue private thread // Setup queue private thread
QThread* thread = new QThread; QThread* thread = new QThread;
@ -83,14 +83,21 @@ std::unique_ptr<SendQueue> SendQueue::create(Socket* socket, HifiSockAddr destin
return queue; return queue;
} }
SendQueue::SendQueue(Socket* socket, HifiSockAddr dest, SequenceNumber currentSequenceNumber) : SendQueue::SendQueue(Socket* socket, HifiSockAddr dest, SequenceNumber currentSequenceNumber, bool hasReceivedHandshakeACK) :
_socket(socket), _socket(socket),
_destination(dest) _destination(dest)
{ {
// set our member variables from current sequence number // set our member variables from current sequence number
_currentSequenceNumber = currentSequenceNumber; _currentSequenceNumber = currentSequenceNumber;
_atomicCurrentSequenceNumber = uint32_t(_currentSequenceNumber); _atomicCurrentSequenceNumber = uint32_t(_currentSequenceNumber);
_lastACKSequenceNumber = uint32_t(_currentSequenceNumber) - 1;
if (hasReceivedHandshakeACK) {
_lastACKSequenceNumber = uint32_t(_currentSequenceNumber);
} else {
_lastACKSequenceNumber = uint32_t(_currentSequenceNumber - 1);
}
_hasReceivedHandshakeACK = hasReceivedHandshakeACK;
// default the last receiver response to the current time // default the last receiver response to the current time
_lastReceiverResponse = QDateTime::currentMSecsSinceEpoch(); _lastReceiverResponse = QDateTime::currentMSecsSinceEpoch();

View file

@ -50,7 +50,7 @@ public:
Stopped Stopped
}; };
static std::unique_ptr<SendQueue> create(Socket* socket, HifiSockAddr destination, SequenceNumber currentSequenceNumber); static std::unique_ptr<SendQueue> create(Socket* socket, HifiSockAddr destination, SequenceNumber currentSequenceNumber, bool hasReceivedHandshakeACK);
virtual ~SendQueue(); virtual ~SendQueue();
@ -91,7 +91,7 @@ private slots:
void run(); void run();
private: private:
SendQueue(Socket* socket, HifiSockAddr dest, SequenceNumber currentSequenceNumber); SendQueue(Socket* socket, HifiSockAddr dest, SequenceNumber currentSequenceNumber, bool hasReceivedHandshakeACK);
SendQueue(SendQueue& other) = delete; SendQueue(SendQueue& other) = delete;
SendQueue(SendQueue&& other) = delete; SendQueue(SendQueue&& other) = delete;