1
0
mirror of https://github.com/VCMP-SqMod/SqMod.git synced 2024-11-08 08:47:17 +01:00

Add back the VMClose event on event types to avoid crashes.

This commit is contained in:
Sandu Liviu Catalin 2015-11-01 02:02:16 +02:00
parent 1fd54aead6
commit dd685a13e4
6 changed files with 76 additions and 23 deletions

View File

@ -33,17 +33,19 @@ BasicEvent::BasicEvent(SQInt32 type, bool suspended) noexcept
, m_Data() , m_Data()
, m_Suspended(suspended) , m_Suspended(suspended)
{ {
// Attach to the specified event signal
Attach(); Attach();
// Receive notification when the VM is about to be closed to release object references
_Core->VMClose.Connect< BasicEvent, &BasicEvent::VMClose >(this);
} }
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
BasicEvent::~BasicEvent() BasicEvent::~BasicEvent()
{ {
// Detach from the specified event signal
Detach(); Detach();
// Release the reference to the specified callback // Stop receiving notification when the VM is about to be closed
m_OnTrigger.Release2(); _Core->VMClose.Disconnect< BasicEvent, &BasicEvent::VMClose >(this);
// Release the reference to the specified user data
m_Data.Release();
} }
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
@ -82,10 +84,30 @@ bool BasicEvent::operator >= (const BasicEvent & o) const noexcept
return (m_Type >= o.m_Type); return (m_Type >= o.m_Type);
} }
// ------------------------------------------------------------------------------------------------
void BasicEvent::VMClose() noexcept
{
// Release the reference to the specified callbacks
m_OnTrigger.Release2();
// Release the reference to the specified user data
m_Data.Release();
}
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
SQInt32 BasicEvent::Cmp(const BasicEvent & o) const noexcept SQInt32 BasicEvent::Cmp(const BasicEvent & o) const noexcept
{ {
return m_Type == o.m_Type ? 0 : (m_Type > o.m_Type ? 1 : -1); if (m_Type == o.m_Type)
{
return 0;
}
else if (m_Type > o.m_Type)
{
return 1;
}
else
{
return -1;
}
} }
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------

View File

@ -117,6 +117,11 @@ public:
return (m_Type == EVT_UNKNOWN || m_Type >= EVT_COUNT); return (m_Type == EVT_UNKNOWN || m_Type >= EVT_COUNT);
} }
/* --------------------------------------------------------------------------------------------
* ...
*/
void VMClose() noexcept;
/* -------------------------------------------------------------------------------------------- /* --------------------------------------------------------------------------------------------
* ... * ...
*/ */

View File

@ -50,6 +50,8 @@ GlobalEvent::GlobalEvent(SQInt32 type, bool suspended) noexcept
{ {
// Attach to the specified event signal // Attach to the specified event signal
Attach(); Attach();
// Receive notification when the VM is about to be closed to release object references
_Core->VMClose.Connect< GlobalEvent, &GlobalEvent::VMClose >(this);
/* Entity filters are empty so there's nothing to hook to! */ /* Entity filters are empty so there's nothing to hook to! */
} }
@ -58,16 +60,9 @@ GlobalEvent::~GlobalEvent()
{ {
// Detach from the specified event signal // Detach from the specified event signal
Detach(); Detach();
// Stop receiving notification when the VM is about to be closed
_Core->VMClose.Disconnect< GlobalEvent, &GlobalEvent::VMClose >(this);
/* We're expecting the entity filters to unhook themselves from the destroy signal! */ /* We're expecting the entity filters to unhook themselves from the destroy signal! */
// Release the reference to the specified callbacks
m_OnTrigger.Release2();
m_OnInclude.Release2();
m_OnExclude.Release2();
m_OnCleared.Release2();
m_OnRelease.Release2();
// Release the reference to the specified user data
m_Data.Release();
} }
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
@ -106,6 +101,19 @@ bool GlobalEvent::operator >= (const GlobalEvent & o) const noexcept
return (m_Type >= o.m_Type); return (m_Type >= o.m_Type);
} }
// ------------------------------------------------------------------------------------------------
void GlobalEvent::VMClose() noexcept
{
// Release the reference to the specified callbacks
m_OnTrigger.Release2();
m_OnInclude.Release2();
m_OnExclude.Release2();
m_OnCleared.Release2();
m_OnRelease.Release2();
// Release the reference to the specified user data
m_Data.Release();
}
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
SQInt32 GlobalEvent::Cmp(const GlobalEvent & o) const noexcept SQInt32 GlobalEvent::Cmp(const GlobalEvent & o) const noexcept
{ {

View File

@ -365,6 +365,11 @@ public:
return (m_Type == EVT_UNKNOWN || m_Type >= EVT_COUNT); return (m_Type == EVT_UNKNOWN || m_Type >= EVT_COUNT);
} }
/* --------------------------------------------------------------------------------------------
* ...
*/
void VMClose() noexcept;
/* -------------------------------------------------------------------------------------------- /* --------------------------------------------------------------------------------------------
* ... * ...
*/ */

View File

@ -48,6 +48,8 @@ LocalEvent::LocalEvent(SQInt32 type, bool suspended) noexcept
, m_Textdraws(this) , m_Textdraws(this)
, m_Vehicles(this) , m_Vehicles(this)
{ {
// Receive notification when the VM is about to be closed to release object references
_Core->VMClose.Connect< LocalEvent, &LocalEvent::VMClose >(this);
/* Entity filters are empty so there's nothing to hook right now! */ /* Entity filters are empty so there's nothing to hook right now! */
} }
@ -56,16 +58,9 @@ LocalEvent::~LocalEvent()
{ {
// Detach from all attached signals // Detach from all attached signals
Detach(); Detach();
// Stop receiving notification when the VM is about to be closed
_Core->VMClose.Disconnect< LocalEvent, &LocalEvent::VMClose >(this);
/* The entity filters should to unhook themselves from the destroy signal! */ /* The entity filters should to unhook themselves from the destroy signal! */
// Release the reference to the specified callbacks
m_OnTrigger.Release2();
m_OnInclude.Release2();
m_OnExclude.Release2();
m_OnCleared.Release2();
m_OnRelease.Release2();
// Release the reference to the specified user data
m_Data.Release();
} }
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
@ -104,6 +99,19 @@ bool LocalEvent::operator >= (const LocalEvent & o) const noexcept
return (m_Type >= o.m_Type); return (m_Type >= o.m_Type);
} }
// ------------------------------------------------------------------------------------------------
void LocalEvent::VMClose() noexcept
{
// Release the reference to the specified callbacks
m_OnTrigger.Release2();
m_OnInclude.Release2();
m_OnExclude.Release2();
m_OnCleared.Release2();
m_OnRelease.Release2();
// Release the reference to the specified user data
m_Data.Release();
}
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
SQInt32 LocalEvent::Cmp(const LocalEvent & o) const noexcept SQInt32 LocalEvent::Cmp(const LocalEvent & o) const noexcept
{ {

View File

@ -365,6 +365,11 @@ public:
return (m_Type == EVT_UNKNOWN || m_Type >= EVT_COUNT); return (m_Type == EVT_UNKNOWN || m_Type >= EVT_COUNT);
} }
/* --------------------------------------------------------------------------------------------
* ...
*/
void VMClose() noexcept;
/* -------------------------------------------------------------------------------------------- /* --------------------------------------------------------------------------------------------
* ... * ...
*/ */