From f086ca9e70a1dc33fa28a684a5cbad74fbfc595c Mon Sep 17 00:00:00 2001 From: Fletcher Dunn Date: Tue, 12 Mar 2024 17:47:30 -0700 Subject: [PATCH] Another refactor to lagged packets Store the properties of the packet using a RecvPktInfo_t P4:8760663 --- .../steamnetworkingsockets_lowlevel.cpp | 53 ++++++++++--------- 1 file changed, 29 insertions(+), 24 deletions(-) diff --git a/src/steamnetworkingsockets/clientlib/steamnetworkingsockets_lowlevel.cpp b/src/steamnetworkingsockets/clientlib/steamnetworkingsockets_lowlevel.cpp index 447620f..ece84ca 100644 --- a/src/steamnetworkingsockets/clientlib/steamnetworkingsockets_lowlevel.cpp +++ b/src/steamnetworkingsockets/clientlib/steamnetworkingsockets_lowlevel.cpp @@ -1160,31 +1160,36 @@ static bool s_bRawSocketPendingDestruction; class CPacketLagger; struct CLaggedPacket final : public CPossibleOutOfOrderPacket { - // When we need to process this packet - SteamNetworkingMicroseconds m_usecFlush; - - CRawUDPSocketImpl *m_pSockOwner; - netadr_t m_adrRemote; - int m_cbPkt; + // Store the info about the packet using RecvPktInfo_t, even if we are + // queued to send. m_info.m_usecNow will store the time when we + // should be sent, while we are waiting + RecvPktInfo_t m_info; + // Linked list while we are in the CPacketLagger queue CLaggedPacket *m_pPrev = nullptr; CLaggedPacket *m_pNext = nullptr; CPacketLagger *m_pLaggerOwner = nullptr; + // Packet payload data char m_pkt[ k_cbSteamNetworkingSocketsMaxUDPMsgLen ]; + CLaggedPacket( CRawUDPSocketImpl *pSockOwner, const netadr_t &adrRemote, SteamNetworkingMicroseconds usecFlush, int cbPkt ) : CPossibleOutOfOrderPacket() - , m_usecFlush( usecFlush ) - , m_pSockOwner( pSockOwner ) - , m_adrRemote( adrRemote ) - , m_cbPkt( cbPkt ) + , m_info{ m_pkt, cbPkt, usecFlush, adrRemote, pSockOwner } { - Assert( m_cbPkt < sizeof(m_pkt) ); + Assert( cbPkt < sizeof(m_pkt) ); } + // Upcast + CRawUDPSocketImpl *SockOwner() const { return assert_cast( m_info.m_pSock ); } + + // If we're in a packet lagger list, remove us void RemoveFromPacketLaggerList(); +private: + + // CPossibleOutOfOrderPacket override to do our derived class destruction virtual void DoDestroy() override { RemoveFromPacketLaggerList(); @@ -1238,7 +1243,7 @@ public: CLaggedPacket *pInsertAfter = m_pLast; for (;;) { - if ( pInsertAfter->m_usecFlush <= usecTime ) + if ( pInsertAfter->m_info.m_usecNow <= usecTime ) { pkt->m_pPrev = pInsertAfter; pkt->m_pNext = pInsertAfter->m_pNext; @@ -1296,7 +1301,7 @@ public: /// Periodic processing virtual void Think( SteamNetworkingMicroseconds usecNow ) override { - while ( m_pFirst && m_pFirst->m_usecFlush <= usecNow ) + while ( m_pFirst && m_pFirst->m_info.m_usecNow <= usecNow ) { CLaggedPacket *p = m_pFirst; Assert( p->m_pLaggerOwner == this ); @@ -1304,7 +1309,7 @@ public: Assert( m_pFirst != p ); // Make sure socket is still in good shape. - CRawUDPSocketImpl *pSock = p->m_pSockOwner; + CRawUDPSocketImpl *pSock = p->SockOwner(); if ( pSock ) { if ( pSock->m_socket == INVALID_SOCKET || !pSock->m_callback.m_fnCallback ) @@ -1313,7 +1318,8 @@ public: } else { - ProcessPacket( *p, usecNow ); + p->m_info.m_usecNow = usecNow; + ProcessPacket( *p ); } } p->Destroy(); @@ -1345,7 +1351,7 @@ public: { CLaggedPacket *x = p; p = p->m_pNext; - if ( x->m_pSockOwner == pSock ) + if ( x->m_info.m_pSock == pSock ) { x->Destroy(); } @@ -1363,11 +1369,11 @@ protected: if ( m_pFirst == nullptr ) ClearNextThinkTime(); else - SetNextThinkTime( m_pFirst->m_usecFlush ); + SetNextThinkTime( m_pFirst->m_info.m_usecNow ); } /// Do whatever we're supposed to do with the next packet - virtual void ProcessPacket( const CLaggedPacket &pkt, SteamNetworkingMicroseconds usecNow ) = 0; + virtual void ProcessPacket( const CLaggedPacket &pkt ) = 0; }; void CLaggedPacket::RemoveFromPacketLaggerList() @@ -1408,22 +1414,21 @@ void CLaggedPacket::RemoveFromPacketLaggerList() class CPacketLaggerSend final : public CPacketLagger { public: - virtual void ProcessPacket( const CLaggedPacket &pkt, SteamNetworkingMicroseconds usecNow ) override + virtual void ProcessPacket( const CLaggedPacket &pkt ) override { iovec temp; - temp.iov_len = pkt.m_cbPkt; + temp.iov_len = pkt.m_info.m_cbPkt; temp.iov_base = (void *)pkt.m_pkt; - pkt.m_pSockOwner->BReallySendRawPacket( 1, &temp, pkt.m_adrRemote ); + pkt.SockOwner()->BReallySendRawPacket( 1, &temp, pkt.m_info.m_adrFrom ); } }; class CPacketLaggerRecv final : public CPacketLagger { public: - virtual void ProcessPacket( const CLaggedPacket &pkt, SteamNetworkingMicroseconds usecNow ) override + virtual void ProcessPacket( const CLaggedPacket &pkt ) override { - //pkt.m_pSockOwner->m_callback( RecvPktInfo_t{ temp, pkt.m_cbPkt, usecNow, pkt.m_usecTime, 0, pkt.m_adrRemote, pkt.m_pSockOwner } ); - pkt.m_pSockOwner->m_callback( RecvPktInfo_t{ pkt.m_pkt, pkt.m_cbPkt, usecNow, pkt.m_adrRemote, pkt.m_pSockOwner } ); + pkt.SockOwner()->m_callback( pkt.m_info ); } };