From 523c9087c0b5ec7415d8744ea616c0a484f2e3f1 Mon Sep 17 00:00:00 2001 From: "seer-by-sentry[bot]" <157164994+seer-by-sentry[bot]@users.noreply.github.com> Date: Sun, 5 Oct 2025 03:25:30 +0000 Subject: [PATCH] NGMP: Use shared_ptr for WebSocket to manage its lifecycle --- .../GeneralsOnline/OnlineServices_Init.h | 14 ++++++-------- .../GameNetwork/GeneralsOnline/NetworkMesh.cpp | 12 ++++++------ .../GeneralsOnline/OnlineServices_Init.cpp | 6 ++++-- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/GeneralsMD/Code/GameEngine/Include/GameNetwork/GeneralsOnline/OnlineServices_Init.h b/GeneralsMD/Code/GameEngine/Include/GameNetwork/GeneralsOnline/OnlineServices_Init.h index 17503c093bd..112bb43c689 100644 --- a/GeneralsMD/Code/GameEngine/Include/GameNetwork/GeneralsOnline/OnlineServices_Init.h +++ b/GeneralsMD/Code/GameEngine/Include/GameNetwork/GeneralsOnline/OnlineServices_Init.h @@ -3,6 +3,7 @@ #include "NGMP_include.h" #include +#include class HTTPManager; @@ -326,7 +327,7 @@ class NGMP_OnlineServicesManager return m_pOnlineServicesManager; } - static WebSocket* GetWebSocket() + static std::shared_ptr GetWebSocket() { if (m_pOnlineServicesManager != nullptr) { @@ -407,16 +408,13 @@ class NGMP_OnlineServicesManager m_pHTTPManager = nullptr; } - if (m_pWebSocket != nullptr) - { - delete m_pWebSocket; - m_pWebSocket = nullptr; - } + // Reset shared_ptr, which will delete WebSocket only when all references are released + m_pWebSocket.reset(); } void StartVersionCheck(std::function fnCallback); - WebSocket* Internal_GetWebSocket() const { return m_pWebSocket; } + std::shared_ptr Internal_GetWebSocket() const { return m_pWebSocket; } HTTPManager* GetHTTPManager() const { return m_pHTTPManager; } void CancelUpdate(); @@ -482,7 +480,7 @@ class NGMP_OnlineServicesManager HTTPManager* m_pHTTPManager = nullptr; - WebSocket* m_pWebSocket = nullptr; + std::shared_ptr m_pWebSocket; std::string m_strMOTD; diff --git a/GeneralsMD/Code/GameEngine/Source/GameNetwork/GeneralsOnline/NetworkMesh.cpp b/GeneralsMD/Code/GameEngine/Source/GameNetwork/GeneralsOnline/NetworkMesh.cpp index 6cf6bd510e0..40c1ad091e3 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameNetwork/GeneralsOnline/NetworkMesh.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameNetwork/GeneralsOnline/NetworkMesh.cpp @@ -85,8 +85,8 @@ void OnSteamNetConnectionStatusChanged(SteamNetConnectionStatusChangedCallback_t if (bShouldRetry) { NetworkLog(ELogVerbosity::LOG_RELEASE, "[STEAM NETWORKING][DISCONNECT HANDLER] Retrying..."); - WebSocket* pWS = NGMP_OnlineServicesManager::GetWebSocket(); - if (pWS != nullptr) + std::shared_ptr pWS = NGMP_OnlineServicesManager::GetWebSocket(); + if (pWS) { NGMP_OnlineServices_AuthInterface* pAuthInterface = NGMP_OnlineServicesManager::GetInterface(); NGMP_OnlineServices_LobbyInterface* pLobbyInterface = NGMP_OnlineServicesManager::GetInterface(); @@ -369,8 +369,8 @@ class CSignalingClient : public ISignalingClient // Send the signal. void Send(int64_t target_user_id, std::vector& vecPayload) { - WebSocket* pWS = NGMP_OnlineServicesManager::GetWebSocket(); - if (pWS != nullptr) + std::shared_ptr pWS = NGMP_OnlineServicesManager::GetWebSocket(); + if (pWS) { if (!pWS->AcquireLock()) { @@ -425,8 +425,8 @@ class CSignalingClient : public ISignalingClient virtual void Poll() override { - WebSocket* pWS = NGMP_OnlineServicesManager::GetWebSocket(); - if (pWS != nullptr) + std::shared_ptr pWS = NGMP_OnlineServicesManager::GetWebSocket(); + if (pWS) { if (!pWS->AcquireLock()) { diff --git a/GeneralsMD/Code/GameEngine/Source/GameNetwork/GeneralsOnline/OnlineServices_Init.cpp b/GeneralsMD/Code/GameEngine/Source/GameNetwork/GeneralsOnline/OnlineServices_Init.cpp index a1a1ef83a00..82ca0620a95 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameNetwork/GeneralsOnline/OnlineServices_Init.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameNetwork/GeneralsOnline/OnlineServices_Init.cpp @@ -245,9 +245,11 @@ void NGMP_OnlineServicesManager::Shutdown() m_pHTTPManager->Shutdown(); } - if (m_pWebSocket != nullptr) + if (m_pWebSocket) { m_pWebSocket->Shutdown(); + // Reset shared_ptr, which will delete WebSocket only when all references are released + m_pWebSocket.reset(); } ShutdownSentry(); @@ -607,7 +609,7 @@ void NGMP_OnlineServicesManager::OnLogin(bool bSuccess, const char* szWSAddr) { // connect to WS // TODO_NGMP: Handle WS conn failure - m_pWebSocket = new WebSocket(); + m_pWebSocket = std::make_shared(); m_pWebSocket->Connect(szWSAddr);