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

View File

@ -103,6 +103,9 @@ void CNetServer::ScriptingInit()
AddProperty(L"onClientDisconnect", &CNetServer::m_OnClientDisconnect); AddProperty(L"onClientDisconnect", &CNetServer::m_OnClientDisconnect);
CJSObject<CNetServer>::ScriptingInit("NetServer"); CJSObject<CNetServer>::ScriptingInit("NetServer");
// Also initialize CNetServerSession
CNetServerSession::ScriptingInit();
} }
bool CNetServer::JSI_Open(JSContext* UNUSED(cx), uintN UNUSED(argc), jsval* UNUSED(argv)) 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_ID(-1),
m_ReadyForTurn(false) m_ReadyForTurn(false)
{ {
ONCE(
ScriptingInit();
);
} }
CNetServerSession::~CNetServerSession() CNetServerSession::~CNetServerSession()
@ -204,12 +201,11 @@ bool CNetServerSession::InGameHandler(CNetMessage *pMsg, CNetSession *pNetSessio
void CNetServerSession::ScriptingInit() void CNetServerSession::ScriptingInit()
{ {
AddProperty( L"id", &CNetServerSession::m_ID );
AddProperty( L"name", (CStrW CNetServerSession::*)&CNetServerSession::m_Name );
AddMethod<bool, &CNetServerSession::JSI_Close>("close", 0); AddMethod<bool, &CNetServerSession::JSI_Close>("close", 0);
CJSObject<CNetServerSession>::ScriptingInit("NetSession"); 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)) bool CNetServerSession::JSI_Close(JSContext* UNUSED(cx), uintN UNUSED(argc), jsval* UNUSED(argv))