Use boost::asio timer callbacks instead of self-made ones. There are still some termination issues (terminating a network game will result in a crash). However, it should be quite effective now with a large number of users.
This commit is contained in:
@@ -488,10 +488,10 @@ ServerGameStateInit::TimerAdminWarning(ServerGame &server)
|
||||
session.sessionData->GetSender().Send(session.sessionData, warning);
|
||||
}
|
||||
// Start timeout timer.
|
||||
server.SetStateTimerId(
|
||||
server.GetLobbyThread().GetTimerManager().RegisterTimer(
|
||||
SERVER_GAME_ADMIN_WARNING_REMAINING_SEC * 1000,
|
||||
boost::bind(&ServerGameStateInit::TimerAdminTimeout, this, boost::ref(server))));
|
||||
server.GetLobbyThread().GetTimerManager().RestartTimer(
|
||||
server.GetStateTimerId(),
|
||||
SERVER_GAME_ADMIN_WARNING_REMAINING_SEC * 1000,
|
||||
boost::bind(&ServerGameStateInit::TimerAdminTimeout, this, boost::ref(server)));
|
||||
}
|
||||
|
||||
void
|
||||
@@ -605,7 +605,6 @@ ServerGameStateStartGame::Enter(ServerGame &server)
|
||||
void
|
||||
ServerGameStateStartGame::Exit(ServerGame &server)
|
||||
{
|
||||
// The Id might be invalid, but this is not a problem.
|
||||
server.GetLobbyThread().GetTimerManager().UnregisterTimer(server.GetStateTimerId());
|
||||
server.SetStateTimerId(0);
|
||||
}
|
||||
@@ -722,7 +721,6 @@ ServerGameStateHand::Enter(ServerGame &server)
|
||||
void
|
||||
ServerGameStateHand::Exit(ServerGame &server)
|
||||
{
|
||||
// The Id might be invalid, but this is not a problem.
|
||||
server.GetLobbyThread().GetTimerManager().UnregisterTimer(server.GetStateTimerId());
|
||||
server.SetStateTimerId(0);
|
||||
}
|
||||
@@ -744,7 +742,6 @@ ServerGameStateHand::InternalProcessPacket(ServerGame &/*server*/, SessionWrappe
|
||||
void
|
||||
ServerGameStateHand::TimerLoop(ServerGame &server)
|
||||
{
|
||||
server.SetStateTimerId(0);
|
||||
Game &curGame = server.GetGame();
|
||||
|
||||
// Main game loop.
|
||||
@@ -792,19 +789,19 @@ ServerGameStateHand::TimerLoop(ServerGame &server)
|
||||
server.SendToAllPlayers(allIn, SessionData::Game);
|
||||
curGame.getCurrentHand()->setCardsShown(true);
|
||||
|
||||
server.SetStateTimerId(
|
||||
server.GetLobbyThread().GetTimerManager().RegisterTimer(
|
||||
SERVER_SHOW_CARDS_DELAY_SEC * 1000,
|
||||
boost::bind(&ServerGameStateHand::TimerLoop, this, boost::ref(server))));
|
||||
server.GetLobbyThread().GetTimerManager().RestartTimer(
|
||||
server.GetStateTimerId(),
|
||||
SERVER_SHOW_CARDS_DELAY_SEC * 1000,
|
||||
boost::bind(&ServerGameStateHand::TimerLoop, this, boost::ref(server)));
|
||||
}
|
||||
else
|
||||
{
|
||||
SendNewRoundCards(server, curGame, newRound);
|
||||
|
||||
server.SetStateTimerId(
|
||||
server.GetLobbyThread().GetTimerManager().RegisterTimer(
|
||||
GetDealCardsDelaySec(server) * 1000,
|
||||
boost::bind(&ServerGameStateHand::TimerLoop, this, boost::ref(server))));
|
||||
server.GetLobbyThread().GetTimerManager().RestartTimer(
|
||||
server.GetStateTimerId(),
|
||||
GetDealCardsDelaySec(server) * 1000,
|
||||
boost::bind(&ServerGameStateHand::TimerLoop, this, boost::ref(server)));
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -832,19 +829,19 @@ ServerGameStateHand::TimerLoop(ServerGame &server)
|
||||
// If the player is computer controlled, let the engine act.
|
||||
if (curPlayer->getMyType() == PLAYER_TYPE_COMPUTER)
|
||||
{
|
||||
server.SetStateTimerId(
|
||||
server.GetLobbyThread().GetTimerManager().RegisterTimer(
|
||||
SERVER_COMPUTER_ACTION_DELAY_SEC * 1000,
|
||||
boost::bind(&ServerGameStateHand::TimerComputerAction, this, boost::ref(server))));
|
||||
server.GetLobbyThread().GetTimerManager().RestartTimer(
|
||||
server.GetStateTimerId(),
|
||||
SERVER_COMPUTER_ACTION_DELAY_SEC * 1000,
|
||||
boost::bind(&ServerGameStateHand::TimerComputerAction, this, boost::ref(server)));
|
||||
}
|
||||
// If the player we are waiting for left, continue without him.
|
||||
else if (!server.GetSessionManager().IsPlayerConnected(curPlayer->getMyName()))
|
||||
{
|
||||
PerformPlayerAction(server, curPlayer, PLAYER_ACTION_FOLD, 0);
|
||||
server.SetStateTimerId(
|
||||
server.GetLobbyThread().GetTimerManager().RegisterTimer(
|
||||
SERVER_LOOP_DELAY_MSEC,
|
||||
boost::bind(&ServerGameStateHand::TimerLoop, this, boost::ref(server))));
|
||||
server.GetLobbyThread().GetTimerManager().RestartTimer(
|
||||
server.GetStateTimerId(),
|
||||
SERVER_LOOP_DELAY_MSEC,
|
||||
boost::bind(&ServerGameStateHand::TimerLoop, this, boost::ref(server)));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -924,17 +921,17 @@ ServerGameStateHand::TimerLoop(ServerGame &server)
|
||||
else if (playersWithCash.size() == 1)
|
||||
{
|
||||
// View a dialog for a new game - delayed.
|
||||
server.SetStateTimerId(
|
||||
server.GetLobbyThread().GetTimerManager().RegisterTimer(
|
||||
SERVER_DELAY_NEXT_GAME_SEC * 1000,
|
||||
boost::bind(&ServerGameStateHand::TimerNextGame, this, boost::ref(server))));
|
||||
server.GetLobbyThread().GetTimerManager().RestartTimer(
|
||||
server.GetStateTimerId(),
|
||||
SERVER_DELAY_NEXT_GAME_SEC * 1000,
|
||||
boost::bind(&ServerGameStateHand::TimerNextGame, this, boost::ref(server)));
|
||||
}
|
||||
else
|
||||
{
|
||||
server.SetStateTimerId(
|
||||
server.GetLobbyThread().GetTimerManager().RegisterTimer(
|
||||
SERVER_DELAY_NEXT_HAND_SEC * 1000,
|
||||
boost::bind(&ServerGameStateHand::TimerNextHand, this, boost::ref(server))));
|
||||
server.GetLobbyThread().GetTimerManager().RestartTimer(
|
||||
server.GetStateTimerId(),
|
||||
SERVER_DELAY_NEXT_HAND_SEC * 1000,
|
||||
boost::bind(&ServerGameStateHand::TimerNextHand, this, boost::ref(server)));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -946,10 +943,10 @@ ServerGameStateHand::TimerShowCards(ServerGame &server)
|
||||
Game &curGame = server.GetGame();
|
||||
SendNewRoundCards(server, curGame, curGame.getCurrentHand()->getCurrentRound());
|
||||
|
||||
server.SetStateTimerId(
|
||||
server.GetLobbyThread().GetTimerManager().RegisterTimer(
|
||||
GetDealCardsDelaySec(server) * 1000,
|
||||
boost::bind(&ServerGameStateHand::TimerLoop, this, boost::ref(server))));
|
||||
server.GetLobbyThread().GetTimerManager().RestartTimer(
|
||||
server.GetStateTimerId(),
|
||||
GetDealCardsDelaySec(server) * 1000,
|
||||
boost::bind(&ServerGameStateHand::TimerLoop, this, boost::ref(server)));
|
||||
}
|
||||
|
||||
void
|
||||
@@ -1058,7 +1055,6 @@ ServerGameStateWaitPlayerAction::Enter(ServerGame &server)
|
||||
void
|
||||
ServerGameStateWaitPlayerAction::Exit(ServerGame &server)
|
||||
{
|
||||
// The Id might be invalid, but this is not a problem.
|
||||
server.GetLobbyThread().GetTimerManager().UnregisterTimer(server.GetStateTimerId());
|
||||
server.SetStateTimerId(0);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user