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:
lotodore
2009-06-01 19:49:16 +00:00
parent cee2d787d0
commit 47648392fb
7 changed files with 124 additions and 146 deletions
+32 -36
View File
@@ -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);
}