[Steam only] Fix locking issues

Related to the legacy poll group when destroying listen sockets.
(We don't need this legacy support in this library, since we don't
have to support old interfaces.)

P4:6571400
This commit is contained in:
Fletcher Dunn
2021-05-28 17:37:22 -07:00
parent 9ecc9ad4fa
commit e9275beacb
3 changed files with 22 additions and 7 deletions
@@ -1298,8 +1298,10 @@ int CSteamNetworkingSockets::ReceiveMessagesOnListenSocketLegacyPollGroup( HStea
CSteamNetworkListenSocketBase *pSock = GetListenSocketByHandle( hSocket );
if ( !pSock )
return -1;
if ( !pSock->m_pLegacyPollGroup )
return 0;
g_lockAllRecvMessageQueues.lock();
int nMessagesReceived = pSock->m_legacyPollGroup.m_queueRecvMessages.RemoveMessages( ppOutMessages, nMaxMessages );
int nMessagesReceived = pSock->m_pLegacyPollGroup->m_queueRecvMessages.RemoveMessages( ppOutMessages, nMaxMessages );
g_lockAllRecvMessageQueues.unlock();
return nMessagesReceived;
}
@@ -346,7 +346,6 @@ CSteamNetworkPollGroup::~CSteamNetworkPollGroup()
// Object deletion is rare; to keep things simple we require the global lock
SteamNetworkingGlobalLock::AssertHeldByCurrentThread();
m_lock.AssertHeldByCurrentThread();
g_tables_lock.AssertHeldByCurrentThread();
FOR_EACH_VEC_BACK( m_vecConnections, i )
{
@@ -385,6 +384,7 @@ CSteamNetworkPollGroup::~CSteamNetworkPollGroup()
// Remove us from global table, if we're in it
if ( m_hPollGroupSelf != k_HSteamNetPollGroup_Invalid )
{
g_tables_lock.AssertHeldByCurrentThread();
int idx = m_hPollGroupSelf & 0xffff;
if ( g_mapPollGroups.IsValidIndex( idx ) && g_mapPollGroups[ idx ] == this )
{
@@ -443,9 +443,6 @@ void CSteamNetworkPollGroup::AssignHandleAndAddToGlobalTable()
CSteamNetworkListenSocketBase::CSteamNetworkListenSocketBase( CSteamNetworkingSockets *pSteamNetworkingSocketsInterface )
: m_pSteamNetworkingSocketsInterface( pSteamNetworkingSocketsInterface )
, m_hListenSocketSelf( k_HSteamListenSocket_Invalid )
#ifdef STEAMNETWORKINGSOCKETS_STEAMCLIENT
, m_legacyPollGroup( pSteamNetworkingSocketsInterface )
#endif
{
m_connectionConfig.Init( &pSteamNetworkingSocketsInterface->m_connectionConfig );
}
@@ -473,6 +470,10 @@ CSteamNetworkListenSocketBase::~CSteamNetworkListenSocketBase()
m_hListenSocketSelf = k_HSteamListenSocket_Invalid;
}
#ifdef STEAMNETWORKINGSOCKETS_STEAMCLIENT
Assert( !m_pLegacyPollGroup ); // Should have been cleaned up by Destroy()
#endif
}
bool CSteamNetworkListenSocketBase::BInitListenSocketCommon( int nOptions, const SteamNetworkingConfigValue_t *pOptions, SteamDatagramErrMsg &errMsg )
@@ -556,6 +557,14 @@ void CSteamNetworkListenSocketBase::Destroy()
Assert( m_mapChildConnections.Count() == n-1 );
}
#ifdef STEAMNETWORKINGSOCKETS_STEAMCLIENT
if ( m_pLegacyPollGroup )
{
m_pLegacyPollGroup->m_lock.lock(); // Don't use scope object. It will unlock when we destruct
m_pLegacyPollGroup.reset();
}
#endif
// Self destruct
delete this;
}
@@ -615,7 +624,11 @@ bool CSteamNetworkListenSocketBase::BAddChildConnection( CSteamNetworkConnection
// Don't override it, if so.)
#ifdef STEAMNETWORKINGSOCKETS_STEAMCLIENT
if ( !pConn->m_pPollGroup )
pConn->SetPollGroup( &m_legacyPollGroup );
{
if ( !m_pLegacyPollGroup )
m_pLegacyPollGroup.reset( new CSteamNetworkPollGroup( m_pSteamNetworkingSocketsInterface ) );
pConn->SetPollGroup( m_pLegacyPollGroup.get() );
}
#endif
return true;
@@ -264,7 +264,7 @@ public:
/// For legacy interface.
#ifdef STEAMNETWORKINGSOCKETS_STEAMCLIENT
CSteamNetworkPollGroup m_legacyPollGroup;
std::unique_ptr<CSteamNetworkPollGroup> m_pLegacyPollGroup;
#endif
protected: