Canceling asio timers has bad semantics, and causes loads of trouble. Therefore, cancelled timers are simply marked as such, and the asio callback is silently ignored. This fixes several crashes, if players were removed from a game due to an error, because some timers were not cancelled. *sigh* This one took a lot of nerve.
This commit is contained in:
1 parent
a6146399d4
commit
c8594e8e7b
10 files changed
+56
-44
No files matched your search
@@ -400,7 +400,7 @@ ServerGameStateInit::TimerAdminWarning(ServerGame &server)
|
||||
server.GetLobbyThread().GetSender().Send(session.sessionData, warning);
|
||||
}
|
||||
// Start timeout timer.
|
||||
server.GetLobbyThread().GetTimerManager().RestartTimer(
|
||||
server.GetLobbyThread().GetTimerManager().AddTimer(
|
||||
server.GetStateTimerId(),
|
||||
SERVER_GAME_ADMIN_WARNING_REMAINING_SEC * 1000,
|
||||
boost::bind(&ServerGameStateInit::TimerAdminTimeout, this, boost::ref(server)));
|
||||
@@ -701,7 +701,7 @@ ServerGameStateHand::TimerLoop(ServerGame &server)
|
||||
server.SendToAllPlayers(allIn, SessionData::Game);
|
||||
curGame.getCurrentHand()->setCardsShown(true);
|
||||
|
||||
server.GetLobbyThread().GetTimerManager().RestartTimer(
|
||||
server.GetLobbyThread().GetTimerManager().AddTimer(
|
||||
server.GetStateTimerId(),
|
||||
SERVER_SHOW_CARDS_DELAY_SEC * 1000,
|
||||
boost::bind(&ServerGameStateHand::TimerLoop, this, boost::ref(server)));
|
||||
@@ -710,7 +710,7 @@ ServerGameStateHand::TimerLoop(ServerGame &server)
|
||||
{
|
||||
SendNewRoundCards(server, curGame, newRound);
|
||||
|
||||
server.GetLobbyThread().GetTimerManager().RestartTimer(
|
||||
server.GetLobbyThread().GetTimerManager().AddTimer(
|
||||
server.GetStateTimerId(),
|
||||
GetDealCardsDelaySec(server) * 1000,
|
||||
boost::bind(&ServerGameStateHand::TimerLoop, this, boost::ref(server)));
|
||||
@@ -741,7 +741,7 @@ ServerGameStateHand::TimerLoop(ServerGame &server)
|
||||
// If the player is computer controlled, let the engine act.
|
||||
if (curPlayer->getMyType() == PLAYER_TYPE_COMPUTER)
|
||||
{
|
||||
server.GetLobbyThread().GetTimerManager().RestartTimer(
|
||||
server.GetLobbyThread().GetTimerManager().AddTimer(
|
||||
server.GetStateTimerId(),
|
||||
SERVER_COMPUTER_ACTION_DELAY_SEC * 1000,
|
||||
boost::bind(&ServerGameStateHand::TimerComputerAction, this, boost::ref(server)));
|
||||
@@ -750,7 +750,7 @@ ServerGameStateHand::TimerLoop(ServerGame &server)
|
||||
else if (!server.GetSessionManager().IsPlayerConnected(curPlayer->getMyName()))
|
||||
{
|
||||
PerformPlayerAction(server, curPlayer, PLAYER_ACTION_FOLD, 0);
|
||||
server.GetLobbyThread().GetTimerManager().RestartTimer(
|
||||
server.GetLobbyThread().GetTimerManager().AddTimer(
|
||||
server.GetStateTimerId(),
|
||||
SERVER_LOOP_DELAY_MSEC,
|
||||
boost::bind(&ServerGameStateHand::TimerLoop, this, boost::ref(server)));
|
||||
@@ -833,14 +833,14 @@ ServerGameStateHand::TimerLoop(ServerGame &server)
|
||||
else if (playersWithCash.size() == 1)
|
||||
{
|
||||
// View a dialog for a new game - delayed.
|
||||
server.GetLobbyThread().GetTimerManager().RestartTimer(
|
||||
server.GetLobbyThread().GetTimerManager().AddTimer(
|
||||
server.GetStateTimerId(),
|
||||
SERVER_DELAY_NEXT_GAME_SEC * 1000,
|
||||
boost::bind(&ServerGameStateHand::TimerNextGame, this, boost::ref(server)));
|
||||
}
|
||||
else
|
||||
{
|
||||
server.GetLobbyThread().GetTimerManager().RestartTimer(
|
||||
server.GetLobbyThread().GetTimerManager().AddTimer(
|
||||
server.GetStateTimerId(),
|
||||
SERVER_DELAY_NEXT_HAND_SEC * 1000,
|
||||
boost::bind(&ServerGameStateHand::TimerNextHand, this, boost::ref(server)));
|
||||
@@ -855,7 +855,7 @@ ServerGameStateHand::TimerShowCards(ServerGame &server)
|
||||
Game &curGame = server.GetGame();
|
||||
SendNewRoundCards(server, curGame, curGame.getCurrentHand()->getCurrentRound());
|
||||
|
||||
server.GetLobbyThread().GetTimerManager().RestartTimer(
|
||||
server.GetLobbyThread().GetTimerManager().AddTimer(
|
||||
server.GetStateTimerId(),
|
||||
GetDealCardsDelaySec(server) * 1000,
|
||||
boost::bind(&ServerGameStateHand::TimerLoop, this, boost::ref(server)));
|
||||
|
||||
Reference in new issue
Block a user