diff --git a/libraries/networking/src/udt/CongestionControl.cpp b/libraries/networking/src/udt/CongestionControl.cpp index 2240f2c193..ea46d60acb 100644 --- a/libraries/networking/src/udt/CongestionControl.cpp +++ b/libraries/networking/src/udt/CongestionControl.cpp @@ -34,7 +34,6 @@ void CongestionControl::setPacketSendPeriod(double newSendPeriod) { } DefaultCC::DefaultCC() : - _lastRCTime(p_high_resolution_clock::now()), _slowStartLastAck(_sendCurrSeqNum), _lastDecreaseMaxSeq(SequenceNumber {SequenceNumber::MAX }) { diff --git a/libraries/networking/src/udt/CongestionControl.h b/libraries/networking/src/udt/CongestionControl.h index 5f9b64c1ad..fa1bf73ecf 100644 --- a/libraries/networking/src/udt/CongestionControl.h +++ b/libraries/networking/src/udt/CongestionControl.h @@ -108,7 +108,7 @@ public: private: void stopSlowStart(); // stops the slow start on loss or timeout - p_high_resolution_clock::time_point _lastRCTime = p_high_resolution_clock::time_point().min(); // last rate increase time + p_high_resolution_clock::time_point _lastRCTime = p_high_resolution_clock::now(); // last rate increase time bool _slowStart { true }; // if in slow start phase SequenceNumber _slowStartLastAck; // last ACKed seq num diff --git a/libraries/networking/src/udt/Connection.cpp b/libraries/networking/src/udt/Connection.cpp index 4aa785fa8c..2fb28f81ee 100644 --- a/libraries/networking/src/udt/Connection.cpp +++ b/libraries/networking/src/udt/Connection.cpp @@ -28,7 +28,6 @@ using namespace udt; using namespace std::chrono; Connection::Connection(Socket* parentSocket, HifiSockAddr destination, std::unique_ptr congestionControl) : - _connectionStart(p_high_resolution_clock::now()), _parentSocket(parentSocket), _destination(destination), _congestionControl(move(congestionControl)) @@ -222,7 +221,7 @@ void Connection::recordRetransmission() { } void Connection::sendACK(bool wasCausedBySyncTimeout) { - static p_high_resolution_clock::time_point lastACKSendTime = p_high_resolution_clock::time_point().min(); + static p_high_resolution_clock::time_point lastACKSendTime; auto currentTime = p_high_resolution_clock::now(); SequenceNumber nextACKNumber = nextACK(); @@ -278,11 +277,11 @@ void Connection::sendACK(bool wasCausedBySyncTimeout) { // pack in the receive speed and estimatedBandwidth ackPacket->writePrimitive(packetReceiveSpeed); ackPacket->writePrimitive(estimatedBandwidth); - - // record this as the last ACK send time - lastACKSendTime = p_high_resolution_clock::now(); } + // record this as the last ACK send time + lastACKSendTime = p_high_resolution_clock::now(); + // have the socket send off our packet _parentSocket->writeBasePacket(*ackPacket, _destination); @@ -534,7 +533,8 @@ void Connection::processACK(std::unique_ptr controlPacket) { // This will be the case if it has been longer than the sync interval OR // it looks like they haven't received our ACK2 for this ACK auto currentTime = p_high_resolution_clock::now(); - static p_high_resolution_clock::time_point lastACK2SendTime = p_high_resolution_clock::time_point().min(); + static p_high_resolution_clock::time_point lastACK2SendTime = + p_high_resolution_clock::now() - std::chrono::microseconds(_synInterval); microseconds sinceLastACK2 = duration_cast(currentTime - lastACK2SendTime); @@ -779,7 +779,7 @@ void Connection::resetReceiveState() { // clear the loss list and _lastNAKTime _lossList.clear(); - _lastNAKTime = p_high_resolution_clock::time_point().min(); + _lastNAKTime = p_high_resolution_clock::now(); // the _nakInterval need not be reset, that will happen on loss diff --git a/libraries/networking/src/udt/Connection.h b/libraries/networking/src/udt/Connection.h index 346f559165..2b1dec1ae9 100644 --- a/libraries/networking/src/udt/Connection.h +++ b/libraries/networking/src/udt/Connection.h @@ -114,13 +114,14 @@ private: int _nakInterval { -1 }; // NAK timeout interval, in microseconds, set on loss int _minNAKInterval { 100000 }; // NAK timeout interval lower bound, default of 100ms - p_high_resolution_clock::time_point _lastNAKTime = p_high_resolution_clock::time_point().min(); + p_high_resolution_clock::time_point _lastNAKTime = p_high_resolution_clock::now(); bool _hasReceivedHandshake { false }; // flag for receipt of handshake from server bool _hasReceivedHandshakeACK { false }; // flag for receipt of handshake ACK from client - p_high_resolution_clock::time_point _connectionStart = p_high_resolution_clock::time_point().min(); // holds the time_point for creation of this connection - p_high_resolution_clock::time_point _lastReceiveTime = p_high_resolution_clock::time_point().min(); // holds the last time we received anything from sender + p_high_resolution_clock::time_point _connectionStart = p_high_resolution_clock::now(); // holds the time_point for creation of this connection + p_high_resolution_clock::time_point _lastReceiveTime; // holds the last time we received anything from sender + bool _isReceivingData { false }; // flag used for expiry of receipt portion of connection LossList _lossList; // List of all missing packets diff --git a/libraries/networking/src/udt/PacketTimeWindow.cpp b/libraries/networking/src/udt/PacketTimeWindow.cpp index 51bba2c52c..915810b93e 100644 --- a/libraries/networking/src/udt/PacketTimeWindow.cpp +++ b/libraries/networking/src/udt/PacketTimeWindow.cpp @@ -93,15 +93,18 @@ int32_t PacketTimeWindow::getEstimatedBandwidth() const { } void PacketTimeWindow::onPacketArrival() { + // take the current time auto now = p_high_resolution_clock::now(); - // record the interval between this packet and the last one - _packetIntervals[_currentPacketInterval++] = duration_cast(now - _lastPacketTime).count(); - - // reset the currentPacketInterval index when it wraps - if (_currentPacketInterval == _numPacketIntervals) { - _currentPacketInterval = 0; + if (_packetIntervals.size() > 0) { + // record the interval between this packet and the last one + _packetIntervals[_currentPacketInterval++] = duration_cast(now - _lastPacketTime).count(); + + // reset the currentPacketInterval index when it wraps + if (_currentPacketInterval == _numPacketIntervals) { + _currentPacketInterval = 0; + } } // remember this as the last packet arrival time diff --git a/libraries/networking/src/udt/PacketTimeWindow.h b/libraries/networking/src/udt/PacketTimeWindow.h index 6030e6809f..6f7ed9f70f 100644 --- a/libraries/networking/src/udt/PacketTimeWindow.h +++ b/libraries/networking/src/udt/PacketTimeWindow.h @@ -42,8 +42,8 @@ private: std::vector _packetIntervals; // vector of microsecond intervals between packet arrivals std::vector _probeIntervals; // vector of microsecond intervals between probe pair arrivals - p_high_resolution_clock::time_point _lastPacketTime = p_high_resolution_clock::time_point().min(); // the time_point when last packet arrived - p_high_resolution_clock::time_point _firstProbeTime = p_high_resolution_clock::time_point().min(); // the time_point when first probe in pair arrived + p_high_resolution_clock::time_point _lastPacketTime = p_high_resolution_clock::now(); // the time_point when last packet arrived + p_high_resolution_clock::time_point _firstProbeTime = p_high_resolution_clock::now(); // the time_point when first probe in pair arrived }; }