Skip to content

Commit

Permalink
Fix crash caused by latent events (PR #2940)
Browse files Browse the repository at this point in the history
  • Loading branch information
tederis committed May 1, 2023
1 parent 2bb5054 commit 934967f
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 3 deletions.
9 changes: 9 additions & 0 deletions Shared/mods/deathmatch/logic/CLatentReceiver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,15 @@ void CLatentReceiver::OnReceiveError(const SString& strMessage)
///////////////////////////////////////////////////////////////
void CLatentReceiver::OnReceive(NetBitStreamInterface* pBitStream)
{
struct SScopedGuardInsideMark
{
explicit SScopedGuardInsideMark(CLatentReceiver* pReceiver) noexcept : m_pReceiver(pReceiver) { pReceiver->m_bInside = true; }
~SScopedGuardInsideMark() noexcept { m_pReceiver->m_bInside = false; }

private:
CLatentReceiver* m_pReceiver;
} const ScopedInsideMark(this);

//
// Read header
//
Expand Down
17 changes: 14 additions & 3 deletions Shared/mods/deathmatch/logic/CLatentTransferManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -86,13 +86,18 @@ void CLatentTransferManager::RemoveRemote(NetPlayerID remoteId)
{
CLatentSendQueue* pSendQueue = FindSendQueueForRemote(remoteId);
CLatentReceiver* pReceiver = FindReceiverForRemote(remoteId);

ListRemove(m_SendQueueList, pSendQueue);
MapRemove(m_SendQueueMap, remoteId);
MapRemove(m_ReceiverMap, remoteId);

SAFE_DELETE(pSendQueue);
SAFE_DELETE(pReceiver);

if (pReceiver && pReceiver->IsInside())
pReceiver->SetDeferredDelete();
else
{
MapRemove(m_ReceiverMap, remoteId);
SAFE_DELETE(pReceiver);
}
}

///////////////////////////////////////////////////////////////
Expand Down Expand Up @@ -293,6 +298,12 @@ void CLatentTransferManager::OnReceive(NetPlayerID remoteId, NetBitStreamInterfa
{
CLatentReceiver* pReceiver = GetReceiverForRemote(remoteId, pBitStream->Version());
pReceiver->OnReceive(pBitStream);

if (pReceiver->IsDeferredDelete())
{
MapRemove(m_ReceiverMap, remoteId);
SAFE_DELETE(pReceiver);
}
}

///////////////////////////////////////////////////////////////
Expand Down
6 changes: 6 additions & 0 deletions Shared/mods/deathmatch/logic/CLatentTransferManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -141,18 +141,24 @@ class CLatentSendQueue
///////////////////////////////////////////////////////////////
class CLatentReceiver
{
friend struct SScopedGuardInsideMark;
public:
ZERO_ON_NEW
CLatentReceiver(NetPlayerID remoteId, ushort usBitStreamVersion);
~CLatentReceiver();
void OnReceive(NetBitStreamInterface* pBitStream);
bool IsInside() const { return m_bInside; }
bool IsDeferredDelete() const { return m_bDeferredDelete; }
void SetDeferredDelete() { m_bDeferredDelete = true; }

protected:
void OnReceiveError(const SString& strMessage);

const NetPlayerID m_RemoteId;
const ushort m_usBitStreamVersion;
SReceiveItem activeRx;
bool m_bInside{};
bool m_bDeferredDelete{};
};

///////////////////////////////////////////////////////////////
Expand Down

0 comments on commit 934967f

Please sign in to comment.