diff --git a/GeneralsMD/Code/GameEngine/Include/GameNetwork/GeneralsOnline/OnlineServices_Init.h b/GeneralsMD/Code/GameEngine/Include/GameNetwork/GeneralsOnline/OnlineServices_Init.h index 1779a21fba1..c3dd3350ff0 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; @@ -334,7 +335,7 @@ class NGMP_OnlineServicesManager return m_pOnlineServicesManager; } - static WebSocket* GetWebSocket() + static std::shared_ptr GetWebSocket() { if (m_pOnlineServicesManager != nullptr) { @@ -417,16 +418,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(); @@ -500,7 +498,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 75934582ead..420ffdeca90 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 247bd629e76..9a35281a125 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameNetwork/GeneralsOnline/OnlineServices_Init.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameNetwork/GeneralsOnline/OnlineServices_Init.cpp @@ -261,19 +261,11 @@ void NGMP_OnlineServicesManager::WaitForScreenshotThreads() NetworkLog(ELogVerbosity::LOG_RELEASE, "[NGMP] All screenshot threads completed"); } -void NGMP_OnlineServicesManager::Shutdown() -{ - NetworkLog(ELogVerbosity::LOG_RELEASE, "[NGMP] OnlineServicesManager shutdown initiated"); - - // CRITICAL: Wait for all screenshot threads to complete first - // This prevents threads from accessing destroyed objects - WaitForScreenshotThreads(); - - // Now shutdown network components in safe order - // Shutdown WebSocket first to stop incoming messages - 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(); } // Then shutdown HTTP manager to complete any pending requests @@ -661,7 +653,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);