|
@@ -12,14 +12,14 @@ namespace BansheeEngine
|
|
|
public:
|
|
public:
|
|
|
BaseConnectionData()
|
|
BaseConnectionData()
|
|
|
:prev(nullptr), next(nullptr), isActive(true),
|
|
:prev(nullptr), next(nullptr), isActive(true),
|
|
|
- hasHandleLink(true)
|
|
|
|
|
|
|
+ handleLinks(0)
|
|
|
{
|
|
{
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
virtual ~BaseConnectionData()
|
|
virtual ~BaseConnectionData()
|
|
|
{
|
|
{
|
|
|
- assert(!hasHandleLink && !isActive);
|
|
|
|
|
|
|
+ assert(!handleLinks && !isActive);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
virtual void deactivate()
|
|
virtual void deactivate()
|
|
@@ -30,7 +30,7 @@ namespace BansheeEngine
|
|
|
BaseConnectionData* prev;
|
|
BaseConnectionData* prev;
|
|
|
BaseConnectionData* next;
|
|
BaseConnectionData* next;
|
|
|
bool isActive;
|
|
bool isActive;
|
|
|
- bool hasHandleLink;
|
|
|
|
|
|
|
+ UINT32 handleLinks;
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -74,9 +74,10 @@ namespace BansheeEngine
|
|
|
BS_LOCK_RECURSIVE_MUTEX(mMutex);
|
|
BS_LOCK_RECURSIVE_MUTEX(mMutex);
|
|
|
|
|
|
|
|
conn->deactivate();
|
|
conn->deactivate();
|
|
|
- conn->hasHandleLink = false;
|
|
|
|
|
|
|
+ conn->handleLinks--;
|
|
|
|
|
|
|
|
- free(conn);
|
|
|
|
|
|
|
+ if (conn->handleLinks == 0)
|
|
|
|
|
+ free(conn);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -92,7 +93,7 @@ namespace BansheeEngine
|
|
|
BaseConnectionData* next = conn->next;
|
|
BaseConnectionData* next = conn->next;
|
|
|
conn->deactivate();
|
|
conn->deactivate();
|
|
|
|
|
|
|
|
- if (!conn->hasHandleLink)
|
|
|
|
|
|
|
+ if (conn->handleLinks == 0)
|
|
|
free(conn);
|
|
free(conn);
|
|
|
|
|
|
|
|
conn = next;
|
|
conn = next;
|
|
@@ -109,9 +110,9 @@ namespace BansheeEngine
|
|
|
{
|
|
{
|
|
|
BS_LOCK_RECURSIVE_MUTEX(mMutex);
|
|
BS_LOCK_RECURSIVE_MUTEX(mMutex);
|
|
|
|
|
|
|
|
- conn->hasHandleLink = false;
|
|
|
|
|
|
|
+ conn->handleLinks--;
|
|
|
|
|
|
|
|
- if (!conn->isActive)
|
|
|
|
|
|
|
+ if (conn->handleLinks == 0 && !conn->isActive)
|
|
|
free(conn);
|
|
free(conn);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -161,7 +162,9 @@ namespace BansheeEngine
|
|
|
|
|
|
|
|
explicit HEvent(const SPtr<EventInternalData>& eventData, BaseConnectionData* connection)
|
|
explicit HEvent(const SPtr<EventInternalData>& eventData, BaseConnectionData* connection)
|
|
|
:mConnection(connection), mEventData(eventData)
|
|
:mConnection(connection), mEventData(eventData)
|
|
|
- { }
|
|
|
|
|
|
|
+ {
|
|
|
|
|
+ connection->handleLinks++;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
~HEvent()
|
|
~HEvent()
|
|
|
{
|
|
{
|
|
@@ -197,6 +200,17 @@ namespace BansheeEngine
|
|
|
return (mConnection != nullptr ? &Bool_struct::_Member : 0);
|
|
return (mConnection != nullptr ? &Bool_struct::_Member : 0);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ HEvent& operator=(const HEvent& rhs)
|
|
|
|
|
+ {
|
|
|
|
|
+ mConnection = rhs.mConnection;
|
|
|
|
|
+ mEventData = rhs.mEventData;
|
|
|
|
|
+
|
|
|
|
|
+ if (mConnection != nullptr)
|
|
|
|
|
+ mConnection->handleLinks++;
|
|
|
|
|
+
|
|
|
|
|
+ return *this;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
private:
|
|
private:
|
|
|
BaseConnectionData* mConnection;
|
|
BaseConnectionData* mConnection;
|
|
|
SPtr<EventInternalData> mEventData;
|
|
SPtr<EventInternalData> mEventData;
|
|
@@ -254,7 +268,7 @@ namespace BansheeEngine
|
|
|
connData->next->prev = nullptr;
|
|
connData->next->prev = nullptr;
|
|
|
|
|
|
|
|
connData->isActive = true;
|
|
connData->isActive = true;
|
|
|
- connData->hasHandleLink = true;
|
|
|
|
|
|
|
+ connData->handleLinks = true;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (connData == nullptr)
|
|
if (connData == nullptr)
|