Further paranoia changes to prevent timer callbacks from occurring in an uncontrolled state.

This commit is contained in:
lotodore
2009-06-15 22:34:07 +00:00
parent 3d57f65e2b
commit 22edd63dde
6 changed files with 66 additions and 5 deletions
+9 -1
View File
@@ -1156,7 +1156,7 @@ ClientStateSynchronizeStart::TimerLoop(const boost::system::error_code& ec, boos
}
void
ClientStateSynchronizeStart::InternalHandlePacket(boost::shared_ptr<ClientThread> client, boost::shared_ptr<NetPacket> tmpPacket)
ClientStateSynchronizeStart::InternalHandlePacket(boost::shared_ptr<ClientThread> /*client*/, boost::shared_ptr<NetPacket> tmpPacket)
{
if (tmpPacket->ToNetPacketGameStart())
throw ClientException(__FILE__, __LINE__, ERR_NET_START_TIMEOUT, 0);
@@ -1630,3 +1630,11 @@ ClientStateRunHand::ResetPlayerSets(Game &curGame)
}
}
//-----------------------------------------------------------------------------
ClientStateFinal &
ClientStateFinal::Instance()
{
static ClientStateFinal state;
return state;
}
+3
View File
@@ -444,6 +444,9 @@ ClientThread::Main()
// Execute remaining ready handlers.
m_ioService->reset();
m_ioService->poll();
// Set a state which does not do anything.
SetState(CLIENT_FINAL_STATE::Instance());
} catch (const PokerTHException &e)
{
GetCallback().SignalNetClientError(e.GetErrorId(), e.GetOsErrorCode());
+2 -3
View File
@@ -69,8 +69,7 @@ void
ServerGame::Exit()
{
m_voteKickTimer.cancel();
if (m_curState)
m_curState->Exit(shared_from_this());
SetState(ServerGameStateFinal::Instance());
}
u_int32_t
@@ -131,7 +130,7 @@ ServerGame::RemoveAllSessions()
void
ServerGame::TimerVoteKick(const boost::system::error_code &ec)
{
if (!ec)
if (!ec && m_curState != &ServerGameStateFinal::Instance())
{
// Check whether someone should be kicked, or whether a vote kick should be aborted.
// Only one vote kick can be active at a time.
+10
View File
@@ -1193,3 +1193,13 @@ ServerGameStateWaitPlayerAction::TimerTimeout(const boost::system::error_code &e
//-----------------------------------------------------------------------------
ServerGameStateFinal ServerGameStateFinal::s_state;
ServerGameStateFinal &
ServerGameStateFinal::Instance()
{
return s_state;
}
//-----------------------------------------------------------------------------