Rewriting sender yet again to fit the new asio design. Polling for new send data is no longer needed, this also reduces lag.

This commit is contained in:
lotodore
2009-06-07 08:51:43 +00:00
parent 9e50969bdc
commit 5f3369432a
14 changed files with 187 additions and 269 deletions
+4 -4
View File
@@ -22,10 +22,10 @@
#define _CLIENTTHREAD_H_
#include <boost/shared_ptr.hpp>
#include <boost/asio.hpp>
#include <string>
#include <core/thread.h>
#include <net/senderinterface.h>
#include <guiinterface.h>
#include <serverdata.h>
#include <playerdata.h>
@@ -33,7 +33,7 @@
class ClientContext;
class ClientState;
class SenderThread;
class SenderHelper;
class ReceiverHelper;
class DownloaderThread;
class ClientSenderCallback;
@@ -127,6 +127,7 @@ protected:
ClientState &GetState();
void SetState(ClientState &newState);
SenderHelper &GetSender();
ReceiverHelper &GetReceiver();
void SetGameId(unsigned id);
@@ -191,6 +192,7 @@ private:
GuiInterface &m_gui;
AvatarManager &m_avatarManager;
boost::shared_ptr<SenderHelper> m_senderHelper;
boost::shared_ptr<ReceiverHelper> m_receiver;
boost::shared_ptr<DownloaderThread> m_avatarDownloader;
@@ -233,8 +235,6 @@ private:
mutable boost::mutex m_curStatsMutex;
ServerStats m_curStats;
boost::shared_ptr<SenderInterface> m_senderHelper;
friend class AbstractClientStateReceiving;
friend class ClientStateInit;
friend class ClientStateStartResolve;
+4 -4
View File
@@ -688,8 +688,8 @@ ClientStateStartSession::Process(ClientThread &client)
boost::shared_ptr<NetPacket> packet(new NetPacketInit);
((NetPacketInit *)packet.get())->SetData(initData);
context.GetSessionData()->GetSender().Send(context.GetSessionData(), packet);
client.GetSender().Send(context.GetSessionData(), packet);
client.SetState(ClientStateWaitSession::Instance());
@@ -968,7 +968,7 @@ ClientStateWaitSession::InternalProcess(ClientThread &client, boost::shared_ptr<
tmpList);
if (!avatarError)
client.GetContext().GetSessionData()->GetSender().Send(client.GetContext().GetSessionData(), tmpList);
client.GetSender().Send(client.GetContext().GetSessionData(), tmpList);
else
throw ClientException(__FILE__, __LINE__, avatarError, 0);
}
@@ -1120,7 +1120,7 @@ ClientStateSynchronizeStart::Process(ClientThread &client)
{
// Acknowledge start.
boost::shared_ptr<NetPacket> startAck(new NetPacketStartEventAck);
client.GetContext().GetSessionData()->GetSender().Send(client.GetContext().GetSessionData(), startAck);
client.GetSender().Send(client.GetContext().GetSessionData(), startAck);
// Unsubscribe lobby messages.
client.UnsubscribeLobbyMsg();
+13 -8
View File
@@ -415,7 +415,6 @@ ClientThread::Main()
if (IsSessionEstablished())
SendPacketLoop();
m_ioService->poll();
GetContext().GetSessionData()->GetSender().Process();
Thread::Msleep(10);
}
} catch (const PokerTHException &e)
@@ -446,7 +445,7 @@ ClientThread::SendPacketLoop()
while (i != end)
{
GetContext().GetSessionData()->GetSender().Send(GetContext().GetSessionData(), *i);
GetSender().Send(GetContext().GetSessionData(), *i);
++i;
}
m_outPacketList.clear();
@@ -477,7 +476,7 @@ ClientThread::RequestPlayerInfo(unsigned id, bool requestAvatar)
NetPacketRetrievePlayerInfo::Data reqData;
reqData.playerId = id;
static_cast<NetPacketRetrievePlayerInfo *>(req.get())->SetData(reqData);
GetContext().GetSessionData()->GetSender().Send(GetContext().GetSessionData(), req);
GetSender().Send(GetContext().GetSessionData(), req);
m_playerInfoRequestList.push_back(id);
@@ -592,7 +591,7 @@ ClientThread::RetrieveAvatarIfNeeded(unsigned id, const PlayerInfo &info)
retrieveAvatarData.requestId = id;
retrieveAvatarData.avatar = info.avatar;
static_cast<NetPacketRetrieveAvatar *>(retrieveAvatar.get())->SetData(retrieveAvatarData);
GetContext().GetSessionData()->GetSender().Send(GetContext().GetSessionData(), retrieveAvatar);
GetSender().Send(GetContext().GetSessionData(), retrieveAvatar);
}
}
}
@@ -688,7 +687,7 @@ ClientThread::UnsubscribeLobbyMsg()
{
// Send unsubscribe request.
boost::shared_ptr<NetPacket> unsubscr(new NetPacketUnsubscribeGameList);
GetContext().GetSessionData()->GetSender().Send(GetContext().GetSessionData(), unsubscr);
GetSender().Send(GetContext().GetSessionData(), unsubscr);
GetContext().SetSubscribeLobbyMsg(false);
}
}
@@ -702,7 +701,7 @@ ClientThread::ResubscribeLobbyMsg()
ClearGameInfoMap();
// Send resubscribe request.
boost::shared_ptr<NetPacket> resubscr(new NetPacketResubscribeGameList);
GetContext().GetSessionData()->GetSender().Send(GetContext().GetSessionData(), resubscr);
GetSender().Send(GetContext().GetSessionData(), resubscr);
GetContext().SetSubscribeLobbyMsg(true);
}
}
@@ -737,7 +736,6 @@ ClientThread::CreateContextSession()
GetContext().SetSessionData(boost::shared_ptr<SessionData>(new SessionData(
newSock,
SESSION_ID_GENERIC,
m_senderHelper,
*m_senderCallback)));
validSocket = true;
} catch (...)
@@ -760,10 +758,17 @@ ClientThread::SetState(ClientState &newState)
m_curState = &newState;
}
SenderHelper &
ClientThread::GetSender()
{
assert(m_senderHelper);
return *m_senderHelper;
}
ReceiverHelper &
ClientThread::GetReceiver()
{
assert(m_receiver.get());
assert(m_receiver);
return *m_receiver;
}
+11 -72
View File
@@ -118,12 +118,13 @@ SenderHelper::Send(boost::shared_ptr<SessionData> session, boost::shared_ptr<Net
// Second: Add packet to specific queue.
boost::mutex::scoped_lock lock(tmpManager->dataMutex);
if (tmpManager->list.size() < SEND_QUEUE_SIZE)
{
tmpManager->list.push_back(packet);
}
}
{
// Third: Update notification list.
boost::mutex::scoped_lock lock(m_changedSessionsMutex);
m_changedSessions.push_back(session->GetId());
// Third: Activate async send, if needed.
tmpManager->AsyncSendNextPacket();
}
}
}
@@ -143,7 +144,7 @@ SenderHelper::Send(boost::shared_ptr<SessionData> session, const NetPacketList &
tmpManager = pos->second;
}
{
// Second: Add packet to specific queue.
// Second: Add packets to specific queue.
boost::mutex::scoped_lock lock(tmpManager->dataMutex);
if (tmpManager->list.size() + packetList.size() <= SEND_QUEUE_SIZE)
{
@@ -157,9 +158,8 @@ SenderHelper::Send(boost::shared_ptr<SessionData> session, const NetPacketList &
}
}
{
// Third: Update notification list.
boost::mutex::scoped_lock lock(m_changedSessionsMutex);
m_changedSessions.push_back(session->GetId());
// Third: Activate async send, if needed.
tmpManager->AsyncSendNextPacket();
}
}
}
@@ -167,71 +167,10 @@ SenderHelper::Send(boost::shared_ptr<SessionData> session, const NetPacketList &
void
SenderHelper::SignalSessionTerminated(unsigned sessionId)
{
boost::mutex::scoped_lock lock(m_removedSessionsMutex);
m_removedSessions.push_back(sessionId);
}
boost::mutex::scoped_lock lock(m_sendQueueMapMutex);
void
SenderHelper::Process()
{
// Close sessions if they were destructed.
{
boost::mutex::scoped_lock lock(m_removedSessionsMutex);
if (!m_removedSessions.empty())
{
SessionIdList newRemovedSessions;
SessionIdList::iterator i = m_removedSessions.begin();
SessionIdList::iterator end = m_removedSessions.end();
boost::mutex::scoped_lock lock(m_sendQueueMapMutex);
while (i != end)
{
SendQueueMap::iterator pos = m_sendQueueMap.find(*i);
if (pos != m_sendQueueMap.end())
{
// Remove session if no write is in progress, else wait.
bool shouldDelete;
{
boost::mutex::scoped_lock lock(pos->second->dataMutex);
shouldDelete = (!pos->second->writeInProgress && pos->second->list.empty());
}
if (shouldDelete)
m_sendQueueMap.erase(pos);
else
newRemovedSessions.push_back(*i);
}
++i;
}
m_removedSessions = newRemovedSessions;
}
}
// Iterate through all changed sessions, and send data if needed.
bool sessionValid;
do
{
sessionValid = false;
unsigned sessionId = 0;
{
boost::mutex::scoped_lock lock(m_changedSessionsMutex);
if (!m_changedSessions.empty())
{
sessionId = m_changedSessions.front();
m_changedSessions.pop_front();
sessionValid = true;
}
}
boost::shared_ptr<SendDataManager> tmpManager;
if (sessionValid)
{
boost::mutex::scoped_lock lock(m_sendQueueMapMutex);
SendQueueMap::iterator pos = m_sendQueueMap.find(sessionId);
if (pos != m_sendQueueMap.end())
tmpManager = pos->second;
}
if (tmpManager)
tmpManager->AsyncSendNextPacket();
} while (sessionValid);
SendQueueMap::iterator pos = m_sendQueueMap.find(sessionId);
if (pos != m_sendQueueMap.end())
m_sendQueueMap.erase(pos);
}
+5 -5
View File
@@ -107,7 +107,7 @@ ServerGame::GetCurRound() const
void
ServerGame::SendToAllPlayers(boost::shared_ptr<NetPacket> packet, SessionData::State state)
{
GetSessionManager().SendToAllSessions(packet, state);
GetSessionManager().SendToAllSessions(GetLobbyThread().GetSender(), packet, state);
}
void
@@ -314,7 +314,7 @@ ServerGame::InternalDenyAskVoteKick(SessionWrapper byWhom, unsigned playerIdWho,
denyPetitionData.playerId = playerIdWho;
denyPetitionData.denyReason = reason;
static_cast<NetPacketAskKickPlayerDenied *>(denyPetition.get())->SetData(denyPetitionData);
byWhom.sessionData->GetSender().Send(byWhom.sessionData, denyPetition);
GetLobbyThread().GetSender().Send(byWhom.sessionData, denyPetition);
}
void
@@ -363,7 +363,7 @@ ServerGame::InternalDenyVoteKick(SessionWrapper byWhom, unsigned petitionId, Den
denyVoteData.petitionId = petitionId;
denyVoteData.denyReason = reason;
static_cast<NetPacketVoteKickPlayerDenied *>(denyVote.get())->SetData(denyVoteData);
byWhom.sessionData->GetSender().Send(byWhom.sessionData, denyVote);
GetLobbyThread().GetSender().Send(byWhom.sessionData, denyVote);
}
PlayerDataList
@@ -543,7 +543,7 @@ ServerGame::RemovePlayerData(boost::shared_ptr<PlayerData> player, int reason)
NetPacketGameAdminChanged::Data adminChangedData;
adminChangedData.playerId = newAdmin->GetUniqueId(); // Choose next player as admin.
static_cast<NetPacketGameAdminChanged *>(adminChanged.get())->SetData(adminChangedData);
GetSessionManager().SendToAllSessions(adminChanged, SessionData::Game);
GetSessionManager().SendToAllSessions(GetLobbyThread().GetSender(), adminChanged, SessionData::Game);
GetLobbyThread().NotifyGameAdminChanged(GetId(), newAdmin->GetUniqueId());
}
@@ -557,7 +557,7 @@ ServerGame::RemovePlayerData(boost::shared_ptr<PlayerData> player, int reason)
thisPlayerLeftData.playerId = player->GetUniqueId();
thisPlayerLeftData.removeReason = reason;
static_cast<NetPacketPlayerLeft *>(thisPlayerLeft.get())->SetData(thisPlayerLeftData);
GetSessionManager().SendToAllSessions(thisPlayerLeft, SessionData::Game);
GetSessionManager().SendToAllSessions(GetLobbyThread().GetSender(), thisPlayerLeft, SessionData::Game);
GetLobbyThread().NotifyPlayerLeftGame(GetId(), player->GetUniqueId());
}
+94 -93
View File
@@ -130,94 +130,6 @@ static void SendNewRoundCards(ServerGame &server, Game &curGame, int state)
}
}
static void StartNewHand(ServerGame &server)
{
// Initialize hand.
Game &curGame = server.GetGame();
curGame.initHand();
// HACK: Skip GUI notification run
curGame.getCurrentHand()->getFlop()->skipFirstRunGui();
curGame.getCurrentHand()->getTurn()->skipFirstRunGui();
curGame.getCurrentHand()->getRiver()->skipFirstRunGui();
// Consider all players, even inactive.
PlayerListIterator i = curGame.getSeatsList()->begin();
PlayerListIterator end = curGame.getSeatsList()->end();
// Send cards to all players.
while (i != end)
{
// also send to inactive players, but not to disconnected players.
boost::shared_ptr<PlayerInterface> tmpPlayer = *i;
if (tmpPlayer->getNetSessionData().get())
{
int cards[2];
tmpPlayer->getMyCards(cards);
boost::shared_ptr<NetPacket> notifyCards(new NetPacketHandStart);
NetPacketHandStart::Data handStartData;
handStartData.yourCards[0] = static_cast<unsigned>(cards[0]);
handStartData.yourCards[1] = static_cast<unsigned>(cards[1]);
handStartData.smallBlind = curGame.getCurrentHand()->getSmallBlind();
static_cast<NetPacketHandStart *>(notifyCards.get())->SetData(handStartData);
tmpPlayer->getNetSessionData()->GetSender().Send(tmpPlayer->getNetSessionData(), notifyCards);
}
++i;
}
// Start hand.
curGame.startHand();
// Auto small blind / big blind at the beginning of hand.
i = curGame.getActivePlayerList()->begin();
end = curGame.getActivePlayerList()->end();
while (i != end)
{
boost::shared_ptr<PlayerInterface> tmpPlayer = *i;
if (tmpPlayer->getMyButton() == BUTTON_SMALL_BLIND)
{
boost::shared_ptr<NetPacket> notifySmallBlind(new NetPacketPlayersActionDone);
NetPacketPlayersActionDone::Data actionDoneData;
actionDoneData.gameState = GAME_STATE_PREFLOP_SMALL_BLIND;
actionDoneData.playerId = tmpPlayer->getMyUniqueID();
actionDoneData.playerAction = (PlayerAction)tmpPlayer->getMyAction();
actionDoneData.totalPlayerBet = tmpPlayer->getMySet();
actionDoneData.playerMoney = tmpPlayer->getMyCash();
actionDoneData.highestSet = server.GetGame().getCurrentHand()->getCurrentBeRo()->getHighestSet();
actionDoneData.minimumRaise = server.GetGame().getCurrentHand()->getCurrentBeRo()->getMinimumRaise();
static_cast<NetPacketPlayersActionDone *>(notifySmallBlind.get())->SetData(actionDoneData);
server.SendToAllPlayers(notifySmallBlind, SessionData::Game);
break;
}
++i;
}
i = curGame.getActivePlayerList()->begin();
end = curGame.getActivePlayerList()->end();
while (i != end)
{
boost::shared_ptr<PlayerInterface> tmpPlayer = *i;
if (tmpPlayer->getMyButton() == BUTTON_BIG_BLIND)
{
boost::shared_ptr<NetPacket> notifyBigBlind(new NetPacketPlayersActionDone);
NetPacketPlayersActionDone::Data actionDoneData;
actionDoneData.gameState = GAME_STATE_PREFLOP_BIG_BLIND;
actionDoneData.playerId = tmpPlayer->getMyUniqueID();
actionDoneData.playerAction = (PlayerAction)tmpPlayer->getMyAction();
actionDoneData.totalPlayerBet = tmpPlayer->getMySet();
actionDoneData.playerMoney = tmpPlayer->getMyCash();
actionDoneData.highestSet = server.GetGame().getCurrentHand()->getCurrentBeRo()->getHighestSet();
actionDoneData.minimumRaise = server.GetGame().getCurrentHand()->getCurrentBeRo()->getMinimumRaise();
static_cast<NetPacketPlayersActionDone *>(notifyBigBlind.get())->SetData(actionDoneData);
server.SendToAllPlayers(notifyBigBlind, SessionData::Game);
break;
}
++i;
}
}
static void PerformPlayerAction(ServerGame &server, boost::shared_ptr<PlayerInterface> player, PlayerAction action, int bet)
{
Game &curGame = server.GetGame();
@@ -432,7 +344,7 @@ ServerGameStateInit::HandleNewSession(ServerGame &server, SessionWrapper session
joinGameAckData.prights = session.playerData->GetRights();
joinGameAckData.gameData = server.GetGameData();
static_cast<NetPacketJoinGameAck *>(joinGameAck.get())->SetData(joinGameAckData);
session.sessionData->GetSender().Send(session.sessionData, joinGameAck);
server.GetLobbyThread().GetSender().Send(session.sessionData, joinGameAck);
// Send notifications for connected players to client.
PlayerDataList tmpPlayerList = server.GetFullPlayerDataList();
@@ -440,7 +352,7 @@ ServerGameStateInit::HandleNewSession(ServerGame &server, SessionWrapper session
PlayerDataList::iterator player_end = tmpPlayerList.end();
while (player_i != player_end)
{
session.sessionData->GetSender().Send(session.sessionData, CreateNetPacketPlayerJoined(*(*player_i)));
server.GetLobbyThread().GetSender().Send(session.sessionData, CreateNetPacketPlayerJoined(*(*player_i)));
++player_i;
}
@@ -485,7 +397,7 @@ ServerGameStateInit::TimerAdminWarning(ServerGame &server)
warningData.timeoutReason = NETWORK_TIMEOUT_GAME_ADMIN_IDLE;
warningData.remainingSeconds = SERVER_GAME_ADMIN_WARNING_REMAINING_SEC;
static_cast<NetPacketTimeoutWarning *>(warning.get())->SetData(warningData);
session.sessionData->GetSender().Send(session.sessionData, warning);
server.GetLobbyThread().GetSender().Send(session.sessionData, warning);
}
// Start timeout timer.
server.GetLobbyThread().GetTimerManager().RestartTimer(
@@ -686,7 +598,7 @@ ServerGameStateStartGame::DoStart(ServerGame &server)
server.SendToAllPlayers(answer, SessionData::Game);
// Start the first hand.
StartNewHand(server);
ServerGameStateHand::StartNewHand(server);
server.SetState(ServerGameStateHand::Instance());
}
}
@@ -1018,6 +930,95 @@ ServerGameStateHand::GetDealCardsDelaySec(ServerGame &server)
return delay;
}
void
ServerGameStateHand::StartNewHand(ServerGame &server)
{
// Initialize hand.
Game &curGame = server.GetGame();
curGame.initHand();
// HACK: Skip GUI notification run
curGame.getCurrentHand()->getFlop()->skipFirstRunGui();
curGame.getCurrentHand()->getTurn()->skipFirstRunGui();
curGame.getCurrentHand()->getRiver()->skipFirstRunGui();
// Consider all players, even inactive.
PlayerListIterator i = curGame.getSeatsList()->begin();
PlayerListIterator end = curGame.getSeatsList()->end();
// Send cards to all players.
while (i != end)
{
// also send to inactive players, but not to disconnected players.
boost::shared_ptr<PlayerInterface> tmpPlayer = *i;
if (tmpPlayer->getNetSessionData().get())
{
int cards[2];
tmpPlayer->getMyCards(cards);
boost::shared_ptr<NetPacket> notifyCards(new NetPacketHandStart);
NetPacketHandStart::Data handStartData;
handStartData.yourCards[0] = static_cast<unsigned>(cards[0]);
handStartData.yourCards[1] = static_cast<unsigned>(cards[1]);
handStartData.smallBlind = curGame.getCurrentHand()->getSmallBlind();
static_cast<NetPacketHandStart *>(notifyCards.get())->SetData(handStartData);
server.GetLobbyThread().GetSender().Send(tmpPlayer->getNetSessionData(), notifyCards);
}
++i;
}
// Start hand.
curGame.startHand();
// Auto small blind / big blind at the beginning of hand.
i = curGame.getActivePlayerList()->begin();
end = curGame.getActivePlayerList()->end();
while (i != end)
{
boost::shared_ptr<PlayerInterface> tmpPlayer = *i;
if (tmpPlayer->getMyButton() == BUTTON_SMALL_BLIND)
{
boost::shared_ptr<NetPacket> notifySmallBlind(new NetPacketPlayersActionDone);
NetPacketPlayersActionDone::Data actionDoneData;
actionDoneData.gameState = GAME_STATE_PREFLOP_SMALL_BLIND;
actionDoneData.playerId = tmpPlayer->getMyUniqueID();
actionDoneData.playerAction = (PlayerAction)tmpPlayer->getMyAction();
actionDoneData.totalPlayerBet = tmpPlayer->getMySet();
actionDoneData.playerMoney = tmpPlayer->getMyCash();
actionDoneData.highestSet = server.GetGame().getCurrentHand()->getCurrentBeRo()->getHighestSet();
actionDoneData.minimumRaise = server.GetGame().getCurrentHand()->getCurrentBeRo()->getMinimumRaise();
static_cast<NetPacketPlayersActionDone *>(notifySmallBlind.get())->SetData(actionDoneData);
server.SendToAllPlayers(notifySmallBlind, SessionData::Game);
break;
}
++i;
}
i = curGame.getActivePlayerList()->begin();
end = curGame.getActivePlayerList()->end();
while (i != end)
{
boost::shared_ptr<PlayerInterface> tmpPlayer = *i;
if (tmpPlayer->getMyButton() == BUTTON_BIG_BLIND)
{
boost::shared_ptr<NetPacket> notifyBigBlind(new NetPacketPlayersActionDone);
NetPacketPlayersActionDone::Data actionDoneData;
actionDoneData.gameState = GAME_STATE_PREFLOP_BIG_BLIND;
actionDoneData.playerId = tmpPlayer->getMyUniqueID();
actionDoneData.playerAction = (PlayerAction)tmpPlayer->getMyAction();
actionDoneData.totalPlayerBet = tmpPlayer->getMySet();
actionDoneData.playerMoney = tmpPlayer->getMyCash();
actionDoneData.highestSet = server.GetGame().getCurrentHand()->getCurrentBeRo()->getHighestSet();
actionDoneData.minimumRaise = server.GetGame().getCurrentHand()->getCurrentBeRo()->getMinimumRaise();
static_cast<NetPacketPlayersActionDone *>(notifyBigBlind.get())->SetData(actionDoneData);
server.SendToAllPlayers(notifyBigBlind, SessionData::Game);
break;
}
++i;
}
}
//-----------------------------------------------------------------------------
@@ -1133,7 +1134,7 @@ ServerGameStateWaitPlayerAction::InternalProcessPacket(ServerGame &server, Sessi
rejectData.playerBet = actionData.playerBet;
rejectData.rejectionReason = code;
static_cast<NetPacketPlayersActionRejected *>(reject.get())->SetData(rejectData);
session.sessionData->GetSender().Send(session.sessionData, reject);
server.GetLobbyThread().GetSender().Send(session.sessionData, reject);
}
}
+32 -37
View File
@@ -140,7 +140,7 @@ ServerLobbyThread::AddConnection(boost::shared_ptr<tcp::socket> sock)
//}
// Create a new session.
boost::shared_ptr<SessionData> sessionData(new SessionData(sock, m_curSessionId++, m_sender, *m_senderCallback));
boost::shared_ptr<SessionData> sessionData(new SessionData(sock, m_curSessionId++, *m_senderCallback));
m_sessionManager.AddSession(sessionData);
LOG_VERBOSE("Accepted connection - session #" << sessionData->GetId() << ".");
@@ -191,7 +191,7 @@ ServerLobbyThread::ReAddSession(SessionWrapper session, int reason)
NetPacketRemovedFromGame::Data removedData;
removedData.removeReason = reason;
static_cast<NetPacketRemovedFromGame *>(packet.get())->SetData(removedData);
session.sessionData->GetSender().Send(session.sessionData, packet);
GetSender().Send(session.sessionData, packet);
HandleReAddedSession(session);
}
@@ -247,8 +247,8 @@ ServerLobbyThread::NotifyPlayerJoinedGame(unsigned gameId, unsigned playerId)
packetData.gameId = gameId;
packetData.playerId = playerId;
static_cast<NetPacketGameListPlayerJoined *>(packet.get())->SetData(packetData);
m_sessionManager.SendLobbyMsgToAllSessions(packet, SessionData::Established);
m_gameSessionManager.SendLobbyMsgToAllSessions(packet, SessionData::Game);
m_sessionManager.SendLobbyMsgToAllSessions(GetSender(), packet, SessionData::Established);
m_gameSessionManager.SendLobbyMsgToAllSessions(GetSender(), packet, SessionData::Game);
}
void
@@ -260,8 +260,8 @@ ServerLobbyThread::NotifyPlayerLeftGame(unsigned gameId, unsigned playerId)
packetData.gameId = gameId;
packetData.playerId = playerId;
static_cast<NetPacketGameListPlayerLeft *>(packet.get())->SetData(packetData);
m_sessionManager.SendLobbyMsgToAllSessions(packet, SessionData::Established);
m_gameSessionManager.SendLobbyMsgToAllSessions(packet, SessionData::Game);
m_sessionManager.SendLobbyMsgToAllSessions(GetSender(), packet, SessionData::Established);
m_gameSessionManager.SendLobbyMsgToAllSessions(GetSender(), packet, SessionData::Game);
}
void
@@ -273,24 +273,24 @@ ServerLobbyThread::NotifyGameAdminChanged(unsigned gameId, unsigned newAdminPlay
packetData.gameId = gameId;
packetData.newAdminplayerId = newAdminPlayerId;
static_cast<NetPacketGameListAdminChanged *>(packet.get())->SetData(packetData);
m_sessionManager.SendLobbyMsgToAllSessions(packet, SessionData::Established);
m_gameSessionManager.SendLobbyMsgToAllSessions(packet, SessionData::Game);
m_sessionManager.SendLobbyMsgToAllSessions(GetSender(), packet, SessionData::Established);
m_gameSessionManager.SendLobbyMsgToAllSessions(GetSender(), packet, SessionData::Game);
}
void
ServerLobbyThread::NotifyStartingGame(unsigned gameId)
{
boost::shared_ptr<NetPacket> packet = CreateNetPacketGameListUpdate(gameId, GAME_MODE_STARTED);
m_sessionManager.SendLobbyMsgToAllSessions(packet, SessionData::Established);
m_gameSessionManager.SendLobbyMsgToAllSessions(packet, SessionData::Game);
m_sessionManager.SendLobbyMsgToAllSessions(GetSender(), packet, SessionData::Established);
m_gameSessionManager.SendLobbyMsgToAllSessions(GetSender(), packet, SessionData::Game);
}
void
ServerLobbyThread::NotifyReopeningGame(unsigned gameId)
{
boost::shared_ptr<NetPacket> packet = CreateNetPacketGameListUpdate(gameId, GAME_MODE_CREATED);
m_sessionManager.SendLobbyMsgToAllSessions(packet, SessionData::Established);
m_gameSessionManager.SendLobbyMsgToAllSessions(packet, SessionData::Game);
m_sessionManager.SendLobbyMsgToAllSessions(GetSender(), packet, SessionData::Established);
m_gameSessionManager.SendLobbyMsgToAllSessions(GetSender(), packet, SessionData::Game);
}
void
@@ -422,7 +422,7 @@ ServerLobbyThread::SendGlobalChat(const string &message)
outChatData.playerId = 0;
outChatData.text = message;
static_cast<NetPacketChatText *>(outChat.get())->SetData(outChatData);
m_gameSessionManager.SendToAllSessions(outChat, SessionData::Game);
m_gameSessionManager.SendToAllSessions(GetSender(), outChat, SessionData::Game);
}
void
@@ -432,7 +432,7 @@ ServerLobbyThread::SendGlobalMsgBox(const string &message)
NetPacketMsgBoxText::Data outMsgData;
outMsgData.text = message;
static_cast<NetPacketMsgBoxText *>(outMsg.get())->SetData(outMsgData);
m_gameSessionManager.SendToAllSessions(outMsg, SessionData::Game);
m_gameSessionManager.SendToAllSessions(GetSender(), outMsg, SessionData::Game);
}
void
@@ -474,7 +474,7 @@ ServerLobbyThread::GetStartTime() const
return m_startTime;
}
SenderInterface &
SenderHelper &
ServerLobbyThread::GetSender()
{
assert(m_sender);
@@ -560,11 +560,6 @@ ServerLobbyThread::RegisterTimers()
SERVER_UPDATE_AVATAR_LOCK_INTERVAL_MSEC,
boost::bind(&ServerLobbyThread::TimerUpdateClientAvatarLock, this),
true);
// Check if new data needs to be sent.
m_timerManager.RegisterTimer(
SERVER_PROCESS_SEND_INTERVAL_MSEC,
boost::bind(&SenderInterface::Process, m_sender),
true);
}
void
@@ -891,7 +886,7 @@ ServerLobbyThread::HandleNetPacketRetrievePlayerInfo(SessionWrapper session, con
infoData.playerInfo.avatarType = AvatarManager::GetAvatarFileType(tmpPlayer->GetAvatarFile());
}
static_cast<NetPacketPlayerInfo *>(info.get())->SetData(infoData);
session.sessionData->GetSender().Send(session.sessionData, info);
GetSender().Send(session.sessionData, info);
}
else
{
@@ -900,7 +895,7 @@ ServerLobbyThread::HandleNetPacketRetrievePlayerInfo(SessionWrapper session, con
NetPacketUnknownPlayerId::Data unknownData;
unknownData.playerId = request.playerId;
static_cast<NetPacketUnknownPlayerId *>(unknown.get())->SetData(unknownData);
session.sessionData->GetSender().Send(session.sessionData, unknown);
GetSender().Send(session.sessionData, unknown);
}
}
@@ -918,7 +913,7 @@ ServerLobbyThread::HandleNetPacketRetrieveAvatar(SessionWrapper session, const N
if (GetAvatarManager().AvatarFileToNetPackets(tmpFile, request.requestId, tmpPackets) == 0)
{
avatarFound = true;
session.sessionData->GetSender().Send(session.sessionData, tmpPackets);
GetSender().Send(session.sessionData, tmpPackets);
}
else
LOG_ERROR("Failed to read avatar file for network transmission.");
@@ -931,7 +926,7 @@ ServerLobbyThread::HandleNetPacketRetrieveAvatar(SessionWrapper session, const N
NetPacketUnknownAvatar::Data unknownData;
unknownData.requestId = request.requestId;
static_cast<NetPacketUnknownAvatar *>(unknown.get())->SetData(unknownData);
session.sessionData->GetSender().Send(session.sessionData, unknown);
GetSender().Send(session.sessionData, unknown);
}
}
@@ -1001,7 +996,7 @@ ServerLobbyThread::EstablishSession(SessionWrapper session)
initAckData.sessionId = session.sessionData->GetId(); // TODO: currently unused.
initAckData.playerId = session.playerData->GetUniqueId();
static_cast<NetPacketInitAck *>(initAck.get())->SetData(initAckData);
session.sessionData->GetSender().Send(session.sessionData, initAck);
GetSender().Send(session.sessionData, initAck);
// Send the game list to the client.
SendGameList(session.sessionData);
@@ -1033,7 +1028,7 @@ ServerLobbyThread::RequestPlayerAvatar(SessionWrapper session)
retrieveAvatarData.requestId = session.playerData->GetUniqueId();
retrieveAvatarData.avatar = session.playerData->GetAvatarMD5();
static_cast<NetPacketRetrieveAvatar *>(retrieveAvatar.get())->SetData(retrieveAvatarData);
session.sessionData->GetSender().Send(session.sessionData, retrieveAvatar);
GetSender().Send(session.sessionData, retrieveAvatar);
}
void
@@ -1129,8 +1124,8 @@ ServerLobbyThread::InternalAddGame(boost::shared_ptr<ServerGame> game)
// Add game to list.
m_gameMap.insert(GameMap::value_type(game->GetId(), game));
// Notify all players.
m_sessionManager.SendLobbyMsgToAllSessions(CreateNetPacketGameListNew(*game), SessionData::Established);
m_gameSessionManager.SendLobbyMsgToAllSessions(CreateNetPacketGameListNew(*game), SessionData::Game);
m_sessionManager.SendLobbyMsgToAllSessions(GetSender(), CreateNetPacketGameListNew(*game), SessionData::Established);
m_gameSessionManager.SendLobbyMsgToAllSessions(GetSender(), CreateNetPacketGameListNew(*game), SessionData::Game);
{
boost::mutex::scoped_lock lock(m_statMutex);
@@ -1161,8 +1156,8 @@ ServerLobbyThread::InternalRemoveGame(boost::shared_ptr<ServerGame> game)
game->RemoveAllSessions();
// Notify all players.
boost::shared_ptr<NetPacket> packet = CreateNetPacketGameListUpdate(game->GetId(), GAME_MODE_CLOSED);
m_sessionManager.SendLobbyMsgToAllSessions(packet, SessionData::Established);
m_gameSessionManager.SendLobbyMsgToAllSessions(packet, SessionData::Game);
m_sessionManager.SendLobbyMsgToAllSessions(GetSender(), packet, SessionData::Established);
m_gameSessionManager.SendLobbyMsgToAllSessions(GetSender(), packet, SessionData::Game);
}
void
@@ -1204,7 +1199,7 @@ ServerLobbyThread::InternalResubscribeMsg(SessionWrapper session)
try {
static_cast<NetPacketStatisticsChanged *>(packet.get())->SetData(statData);
session.sessionData->GetSender().Send(session.sessionData, packet);
GetSender().Send(session.sessionData, packet);
} catch (const NetException &)
{
// Ignore errors for now.
@@ -1253,7 +1248,7 @@ ServerLobbyThread::InternalCheckSessionTimeouts(SessionWrapper session)
warningData.timeoutReason = NETWORK_TIMEOUT_GENERIC;
warningData.remainingSeconds = SERVER_TIMEOUT_WARNING_REMAINING_SEC;
static_cast<NetPacketTimeoutWarning *>(packet.get())->SetData(warningData);
session.sessionData->GetSender().Send(session.sessionData, packet);
GetSender().Send(session.sessionData, packet);
}
else if (session.sessionData->GetActivityTimerElapsedSec() >= SERVER_SESSION_ACTIVITY_TIMEOUT_SEC)
{
@@ -1290,7 +1285,7 @@ ServerLobbyThread::SendError(boost::shared_ptr<SessionData> s, int errorCode)
NetPacketError::Data errorData;
errorData.errorCode = errorCode;
static_cast<NetPacketError *>(packet.get())->SetData(errorData);
s->GetSender().Send(s, packet);
GetSender().Send(s, packet);
}
void
@@ -1300,7 +1295,7 @@ ServerLobbyThread::SendJoinGameFailed(boost::shared_ptr<SessionData> s, int reas
NetPacketJoinGameFailed::Data failedData;
failedData.failureCode = reason;
static_cast<NetPacketJoinGameFailed *>(packet.get())->SetData(failedData);
s->GetSender().Send(s, packet);
GetSender().Send(s, packet);
}
void
@@ -1310,7 +1305,7 @@ ServerLobbyThread::SendGameList(boost::shared_ptr<SessionData> s)
GameMap::const_iterator game_end = m_gameMap.end();
while (game_i != game_end)
{
s->GetSender().Send(s, CreateNetPacketGameListNew(*game_i->second));
GetSender().Send(s, CreateNetPacketGameListNew(*game_i->second));
++game_i;
}
}
@@ -1345,8 +1340,8 @@ ServerLobbyThread::BroadcastStatisticsUpdate(const ServerStats &stats)
try {
static_cast<NetPacketStatisticsChanged *>(packet.get())->SetData(statData);
m_sessionManager.SendLobbyMsgToAllSessions(packet, SessionData::Established);
m_gameSessionManager.SendLobbyMsgToAllSessions(packet, SessionData::Game);
m_sessionManager.SendLobbyMsgToAllSessions(GetSender(), packet, SessionData::Established);
m_gameSessionManager.SendLobbyMsgToAllSessions(GetSender(), packet, SessionData::Game);
} catch (const NetException &)
{
// Ignore errors for now.
+1 -10
View File
@@ -18,15 +18,12 @@
***************************************************************************/
#include <net/sessiondata.h>
#include <net/senderinterface.h>
SessionData::SessionData(boost::shared_ptr<boost::asio::ip::tcp::socket> sock, SessionId id,
boost::shared_ptr<SenderInterface> sender, SessionDataCallback &cb)
SessionData::SessionData(boost::shared_ptr<boost::asio::ip::tcp::socket> sock, SessionId id, SessionDataCallback &cb)
: m_socket(sock), m_id(id), m_gameId(0), m_state(SessionData::Init), m_readyFlag(false),
m_wantsLobbyMsg(true), m_activityTimeoutNoticeSent(false), m_callback(cb),
m_maxNumPlayers(0)
{
m_sender = sender;
}
SessionData::~SessionData()
@@ -144,12 +141,6 @@ SessionData::GetReceiveBuffer()
return m_receiveBuffer;
}
SenderInterface &
SessionData::GetSender()
{
return *m_sender;
}
void
SessionData::ResetActivityTimer()
{
+7 -7
View File
@@ -18,7 +18,7 @@
***************************************************************************/
#include <net/sessionmanager.h>
#include <net/senderinterface.h>
#include <net/senderhelper.h>
#include <net/serverexception.h>
#include <net/socket_msg.h>
@@ -363,7 +363,7 @@ SessionManager::GetRawSessionCount()
}
void
SessionManager::SendToAllSessions(boost::shared_ptr<NetPacket> packet, SessionData::State state)
SessionManager::SendToAllSessions(SenderHelper &sender, boost::shared_ptr<NetPacket> packet, SessionData::State state)
{
boost::recursive_mutex::scoped_lock lock(m_sessionMapMutex);
@@ -377,13 +377,13 @@ SessionManager::SendToAllSessions(boost::shared_ptr<NetPacket> packet, SessionDa
// Send each client (with a certain state) a copy of the packet.
if (i->second.sessionData->GetState() == state)
i->second.sessionData->GetSender().Send(i->second.sessionData, boost::shared_ptr<NetPacket>(packet->Clone()));
sender.Send(i->second.sessionData, boost::shared_ptr<NetPacket>(packet->Clone()));
++i;
}
}
void
SessionManager::SendLobbyMsgToAllSessions(boost::shared_ptr<NetPacket> packet, SessionData::State state)
SessionManager::SendLobbyMsgToAllSessions(SenderHelper &sender, boost::shared_ptr<NetPacket> packet, SessionData::State state)
{
boost::recursive_mutex::scoped_lock lock(m_sessionMapMutex);
@@ -397,13 +397,13 @@ SessionManager::SendLobbyMsgToAllSessions(boost::shared_ptr<NetPacket> packet, S
// Send each client (with a certain state) a copy of the packet.
if (i->second.sessionData->GetState() == state && i->second.sessionData->WantsLobbyMsg())
i->second.sessionData->GetSender().Send(i->second.sessionData, boost::shared_ptr<NetPacket>(packet->Clone()));
sender.Send(i->second.sessionData, boost::shared_ptr<NetPacket>(packet->Clone()));
++i;
}
}
void
SessionManager::SendToAllButOneSessions(boost::shared_ptr<NetPacket> packet, SessionId except, SessionData::State state)
SessionManager::SendToAllButOneSessions(SenderHelper &sender, boost::shared_ptr<NetPacket> packet, SessionId except, SessionData::State state)
{
boost::recursive_mutex::scoped_lock lock(m_sessionMapMutex);
@@ -415,7 +415,7 @@ SessionManager::SendToAllButOneSessions(boost::shared_ptr<NetPacket> packet, Ses
// Send each fully connected client but one a copy of the packet.
if (i->second.sessionData->GetState() == state)
if (i->first != except)
i->second.sessionData->GetSender().Send(i->second.sessionData, boost::shared_ptr<NetPacket>(packet->Clone()));
sender.Send(i->second.sessionData, boost::shared_ptr<NetPacket>(packet->Clone()));
++i;
}
}
+5 -16
View File
@@ -21,29 +21,24 @@
#ifndef _SENDERHELPER_H_
#define _SENDERHELPER_H_
#include <net/senderinterface.h>
#include <net/netpacket.h>
#include <net/sendercallback.h>
class SessionData;
class SendDataManager;
class SenderHelper : public SenderInterface
class SenderHelper
{
public:
SenderHelper(SenderCallback &cb, boost::shared_ptr<boost::asio::io_service> ioService);
virtual ~SenderHelper();
~SenderHelper();
virtual void Send(boost::shared_ptr<SessionData> session, boost::shared_ptr<NetPacket> packet);
virtual void Send(boost::shared_ptr<SessionData> session, const NetPacketList &packetList);
void Send(boost::shared_ptr<SessionData> session, boost::shared_ptr<NetPacket> packet);
void Send(boost::shared_ptr<SessionData> session, const NetPacketList &packetList);
virtual void Process();
virtual void SignalSessionTerminated(unsigned sessionId);
void SignalSessionTerminated(unsigned sessionId);
protected:
typedef std::list<unsigned> SessionIdList;
typedef std::map<SessionId, boost::shared_ptr<SendDataManager> > SendQueueMap;
private:
@@ -53,12 +48,6 @@ private:
SendQueueMap m_sendQueueMap;
mutable boost::mutex m_sendQueueMapMutex;
SessionIdList m_changedSessions;
mutable boost::mutex m_changedSessionsMutex;
SessionIdList m_removedSessions;
mutable boost::mutex m_removedSessionsMutex;
};
#endif
+3
View File
@@ -145,9 +145,12 @@ protected:
void TimerNextHand(ServerGame &server);
void TimerNextGame(ServerGame &server);
int GetDealCardsDelaySec(ServerGame &server);
static void StartNewHand(ServerGame &server);
private:
static ServerGameStateHand s_state;
friend class ServerGameStateStartGame;
};
// State: Wait for a player action.
+3 -3
View File
@@ -36,7 +36,7 @@
#define NET_ADMIN_IRC_TERMINATE_TIMEOUT_MSEC 4000
class SenderInterface;
class SenderHelper;
class ReceiverHelper;
class ServerSenderCallback;
class ServerGame;
@@ -95,7 +95,7 @@ public:
ServerStats GetStats() const;
boost::posix_time::ptime GetStartTime() const;
SenderInterface &GetSender();
SenderHelper &GetSender();
protected:
@@ -175,7 +175,7 @@ private:
boost::shared_ptr<boost::asio::io_service::work> m_work;
boost::shared_ptr<ServerSenderCallback> m_senderCallback;
boost::shared_ptr<SenderInterface> m_sender;
boost::shared_ptr<SenderHelper> m_sender;
boost::shared_ptr<ReceiverHelper> m_receiver;
SessionManager m_sessionManager;
+1 -6
View File
@@ -36,15 +36,12 @@ typedef unsigned SessionId;
#define SESSION_ID_INIT INVALID_SESSION
#define SESSION_ID_GENERIC 0xFFFFFFFF
class SenderInterface;
class SessionData
{
public:
enum State { Init, ReceivingAvatar, Established, Game };
SessionData(boost::shared_ptr<boost::asio::ip::tcp::socket> sock, SessionId id,
boost::shared_ptr<SenderInterface> sender, SessionDataCallback &cb);
SessionData(boost::shared_ptr<boost::asio::ip::tcp::socket> sock, SessionId id, SessionDataCallback &cb);
~SessionData();
SessionId GetId() const;
@@ -69,7 +66,6 @@ public:
void SetClientAddr(const std::string &addr);
ReceiveBuffer &GetReceiveBuffer();
SenderInterface &GetSender();
void ResetActivityTimer();
unsigned GetActivityTimerElapsedSec() const;
@@ -92,7 +88,6 @@ private:
boost::timers::portable::microsec_timer m_activityTimer;
bool m_activityTimeoutNoticeSent;
boost::timers::portable::microsec_timer m_autoDisconnectTimer;
boost::shared_ptr<SenderInterface> m_sender;
SessionDataCallback &m_callback;
unsigned m_maxNumPlayers;
+4 -4
View File
@@ -28,8 +28,8 @@
#include <playerdata.h>
#include <core/thread.h>
class SenderInterface;
class NetPacket;
class SenderHelper;
struct SessionWrapper
{
@@ -73,9 +73,9 @@ public:
void Clear();
unsigned GetRawSessionCount();
void SendToAllSessions(boost::shared_ptr<NetPacket> packet, SessionData::State state);
void SendLobbyMsgToAllSessions(boost::shared_ptr<NetPacket> packet, SessionData::State state);
void SendToAllButOneSessions(boost::shared_ptr<NetPacket> packet, SessionId except, SessionData::State state);
void SendToAllSessions(SenderHelper &sender, boost::shared_ptr<NetPacket> packet, SessionData::State state);
void SendLobbyMsgToAllSessions(SenderHelper &sender, boost::shared_ptr<NetPacket> packet, SessionData::State state);
void SendToAllButOneSessions(SenderHelper &sender, boost::shared_ptr<NetPacket> packet, SessionId except, SessionData::State state);
protected: