Skip to content

Commit b76c8b2

Browse files
authored
[core] Fixed CRcvBuffer::getAvailSize() may jump around. (#2490)
1 parent 71c3e40 commit b76c8b2

File tree

3 files changed

+6
-5
lines changed

3 files changed

+6
-5
lines changed

srtcore/buffer_rcv.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,9 +128,8 @@ class CRcvBuffer
128128
const int iRBufSeqNo = getStartSeqNo();
129129
if (CSeqNo::seqcmp(iRBufSeqNo, iFirstUnackSeqNo) >= 0) // iRBufSeqNo >= iFirstUnackSeqNo
130130
{
131-
// Full capacity is available, still don't want to encourage extra packets to come.
132-
// Note: CSeqNo::seqlen(n, n) returns 1.
133-
return capacity() - CSeqNo::seqlen(iFirstUnackSeqNo, iRBufSeqNo) + 1;
131+
// Full capacity is available.
132+
return capacity();
134133
}
135134

136135
// Note: CSeqNo::seqlen(n, n) returns 1.

srtcore/core.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7993,6 +7993,8 @@ int srt::CUDT::sendCtrlAck(CPacket& ctrlpkt, int size)
79937993
data[ACKD_RCVLASTACK] = m_iRcvLastAck;
79947994
data[ACKD_RTT] = m_iSRTT;
79957995
data[ACKD_RTTVAR] = m_iRTTVar;
7996+
// The ackDataUpTo() above ensures this condition.
7997+
SRT_ASSERT(m_iRcvLastSkipAck == m_iRcvLastAck);
79967998
data[ACKD_BUFFERLEFT] = (int) getAvailRcvBufferSizeNoLock();
79977999
// a minimum flow window of 2 is used, even if buffer is full, to break potential deadlock
79988000
if (data[ACKD_BUFFERLEFT] < 2)

test/test_buffer_rcv.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -803,14 +803,14 @@ TEST_F(CRcvBufferReadStream, ReadFractional)
803803
const size_t num_bytes1 = nfull_pkts * m_payload_sz + m_payload_sz / 2;
804804
const int res1 = m_rcv_buffer->readBuffer(buff.data(), num_bytes1);
805805
EXPECT_TRUE(size_t(res1) == num_bytes1);
806-
EXPECT_EQ(getAvailBufferSize(), m_buff_size_pkts - nfull_pkts - 1);
806+
EXPECT_EQ(getAvailBufferSize(), m_buff_size_pkts - 1);
807807
EXPECT_TRUE(hasAvailablePackets());
808808

809809
const size_t num_bytes2 = m_payload_sz * (num_pkts - nfull_pkts - 1) + m_payload_sz / 2;
810810

811811
const int res2 = m_rcv_buffer->readBuffer(buff.data() + num_bytes1, buff.size() - num_bytes1);
812812
EXPECT_TRUE(size_t(res2) == num_bytes2);
813-
EXPECT_EQ(getAvailBufferSize(), m_buff_size_pkts - num_pkts - 1);
813+
EXPECT_EQ(getAvailBufferSize(), m_buff_size_pkts - 1);
814814
EXPECT_FALSE(hasAvailablePackets());
815815
ackPackets(num_pkts); // Move the reference ACK position.
816816
EXPECT_EQ(getAvailBufferSize(), m_buff_size_pkts - 1);

0 commit comments

Comments
 (0)