Skip to content

Commit 59f7066

Browse files
authored
Merge pull request #58 from GeneralsOnlineDevelopmentTeam/seer/ngmp-websocket-shared-ptr
NGMP: Use shared_ptr for WebSocket to manage its lifecycle
2 parents 117cdc0 + 22f5321 commit 59f7066

3 files changed

Lines changed: 16 additions & 26 deletions

File tree

GeneralsMD/Code/GameEngine/Include/GameNetwork/GeneralsOnline/OnlineServices_Init.h

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include "NGMP_include.h"
44

55
#include <thread>
6+
#include <memory>
67

78
class HTTPManager;
89

@@ -334,7 +335,7 @@ class NGMP_OnlineServicesManager
334335
return m_pOnlineServicesManager;
335336
}
336337

337-
static WebSocket* GetWebSocket()
338+
static std::shared_ptr<WebSocket> GetWebSocket()
338339
{
339340
if (m_pOnlineServicesManager != nullptr)
340341
{
@@ -417,16 +418,13 @@ class NGMP_OnlineServicesManager
417418
m_pHTTPManager = nullptr;
418419
}
419420

420-
if (m_pWebSocket != nullptr)
421-
{
422-
delete m_pWebSocket;
423-
m_pWebSocket = nullptr;
424-
}
421+
// Reset shared_ptr, which will delete WebSocket only when all references are released
422+
m_pWebSocket.reset();
425423
}
426424

427425
void StartVersionCheck(std::function<void(bool bSuccess, bool bNeedsUpdate)> fnCallback);
428426

429-
WebSocket* Internal_GetWebSocket() const { return m_pWebSocket; }
427+
std::shared_ptr<WebSocket> Internal_GetWebSocket() const { return m_pWebSocket; }
430428
HTTPManager* GetHTTPManager() const { return m_pHTTPManager; }
431429

432430
void CancelUpdate();
@@ -500,7 +498,7 @@ class NGMP_OnlineServicesManager
500498

501499
HTTPManager* m_pHTTPManager = nullptr;
502500

503-
WebSocket* m_pWebSocket = nullptr;
501+
std::shared_ptr<WebSocket> m_pWebSocket;
504502

505503
std::string m_strMOTD;
506504

GeneralsMD/Code/GameEngine/Source/GameNetwork/GeneralsOnline/NetworkMesh.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,8 @@ void OnSteamNetConnectionStatusChanged(SteamNetConnectionStatusChangedCallback_t
8585
if (bShouldRetry)
8686
{
8787
NetworkLog(ELogVerbosity::LOG_RELEASE, "[STEAM NETWORKING][DISCONNECT HANDLER] Retrying...");
88-
WebSocket* pWS = NGMP_OnlineServicesManager::GetWebSocket();
89-
if (pWS != nullptr)
88+
std::shared_ptr<WebSocket> pWS = NGMP_OnlineServicesManager::GetWebSocket();
89+
if (pWS)
9090
{
9191
NGMP_OnlineServices_AuthInterface* pAuthInterface = NGMP_OnlineServicesManager::GetInterface<NGMP_OnlineServices_AuthInterface>();
9292
NGMP_OnlineServices_LobbyInterface* pLobbyInterface = NGMP_OnlineServicesManager::GetInterface<NGMP_OnlineServices_LobbyInterface>();
@@ -369,8 +369,8 @@ class CSignalingClient : public ISignalingClient
369369
// Send the signal.
370370
void Send(int64_t target_user_id, std::vector<uint8_t>& vecPayload)
371371
{
372-
WebSocket* pWS = NGMP_OnlineServicesManager::GetWebSocket();
373-
if (pWS != nullptr)
372+
std::shared_ptr<WebSocket> pWS = NGMP_OnlineServicesManager::GetWebSocket();
373+
if (pWS)
374374
{
375375
if (!pWS->AcquireLock())
376376
{
@@ -425,8 +425,8 @@ class CSignalingClient : public ISignalingClient
425425

426426
virtual void Poll() override
427427
{
428-
WebSocket* pWS = NGMP_OnlineServicesManager::GetWebSocket();
429-
if (pWS != nullptr)
428+
std::shared_ptr<WebSocket> pWS = NGMP_OnlineServicesManager::GetWebSocket();
429+
if (pWS)
430430
{
431431
if (!pWS->AcquireLock())
432432
{

GeneralsMD/Code/GameEngine/Source/GameNetwork/GeneralsOnline/OnlineServices_Init.cpp

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -261,19 +261,11 @@ void NGMP_OnlineServicesManager::WaitForScreenshotThreads()
261261
NetworkLog(ELogVerbosity::LOG_RELEASE, "[NGMP] All screenshot threads completed");
262262
}
263263

264-
void NGMP_OnlineServicesManager::Shutdown()
265-
{
266-
NetworkLog(ELogVerbosity::LOG_RELEASE, "[NGMP] OnlineServicesManager shutdown initiated");
267-
268-
// CRITICAL: Wait for all screenshot threads to complete first
269-
// This prevents threads from accessing destroyed objects
270-
WaitForScreenshotThreads();
271-
272-
// Now shutdown network components in safe order
273-
// Shutdown WebSocket first to stop incoming messages
274-
if (m_pWebSocket != nullptr)
264+
if (m_pWebSocket)
275265
{
276266
m_pWebSocket->Shutdown();
267+
// Reset shared_ptr, which will delete WebSocket only when all references are released
268+
m_pWebSocket.reset();
277269
}
278270

279271
// Then shutdown HTTP manager to complete any pending requests
@@ -661,7 +653,7 @@ void NGMP_OnlineServicesManager::OnLogin(bool bSuccess, const char* szWSAddr)
661653
{
662654
// connect to WS
663655
// TODO_NGMP: Handle WS conn failure
664-
m_pWebSocket = new WebSocket();
656+
m_pWebSocket = std::make_shared<WebSocket>();
665657

666658
m_pWebSocket->Connect(szWSAddr);
667659

0 commit comments

Comments
 (0)