Initialize CNetServerSession and CNetClient::CServerSession at server and client startup rather than when they are first created, to prevent crashes in SpiderMonkey due to intializing during an event handler or in a different thread.

This was SVN commit r5854.
This commit is contained in:
Matei 2008-04-05 18:36:39 +00:00
parent 3b72e4f92c
commit bdc7f3af7c
4 changed files with 10 additions and 9 deletions

View File

@ -21,7 +21,6 @@ CNetClient::CServerSession::CServerSession(int sessionID, const CStrW& name):
m_SessionID(sessionID),
m_Name(name)
{
ONCE( ScriptingInit(); );
}
void CNetClient::CServerSession::ScriptingInit()
@ -76,6 +75,9 @@ void CNetClient::ScriptingInit()
AddProperty(L"sessions", &CNetClient::m_JSI_ServerSessions);
CJSMap<SessionMap>::ScriptingInit("NetClient_SessionMap");
CJSObject<CNetClient>::ScriptingInit("NetClient");
// Also initialize session objects
CNetClient::CServerSession::ScriptingInit();
}
bool CNetClient::JSI_BeginConnect(JSContext* UNUSED(cx), uintN argc, jsval *argv)

View File

@ -21,13 +21,13 @@ class CNetClient: public CNetSession, protected CTurnManager, public CJSObject<C
{
class CServerSession: public CJSObject<CServerSession>
{
static void ScriptingInit();
public:
CServerSession(int sessionID, const CStrW& name);
int m_SessionID;
CStrW m_Name;
static void ScriptingInit();
};
typedef std::map<int, CServerSession *> SessionMap;

View File

@ -103,6 +103,9 @@ void CNetServer::ScriptingInit()
AddProperty(L"onClientDisconnect", &CNetServer::m_OnClientDisconnect);
CJSObject<CNetServer>::ScriptingInit("NetServer");
// Also initialize CNetServerSession
CNetServerSession::ScriptingInit();
}
bool CNetServer::JSI_Open(JSContext* UNUSED(cx), uintN UNUSED(argc), jsval* UNUSED(argv))

View File

@ -15,9 +15,6 @@ CNetServerSession::CNetServerSession(CNetServer *pServer, CSocketInternal *pInt,
m_ID(-1),
m_ReadyForTurn(false)
{
ONCE(
ScriptingInit();
);
}
CNetServerSession::~CNetServerSession()
@ -204,12 +201,11 @@ bool CNetServerSession::InGameHandler(CNetMessage *pMsg, CNetSession *pNetSessio
void CNetServerSession::ScriptingInit()
{
AddProperty( L"id", &CNetServerSession::m_ID );
AddProperty( L"name", (CStrW CNetServerSession::*)&CNetServerSession::m_Name );
AddMethod<bool, &CNetServerSession::JSI_Close>("close", 0);
CJSObject<CNetServerSession>::ScriptingInit("NetSession");
// Hope this doesn't break anything...
AddProperty( L"id", &CNetServerSession::m_ID );
AddProperty( L"name", (CStrW CNetServerSession::*)&CNetServerSession::m_Name );
}
bool CNetServerSession::JSI_Close(JSContext* UNUSED(cx), uintN UNUSED(argc), jsval* UNUSED(argv))