diff --git a/src/net/clientthread.h b/src/net/clientthread.h index 1faee779..a11ca478 100644 --- a/src/net/clientthread.h +++ b/src/net/clientthread.h @@ -22,10 +22,10 @@ #define _CLIENTTHREAD_H_ #include +#include #include #include -#include #include #include #include @@ -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 m_senderHelper; boost::shared_ptr m_receiver; boost::shared_ptr m_avatarDownloader; @@ -233,8 +235,6 @@ private: mutable boost::mutex m_curStatsMutex; ServerStats m_curStats; - boost::shared_ptr m_senderHelper; - friend class AbstractClientStateReceiving; friend class ClientStateInit; friend class ClientStateStartResolve; diff --git a/src/net/common/clientstate.cpp b/src/net/common/clientstate.cpp index 4e150ee8..75b4f916 100644 --- a/src/net/common/clientstate.cpp +++ b/src/net/common/clientstate.cpp @@ -688,8 +688,8 @@ ClientStateStartSession::Process(ClientThread &client) boost::shared_ptr 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 startAck(new NetPacketStartEventAck); - client.GetContext().GetSessionData()->GetSender().Send(client.GetContext().GetSessionData(), startAck); + client.GetSender().Send(client.GetContext().GetSessionData(), startAck); // Unsubscribe lobby messages. client.UnsubscribeLobbyMsg(); diff --git a/src/net/common/clientthread.cpp b/src/net/common/clientthread.cpp index 90b95770..104aebeb 100644 --- a/src/net/common/clientthread.cpp +++ b/src/net/common/clientthread.cpp @@ -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(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(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 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 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(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; } diff --git a/src/net/common/senderhelper.cpp b/src/net/common/senderhelper.cpp index 58fd1fde..8ab7323a 100644 --- a/src/net/common/senderhelper.cpp +++ b/src/net/common/senderhelper.cpp @@ -118,12 +118,13 @@ SenderHelper::Send(boost::shared_ptr session, boost::shared_ptrdataMutex); 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 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 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 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 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); } diff --git a/src/net/common/servergame.cpp b/src/net/common/servergame.cpp index 044a5bef..7dfc2b89 100644 --- a/src/net/common/servergame.cpp +++ b/src/net/common/servergame.cpp @@ -107,7 +107,7 @@ ServerGame::GetCurRound() const void ServerGame::SendToAllPlayers(boost::shared_ptr 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(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(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 player, int reason) NetPacketGameAdminChanged::Data adminChangedData; adminChangedData.playerId = newAdmin->GetUniqueId(); // Choose next player as admin. static_cast(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 player, int reason) thisPlayerLeftData.playerId = player->GetUniqueId(); thisPlayerLeftData.removeReason = reason; static_cast(thisPlayerLeft.get())->SetData(thisPlayerLeftData); - GetSessionManager().SendToAllSessions(thisPlayerLeft, SessionData::Game); + GetSessionManager().SendToAllSessions(GetLobbyThread().GetSender(), thisPlayerLeft, SessionData::Game); GetLobbyThread().NotifyPlayerLeftGame(GetId(), player->GetUniqueId()); } diff --git a/src/net/common/servergamestate.cpp b/src/net/common/servergamestate.cpp index c9661794..b09da84f 100644 --- a/src/net/common/servergamestate.cpp +++ b/src/net/common/servergamestate.cpp @@ -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 tmpPlayer = *i; - if (tmpPlayer->getNetSessionData().get()) - { - int cards[2]; - tmpPlayer->getMyCards(cards); - boost::shared_ptr notifyCards(new NetPacketHandStart); - NetPacketHandStart::Data handStartData; - handStartData.yourCards[0] = static_cast(cards[0]); - handStartData.yourCards[1] = static_cast(cards[1]); - handStartData.smallBlind = curGame.getCurrentHand()->getSmallBlind(); - static_cast(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 tmpPlayer = *i; - if (tmpPlayer->getMyButton() == BUTTON_SMALL_BLIND) - { - boost::shared_ptr 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(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 tmpPlayer = *i; - if (tmpPlayer->getMyButton() == BUTTON_BIG_BLIND) - { - boost::shared_ptr 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(notifyBigBlind.get())->SetData(actionDoneData); - server.SendToAllPlayers(notifyBigBlind, SessionData::Game); - break; - } - ++i; - } -} - static void PerformPlayerAction(ServerGame &server, boost::shared_ptr 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(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(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 tmpPlayer = *i; + if (tmpPlayer->getNetSessionData().get()) + { + int cards[2]; + tmpPlayer->getMyCards(cards); + boost::shared_ptr notifyCards(new NetPacketHandStart); + NetPacketHandStart::Data handStartData; + handStartData.yourCards[0] = static_cast(cards[0]); + handStartData.yourCards[1] = static_cast(cards[1]); + handStartData.smallBlind = curGame.getCurrentHand()->getSmallBlind(); + static_cast(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 tmpPlayer = *i; + if (tmpPlayer->getMyButton() == BUTTON_SMALL_BLIND) + { + boost::shared_ptr 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(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 tmpPlayer = *i; + if (tmpPlayer->getMyButton() == BUTTON_BIG_BLIND) + { + boost::shared_ptr 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(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(reject.get())->SetData(rejectData); - session.sessionData->GetSender().Send(session.sessionData, reject); + server.GetLobbyThread().GetSender().Send(session.sessionData, reject); } } diff --git a/src/net/common/serverlobbythread.cpp b/src/net/common/serverlobbythread.cpp index 588a7d56..7547e168 100644 --- a/src/net/common/serverlobbythread.cpp +++ b/src/net/common/serverlobbythread.cpp @@ -140,7 +140,7 @@ ServerLobbyThread::AddConnection(boost::shared_ptr sock) //} // Create a new session. - boost::shared_ptr sessionData(new SessionData(sock, m_curSessionId++, m_sender, *m_senderCallback)); + boost::shared_ptr 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(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(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(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(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 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 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(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(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(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(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(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(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(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 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 game) game->RemoveAllSessions(); // Notify all players. boost::shared_ptr 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(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(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 s, int errorCode) NetPacketError::Data errorData; errorData.errorCode = errorCode; static_cast(packet.get())->SetData(errorData); - s->GetSender().Send(s, packet); + GetSender().Send(s, packet); } void @@ -1300,7 +1295,7 @@ ServerLobbyThread::SendJoinGameFailed(boost::shared_ptr s, int reas NetPacketJoinGameFailed::Data failedData; failedData.failureCode = reason; static_cast(packet.get())->SetData(failedData); - s->GetSender().Send(s, packet); + GetSender().Send(s, packet); } void @@ -1310,7 +1305,7 @@ ServerLobbyThread::SendGameList(boost::shared_ptr 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(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. diff --git a/src/net/common/sessiondata.cpp b/src/net/common/sessiondata.cpp index 5d8b6b10..6e796c73 100644 --- a/src/net/common/sessiondata.cpp +++ b/src/net/common/sessiondata.cpp @@ -18,15 +18,12 @@ ***************************************************************************/ #include -#include -SessionData::SessionData(boost::shared_ptr sock, SessionId id, - boost::shared_ptr sender, SessionDataCallback &cb) +SessionData::SessionData(boost::shared_ptr 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() { diff --git a/src/net/common/sessionmanager.cpp b/src/net/common/sessionmanager.cpp index 33a3c827..3e2ada94 100644 --- a/src/net/common/sessionmanager.cpp +++ b/src/net/common/sessionmanager.cpp @@ -18,7 +18,7 @@ ***************************************************************************/ #include -#include +#include #include #include @@ -363,7 +363,7 @@ SessionManager::GetRawSessionCount() } void -SessionManager::SendToAllSessions(boost::shared_ptr packet, SessionData::State state) +SessionManager::SendToAllSessions(SenderHelper &sender, boost::shared_ptr packet, SessionData::State state) { boost::recursive_mutex::scoped_lock lock(m_sessionMapMutex); @@ -377,13 +377,13 @@ SessionManager::SendToAllSessions(boost::shared_ptr 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(packet->Clone())); + sender.Send(i->second.sessionData, boost::shared_ptr(packet->Clone())); ++i; } } void -SessionManager::SendLobbyMsgToAllSessions(boost::shared_ptr packet, SessionData::State state) +SessionManager::SendLobbyMsgToAllSessions(SenderHelper &sender, boost::shared_ptr packet, SessionData::State state) { boost::recursive_mutex::scoped_lock lock(m_sessionMapMutex); @@ -397,13 +397,13 @@ SessionManager::SendLobbyMsgToAllSessions(boost::shared_ptr 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(packet->Clone())); + sender.Send(i->second.sessionData, boost::shared_ptr(packet->Clone())); ++i; } } void -SessionManager::SendToAllButOneSessions(boost::shared_ptr packet, SessionId except, SessionData::State state) +SessionManager::SendToAllButOneSessions(SenderHelper &sender, boost::shared_ptr packet, SessionId except, SessionData::State state) { boost::recursive_mutex::scoped_lock lock(m_sessionMapMutex); @@ -415,7 +415,7 @@ SessionManager::SendToAllButOneSessions(boost::shared_ptr 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(packet->Clone())); + sender.Send(i->second.sessionData, boost::shared_ptr(packet->Clone())); ++i; } } diff --git a/src/net/senderhelper.h b/src/net/senderhelper.h index 7b7c54c7..6b6be0a7 100644 --- a/src/net/senderhelper.h +++ b/src/net/senderhelper.h @@ -21,29 +21,24 @@ #ifndef _SENDERHELPER_H_ #define _SENDERHELPER_H_ -#include #include #include class SessionData; class SendDataManager; -class SenderHelper : public SenderInterface +class SenderHelper { public: SenderHelper(SenderCallback &cb, boost::shared_ptr ioService); - virtual ~SenderHelper(); + ~SenderHelper(); - virtual void Send(boost::shared_ptr session, boost::shared_ptr packet); - virtual void Send(boost::shared_ptr session, const NetPacketList &packetList); + void Send(boost::shared_ptr session, boost::shared_ptr packet); + void Send(boost::shared_ptr session, const NetPacketList &packetList); - virtual void Process(); - - virtual void SignalSessionTerminated(unsigned sessionId); + void SignalSessionTerminated(unsigned sessionId); protected: - typedef std::list SessionIdList; - typedef std::map > 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 diff --git a/src/net/servergamestate.h b/src/net/servergamestate.h index 4f0a979e..d699bf3e 100644 --- a/src/net/servergamestate.h +++ b/src/net/servergamestate.h @@ -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. diff --git a/src/net/serverlobbythread.h b/src/net/serverlobbythread.h index b8ac9d44..2a7793af 100644 --- a/src/net/serverlobbythread.h +++ b/src/net/serverlobbythread.h @@ -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 m_work; boost::shared_ptr m_senderCallback; - boost::shared_ptr m_sender; + boost::shared_ptr m_sender; boost::shared_ptr m_receiver; SessionManager m_sessionManager; diff --git a/src/net/sessiondata.h b/src/net/sessiondata.h index ed9a02a8..22e544be 100644 --- a/src/net/sessiondata.h +++ b/src/net/sessiondata.h @@ -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 sock, SessionId id, - boost::shared_ptr sender, SessionDataCallback &cb); + SessionData(boost::shared_ptr 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 m_sender; SessionDataCallback &m_callback; unsigned m_maxNumPlayers; diff --git a/src/net/sessionmanager.h b/src/net/sessionmanager.h index 3f85188c..75007f55 100644 --- a/src/net/sessionmanager.h +++ b/src/net/sessionmanager.h @@ -28,8 +28,8 @@ #include #include -class SenderInterface; class NetPacket; +class SenderHelper; struct SessionWrapper { @@ -73,9 +73,9 @@ public: void Clear(); unsigned GetRawSessionCount(); - void SendToAllSessions(boost::shared_ptr packet, SessionData::State state); - void SendLobbyMsgToAllSessions(boost::shared_ptr packet, SessionData::State state); - void SendToAllButOneSessions(boost::shared_ptr packet, SessionId except, SessionData::State state); + void SendToAllSessions(SenderHelper &sender, boost::shared_ptr packet, SessionData::State state); + void SendLobbyMsgToAllSessions(SenderHelper &sender, boost::shared_ptr packet, SessionData::State state); + void SendToAllButOneSessions(SenderHelper &sender, boost::shared_ptr packet, SessionId except, SessionData::State state); protected: