Skip to content

Commit c30eb3b

Browse files
committed
Fixed crash when resource stops with open sockets. Removed dependency on VS runtime for release build. Updated project to VS2015.
1 parent a23bf53 commit c30eb3b

File tree

7 files changed

+326
-285
lines changed

7 files changed

+326
-285
lines changed

sockets/include/CSocket.h

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

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

4646
void* GetUserdata ();
47+
lua_State* GetLuaVM() { return m_pLuaVM; }
4748
static int GetTotalOpenSocketCount ();
4849

4950
private:

sockets/include/CSocketManager.h

+4-2
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,12 @@ class CSocketManager
2020
{
2121
public:
2222
static void DoPulse();
23-
23+
static void ResourceStopped( lua_State * luaVM );
24+
2425
static void SocketAdd (CSocket*& pSocket);
25-
static void SocketRemove(CSocket*& pSocket);
26+
static void SocketRemove(CSocket*& pSocket, bool bTriggerCloseEvent=true);
2627
static bool GetSocket (CSocket*& pSocket, void* pUserdata);
28+
static bool GetSocketByLuaVM(CSocket*& pSocket, lua_State * luaVM);
2729

2830
static void HandleStop ();
2931
};

sockets/include/ml_sockets.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
/** MODULE SPECIFIC INFORMATION **/
3030
#define MODULE_NAME "Sockets Module"
3131
#define MODULE_AUTHOR "Gamesnert, MCvarial & x86"
32-
#define MODULE_VERSION 1.3f
32+
#define MODULE_VERSION 1.4f
3333

3434
// Include default MTA module SDK includes
3535
#include "Common.h"

sockets/ml_sockets.vcxproj

+277-277
Large diffs are not rendered by default.

sockets/src/CSocket.cpp

+3-2
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,14 @@ CSocket::~CSocket()
6363
}
6464
}
6565

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

sockets/src/CSocketManager.cpp

+32-2
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

sockets/src/ml_sockets.cpp

+7
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,13 @@ MTAEXPORT bool DoPulse ( void )
8181
return true;
8282
}
8383

84+
85+
MTAEXPORT void ResourceStopped ( lua_State * luaVM )
86+
{
87+
CSocketManager::ResourceStopped( luaVM );
88+
}
89+
90+
8491
MTAEXPORT bool ShutdownModule ( void )
8592
{
8693
// Stop all sockets before shutting down the module

0 commit comments

Comments
 (0)