Skip to content

Commit e9275be

Browse files
committed
[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
1 parent 9ecc9ad commit e9275be

File tree

3 files changed

+22
-7
lines changed

3 files changed

+22
-7
lines changed

src/steamnetworkingsockets/clientlib/csteamnetworkingsockets.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1298,8 +1298,10 @@ int CSteamNetworkingSockets::ReceiveMessagesOnListenSocketLegacyPollGroup( HStea
12981298
CSteamNetworkListenSocketBase *pSock = GetListenSocketByHandle( hSocket );
12991299
if ( !pSock )
13001300
return -1;
1301+
if ( !pSock->m_pLegacyPollGroup )
1302+
return 0;
13011303
g_lockAllRecvMessageQueues.lock();
1302-
int nMessagesReceived = pSock->m_legacyPollGroup.m_queueRecvMessages.RemoveMessages( ppOutMessages, nMaxMessages );
1304+
int nMessagesReceived = pSock->m_pLegacyPollGroup->m_queueRecvMessages.RemoveMessages( ppOutMessages, nMaxMessages );
13031305
g_lockAllRecvMessageQueues.unlock();
13041306
return nMessagesReceived;
13051307
}

src/steamnetworkingsockets/clientlib/steamnetworkingsockets_connections.cpp

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,6 @@ CSteamNetworkPollGroup::~CSteamNetworkPollGroup()
346346
// Object deletion is rare; to keep things simple we require the global lock
347347
SteamNetworkingGlobalLock::AssertHeldByCurrentThread();
348348
m_lock.AssertHeldByCurrentThread();
349-
g_tables_lock.AssertHeldByCurrentThread();
350349

351350
FOR_EACH_VEC_BACK( m_vecConnections, i )
352351
{
@@ -385,6 +384,7 @@ CSteamNetworkPollGroup::~CSteamNetworkPollGroup()
385384
// Remove us from global table, if we're in it
386385
if ( m_hPollGroupSelf != k_HSteamNetPollGroup_Invalid )
387386
{
387+
g_tables_lock.AssertHeldByCurrentThread();
388388
int idx = m_hPollGroupSelf & 0xffff;
389389
if ( g_mapPollGroups.IsValidIndex( idx ) && g_mapPollGroups[ idx ] == this )
390390
{
@@ -443,9 +443,6 @@ void CSteamNetworkPollGroup::AssignHandleAndAddToGlobalTable()
443443
CSteamNetworkListenSocketBase::CSteamNetworkListenSocketBase( CSteamNetworkingSockets *pSteamNetworkingSocketsInterface )
444444
: m_pSteamNetworkingSocketsInterface( pSteamNetworkingSocketsInterface )
445445
, m_hListenSocketSelf( k_HSteamListenSocket_Invalid )
446-
#ifdef STEAMNETWORKINGSOCKETS_STEAMCLIENT
447-
, m_legacyPollGroup( pSteamNetworkingSocketsInterface )
448-
#endif
449446
{
450447
m_connectionConfig.Init( &pSteamNetworkingSocketsInterface->m_connectionConfig );
451448
}
@@ -473,6 +470,10 @@ CSteamNetworkListenSocketBase::~CSteamNetworkListenSocketBase()
473470

474471
m_hListenSocketSelf = k_HSteamListenSocket_Invalid;
475472
}
473+
474+
#ifdef STEAMNETWORKINGSOCKETS_STEAMCLIENT
475+
Assert( !m_pLegacyPollGroup ); // Should have been cleaned up by Destroy()
476+
#endif
476477
}
477478

478479
bool CSteamNetworkListenSocketBase::BInitListenSocketCommon( int nOptions, const SteamNetworkingConfigValue_t *pOptions, SteamDatagramErrMsg &errMsg )
@@ -556,6 +557,14 @@ void CSteamNetworkListenSocketBase::Destroy()
556557
Assert( m_mapChildConnections.Count() == n-1 );
557558
}
558559

560+
#ifdef STEAMNETWORKINGSOCKETS_STEAMCLIENT
561+
if ( m_pLegacyPollGroup )
562+
{
563+
m_pLegacyPollGroup->m_lock.lock(); // Don't use scope object. It will unlock when we destruct
564+
m_pLegacyPollGroup.reset();
565+
}
566+
#endif
567+
559568
// Self destruct
560569
delete this;
561570
}
@@ -615,7 +624,11 @@ bool CSteamNetworkListenSocketBase::BAddChildConnection( CSteamNetworkConnection
615624
// Don't override it, if so.)
616625
#ifdef STEAMNETWORKINGSOCKETS_STEAMCLIENT
617626
if ( !pConn->m_pPollGroup )
618-
pConn->SetPollGroup( &m_legacyPollGroup );
627+
{
628+
if ( !m_pLegacyPollGroup )
629+
m_pLegacyPollGroup.reset( new CSteamNetworkPollGroup( m_pSteamNetworkingSocketsInterface ) );
630+
pConn->SetPollGroup( m_pLegacyPollGroup.get() );
631+
}
619632
#endif
620633

621634
return true;

src/steamnetworkingsockets/clientlib/steamnetworkingsockets_connections.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ class CSteamNetworkListenSocketBase
264264

265265
/// For legacy interface.
266266
#ifdef STEAMNETWORKINGSOCKETS_STEAMCLIENT
267-
CSteamNetworkPollGroup m_legacyPollGroup;
267+
std::unique_ptr<CSteamNetworkPollGroup> m_pLegacyPollGroup;
268268
#endif
269269

270270
protected:

0 commit comments

Comments
 (0)