diff --git a/src/steamnetworkingsockets/clientlib/steamnetworkingsockets_p2p.cpp b/src/steamnetworkingsockets/clientlib/steamnetworkingsockets_p2p.cpp index c224cb3..f41abfc 100644 --- a/src/steamnetworkingsockets/clientlib/steamnetworkingsockets_p2p.cpp +++ b/src/steamnetworkingsockets/clientlib/steamnetworkingsockets_p2p.cpp @@ -1001,7 +1001,7 @@ void CSteamNetworkConnectionP2P::ConnectionStateChanged( ESteamNetworkingConnect m_usecNextEvaluateTransport = k_nThinkTime_ASAP; SetNextThinkTimeASAP(); for ( CConnectionTransportP2PBase *pTransportP2P: m_vecAvailableTransports ) - pTransportP2P->m_pSelfAsThinker->SetNextThinkTimeASAP(); + pTransportP2P->EnsureP2PTransportThink( k_nThinkTime_ASAP ); break; } @@ -1827,10 +1827,9 @@ void CSteamNetworkConnectionP2P::PeerSelectedTransportChanged() // ///////////////////////////////////////////////////////////////////////////// -CConnectionTransportP2PBase::CConnectionTransportP2PBase( const char *pszDebugName, CConnectionTransport *pSelfBase, IThinker *pSelfThinker ) +CConnectionTransportP2PBase::CConnectionTransportP2PBase( const char *pszDebugName, CConnectionTransport *pSelfBase ) : m_pszP2PTransportDebugName( pszDebugName ) , m_pSelfAsConnectionTransport( pSelfBase ) -, m_pSelfAsThinker( pSelfThinker ) { m_pingEndToEnd.Reset(); m_usecEndToEndInFlightReplyTimeout = 0; @@ -1853,7 +1852,7 @@ void CConnectionTransportP2PBase::P2PTransportTrackSentEndToEndPingRequest( Stea if ( bAllowDelayedReply ) m_usecEndToEndInFlightReplyTimeout += k_usecSteamDatagramRouterPendClientPing; // Is this the appropriate constant to use? - m_pSelfAsThinker->EnsureMinThinkTime( m_usecEndToEndInFlightReplyTimeout ); + EnsureP2PTransportThink( m_usecEndToEndInFlightReplyTimeout ); } } @@ -1947,7 +1946,7 @@ void CConnectionTransportP2PBase::P2PTransportThink( SteamNetworkingMicroseconds if ( m_usecEndToEndInFlightReplyTimeout ) usecNextThink = std::min( usecNextThink, m_usecEndToEndInFlightReplyTimeout ); - m_pSelfAsThinker->EnsureMinThinkTime( usecNextThink ); + EnsureP2PTransportThink( usecNextThink ); } void CConnectionTransportP2PBase::P2PTransportEndToEndConnectivityNotConfirmed( SteamNetworkingMicroseconds usecNow ) diff --git a/src/steamnetworkingsockets/clientlib/steamnetworkingsockets_p2p.h b/src/steamnetworkingsockets/clientlib/steamnetworkingsockets_p2p.h index 3bb03f9..158fecd 100644 --- a/src/steamnetworkingsockets/clientlib/steamnetworkingsockets_p2p.h +++ b/src/steamnetworkingsockets/clientlib/steamnetworkingsockets_p2p.h @@ -76,7 +76,6 @@ public: // Virtual base classes. (We don't directly derive, since we are a mixin, // but all classes that derive from us will derive from these base classes.) CConnectionTransport *const m_pSelfAsConnectionTransport; - IThinker *const m_pSelfAsThinker; const char *const m_pszP2PTransportDebugName; @@ -132,18 +131,25 @@ public: m_nReplyTimeoutsSinceLastRecv = 0; } void P2PTransportTrackSentEndToEndPingRequest( SteamNetworkingMicroseconds usecNow, bool bAllowDelayedReply ); - void P2PTransportThink( SteamNetworkingMicroseconds usecNow ); void P2PTransportEndToEndConnectivityConfirmed( SteamNetworkingMicroseconds usecNow ); void P2PTransportEndToEndConnectivityNotConfirmed( SteamNetworkingMicroseconds usecNow ); // Populate m_routeMetrics. If we're not really available, then the metrics should be set to a huge score virtual void P2PTransportUpdateRouteMetrics( SteamNetworkingMicroseconds usecNow ) = 0; + inline void EnsureP2PTransportThink( SteamNetworkingMicroseconds usecWhen ) + { + m_scheduleP2PTransportThink.EnsureMinScheduleTime( this, &CConnectionTransportP2PBase::P2PTransportThink, usecWhen ); + } + protected: - CConnectionTransportP2PBase( const char *pszDebugName, CConnectionTransport *pSelfBase, IThinker *pSelfThinker ); + CConnectionTransportP2PBase( const char *pszDebugName, CConnectionTransport *pSelfBase ); // Shortcut to get connection and upcast CSteamNetworkConnectionP2P &Connection() const; + + virtual void P2PTransportThink( SteamNetworkingMicroseconds usecNow ); + ScheduledMethodThinker m_scheduleP2PTransportThink; }; /// A peer-to-peer connection that can use different types of underlying transport diff --git a/src/steamnetworkingsockets/clientlib/steamnetworkingsockets_p2p_ice.cpp b/src/steamnetworkingsockets/clientlib/steamnetworkingsockets_p2p_ice.cpp index e20352e..f1540cb 100644 --- a/src/steamnetworkingsockets/clientlib/steamnetworkingsockets_p2p_ice.cpp +++ b/src/steamnetworkingsockets/clientlib/steamnetworkingsockets_p2p_ice.cpp @@ -23,7 +23,7 @@ namespace SteamNetworkingSocketsLib { CConnectionTransportP2PICE::CConnectionTransportP2PICE( CSteamNetworkConnectionP2P &connection ) : CConnectionTransportUDPBase( connection ) -, CConnectionTransportP2PBase( "ICE", this, this ) +, CConnectionTransportP2PBase( "ICE", this ) , m_pICESession( nullptr ) { m_nAllowedCandidateTypes = 0; @@ -84,7 +84,6 @@ void CConnectionTransportP2PICE::TransportFreeResources() m_pICESession->Destroy(); m_pICESession = nullptr; } - ClearNextThinkTime(); find_and_remove_element( Connection().m_vecAvailableTransports, this ); CConnectionTransport::TransportFreeResources(); @@ -235,7 +234,7 @@ void CConnectionTransportP2PICE::RecvRendezvous( const CMsgICERendezvous &msg, S } } -void CConnectionTransportP2PICE::Think( SteamNetworkingMicroseconds usecNow ) +void CConnectionTransportP2PICE::P2PTransportThink( SteamNetworkingMicroseconds usecNow ) { // Are we dead? if ( !m_pICESession || Connection().m_pTransportICEPendingDelete ) @@ -245,7 +244,7 @@ void CConnectionTransportP2PICE::Think( SteamNetworkingMicroseconds usecNow ) return; } - P2PTransportThink( usecNow ); + CConnectionTransportP2PBase::P2PTransportThink( usecNow ); } void CConnectionTransportP2PICE::P2PTransportUpdateRouteMetrics( SteamNetworkingMicroseconds usecNow ) diff --git a/src/steamnetworkingsockets/clientlib/steamnetworkingsockets_p2p_ice.h b/src/steamnetworkingsockets/clientlib/steamnetworkingsockets_p2p_ice.h index 85075f9..d37f3bf 100644 --- a/src/steamnetworkingsockets/clientlib/steamnetworkingsockets_p2p_ice.h +++ b/src/steamnetworkingsockets/clientlib/steamnetworkingsockets_p2p_ice.h @@ -25,7 +25,6 @@ struct UDPSendPacketContext_t; class CConnectionTransportP2PICE final : public CConnectionTransportUDPBase , public CConnectionTransportP2PBase -, public IThinker , private IICESessionDelegate { public: @@ -43,11 +42,9 @@ public: virtual void TransportFreeResources() override; virtual bool BCanSendEndToEndData() const override; - // IThinker - virtual void Think( SteamNetworkingMicroseconds usecNow ) override; - // CConnectionTransportP2PBase virtual void P2PTransportUpdateRouteMetrics( SteamNetworkingMicroseconds usecNow ) override; + virtual void P2PTransportThink( SteamNetworkingMicroseconds usecNow ) override; /// Fill in SDR-specific fields to signal void PopulateRendezvousMsg( CMsgSteamNetworkingP2PRendezvous &msg, SteamNetworkingMicroseconds usecNow );