diff --git a/GeneralsMD/Code/GameEngine/Source/GameNetwork/GeneralsOnline/NetworkMesh.cpp b/GeneralsMD/Code/GameEngine/Source/GameNetwork/GeneralsOnline/NetworkMesh.cpp index 8d5319cf0c3..a7120bb9b0c 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameNetwork/GeneralsOnline/NetworkMesh.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameNetwork/GeneralsOnline/NetworkMesh.cpp @@ -3,6 +3,7 @@ #include "GameNetwork/GeneralsOnline/NGMP_interfaces.h" #include +#include #include "GameNetwork/NetworkDefs.h" #include "GameNetwork/NetworkInterface.h" #include "GameLogic/GameLogic.h" @@ -324,10 +325,12 @@ class CSignalingClient : public ISignalingClient { CSignalingClient* const m_pOwner; int64_t const m_targetUserID; + std::atomic m_refCount; ConnectionSignaling(CSignalingClient* owner, int64_t target_user_id) : m_pOwner(owner) , m_targetUserID(target_user_id) + , m_refCount(1) { } @@ -335,6 +338,12 @@ class CSignalingClient : public ISignalingClient // Implements ISteamNetworkingConnectionSignaling // + // AddRef - increment reference count + virtual int AddRef() override + { + return ++m_refCount; + } + // This is called from SteamNetworkingSockets to send a signal. This could be called from any thread, // so we need to be threadsafe, and avoid duoing slow stuff or calling back into SteamNetworkingSockets virtual bool SendSignal(HSteamNetConnection hConn, const SteamNetConnectionInfo_t& info, const void* pMsg, int cbMsg) override @@ -353,7 +362,11 @@ class CSignalingClient : public ISignalingClient // Self destruct. This will be called by SteamNetworkingSockets when it's done with us. virtual void Release() override { - delete this; + int refCount = --m_refCount; + if (refCount == 0) + { + delete this; + } } };