diff --git a/src/steamnetworkingsockets/clientlib/steamnetworkingsockets_p2p.cpp b/src/steamnetworkingsockets/clientlib/steamnetworkingsockets_p2p.cpp index f4f7616..fbc5a6b 100644 --- a/src/steamnetworkingsockets/clientlib/steamnetworkingsockets_p2p.cpp +++ b/src/steamnetworkingsockets/clientlib/steamnetworkingsockets_p2p.cpp @@ -1417,7 +1417,12 @@ void CSteamNetworkConnectionP2P::ThinkSelectTransport( SteamNetworkingMicrosecon } \ else if ( pTransport->m_usecEndToEndInFlightReplyTimeout > 0 ) \ { \ - m_usecNextEvaluateTransport = std::min( m_usecNextEvaluateTransport, pTransport->m_usecEndToEndInFlightReplyTimeout ); \ + /* The transport *should* be scheduled to deal with the timeout */ \ + Assert( pTransport->GetP2PTransportThinkScheduleTime() <= pTransport->m_usecEndToEndInFlightReplyTimeout ); \ + /* In case not, use the max so we don't wake up and try to deal with it before it has taken care of it and get into a loop */ \ + SteamNetworkingMicroseconds usecAfterTimeOut = std::max( pTransport->GetP2PTransportThinkScheduleTime(), pTransport->m_usecEndToEndInFlightReplyTimeout ); \ + ++usecAfterTimeOut; /* because we need to make sure we do our processing AFTER the transport has had a chance to deal with the timeout */ \ + m_usecNextEvaluateTransport = std::min( m_usecNextEvaluateTransport, usecAfterTimeOut ); \ } \ else \ { \ diff --git a/src/steamnetworkingsockets/clientlib/steamnetworkingsockets_p2p.h b/src/steamnetworkingsockets/clientlib/steamnetworkingsockets_p2p.h index acdb8a1..707814c 100644 --- a/src/steamnetworkingsockets/clientlib/steamnetworkingsockets_p2p.h +++ b/src/steamnetworkingsockets/clientlib/steamnetworkingsockets_p2p.h @@ -163,6 +163,8 @@ public: bool TryLock() { return m_pSelfAsConnectionTransport->m_connection.TryLock(); } void Unlock() const { return m_pSelfAsConnectionTransport->m_connection.Unlock(); } + inline SteamNetworkingMicroseconds GetP2PTransportThinkScheduleTime() const { return m_scheduleP2PTransportThink.GetScheduleTime(); } + protected: CConnectionTransportP2PBase( const char *pszDebugName, CConnectionTransport *pSelfBase ); virtual ~CConnectionTransportP2PBase();