Skip to content

Commit f0b2bad

Browse files
Unknownunknown
authored andcommitted
Fixed crash when resource stops with open sockets (by ccw808)
1 parent 5f7919e commit f0b2bad

File tree

4 files changed

+43
-7
lines changed

4 files changed

+43
-7
lines changed

modules/sockets/include/CSocket.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,13 @@ class CSocket
3737
CSocket (lua_State *luaVM, const string& strHost, const unsigned short& usPort);
3838
~CSocket (); // Delete only - Does not trigger any events
3939

40-
void CloseSocketWithEvent (); // Close socket and trigger event
40+
void CloseSocketWithEvent (bool bTriggerCloseEvent); // Close socket and optionally trigger event
4141
bool Send (const string& data);
4242
bool DoPulse ();
4343
bool IsConnected ();
4444

4545
void* GetUserdata ();
46+
lua_State* GetLuaVM() { return m_pLuaVM; }
4647
static int GetTotalOpenSocketCount ();
4748

4849
private:

modules/sockets/include/CSocketManager.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,14 @@ class CSocketManager
1919
{
2020
public:
2121
static void DoPulse();
22-
22+
static void ResourceStopped( lua_State * luaVM );
23+
2324
static void SocketAdd (CSocket*& pSocket);
24-
static void SocketRemove(CSocket*& pSocket);
25+
static void SocketRemove(CSocket*& pSocket, bool bTriggerCloseEvent=true);
2526
static bool GetSocket (CSocket*& pSocket, void* pUserdata);
27+
static bool GetSocketByLuaVM(CSocket*& pSocket, lua_State * luaVM);
2628

2729
static void HandleStop ();
2830
};
31+
32+
#endif

modules/sockets/src/CSocket.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,13 +64,14 @@ CSocket::~CSocket()
6464
}
6565
}
6666

67-
void CSocket::CloseSocketWithEvent()
67+
void CSocket::CloseSocketWithEvent(bool bTriggerCloseEvent)
6868
{
6969
// Close the socket, if it exists, and trigger the closed event
7070
if (m_pSocket != ERR_INVALID_SOCKET)
7171
{
7272
CloseSocket();
73-
TriggerEvent("onSockClosed");
73+
if ( bTriggerCloseEvent )
74+
TriggerEvent("onSockClosed");
7475
}
7576
}
7677

modules/sockets/src/CSocketManager.cpp

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,17 +39,29 @@ void CSocketManager::DoPulse()
3939
}
4040
}
4141

42+
43+
void CSocketManager::ResourceStopped( lua_State * luaVM )
44+
{
45+
// Enusure all sockets using luaVM are closed
46+
CSocket* pSocket;
47+
while( GetSocketByLuaVM( pSocket, luaVM ) )
48+
{
49+
SocketRemove( pSocket, false );
50+
}
51+
}
52+
53+
4254
void CSocketManager::SocketAdd(CSocket*& pSocket)
4355
{
4456
// Add the socket to the loop stuff
4557
vecSockets.push_back(pSocket);
4658
}
4759

48-
void CSocketManager::SocketRemove(CSocket*& pSocket)
60+
void CSocketManager::SocketRemove(CSocket*& pSocket, bool bTriggerCloseEvent)
4961
{
5062
ListRemove(vecSockets, pSocket);
5163
ListRemove(processQueue, pSocket);
52-
pSocket->CloseSocketWithEvent();
64+
pSocket->CloseSocketWithEvent(bTriggerCloseEvent);
5365
ListRemove(deleteList, pSocket);
5466
deleteList.push_back(pSocket);
5567
}
@@ -75,6 +87,24 @@ bool CSocketManager::GetSocket(CSocket*& pSocket, void* pUserdata)
7587
return false;
7688
}
7789

90+
91+
bool CSocketManager::GetSocketByLuaVM(CSocket*& pSocket, lua_State * luaVM)
92+
{
93+
// Loop through all sockets
94+
for (unsigned int i = 0; i < vecSockets.size(); ++i)
95+
{
96+
// Compare the current socket's luaVM with the one we're looking for
97+
if (vecSockets[i]->GetLuaVM() == luaVM)
98+
{
99+
// If it's the one we want, assign pSocket to it and return true
100+
pSocket = vecSockets[i];
101+
return true;
102+
}
103+
}
104+
105+
return false;
106+
}
107+
78108
void CSocketManager::HandleStop()
79109
{
80110
// Triggered at module stop. Simply destroys all sockets

0 commit comments

Comments
 (0)