From 0d60360fcadecaf736132d8a7b00df6d9eba9b30 Mon Sep 17 00:00:00 2001 From: lotodore Date: Sun, 8 Dec 2013 12:20:51 +0100 Subject: [PATCH] Update server ping with each game action (#239). --- src/game_defs.h | 12 --------- src/gui/generic/serverguiwrapper.cpp | 4 +++ src/gui/generic/serverguiwrapper.h | 1 + src/gui/qt/guiwrapper.cpp | 4 +++ src/gui/qt/guiwrapper.h | 1 + src/gui/qt/startwindow/startwindowimpl.h | 3 ++- src/net/clientcallback.h | 2 ++ src/net/clientthread.h | 33 ++++++++++++++++++++++++ src/net/common/clientstate.cpp | 4 +++ src/net/common/clientthread.cpp | 12 +++++++++ src/serverdata.h | 14 +++++++++- 11 files changed, 76 insertions(+), 14 deletions(-) diff --git a/src/game_defs.h b/src/game_defs.h index e068d1eb..2dd70952 100644 --- a/src/game_defs.h +++ b/src/game_defs.h @@ -179,16 +179,4 @@ enum NetTimeoutReason { NETWORK_TIMEOUT_KICK_AFTER_AUTOFOLD }; -struct ServerStats { - ServerStats() - : numberOfPlayersOnServer(0), numberOfGamesOpen(0), totalPlayersEverLoggedIn(0), - totalGamesEverCreated(0), maxGamesOpen(0), maxPlayersLoggedIn(0) {} - unsigned numberOfPlayersOnServer; - unsigned numberOfGamesOpen; - unsigned totalPlayersEverLoggedIn; - unsigned totalGamesEverCreated; - unsigned maxGamesOpen; - unsigned maxPlayersLoggedIn; -}; - #endif diff --git a/src/gui/generic/serverguiwrapper.cpp b/src/gui/generic/serverguiwrapper.cpp index b0b1f535..27813677 100644 --- a/src/gui/generic/serverguiwrapper.cpp +++ b/src/gui/generic/serverguiwrapper.cpp @@ -156,6 +156,10 @@ void ServerGuiWrapper::SignalNetClientStatsUpdate(const ServerStats &stats) { if (myClientcb) myClientcb->SignalNetClientStatsUpdate(stats); } +void ServerGuiWrapper::SignalNetClientPingUpdate(unsigned minPing, unsigned avgPing, unsigned maxPing) +{ + if (myClientcb) myClientcb->SignalNetClientPingUpdate(minPing, avgPing, maxPing); +} void ServerGuiWrapper::SignalNetClientShowTimeoutDialog(NetTimeoutReason reason, unsigned remainingSec) { if (myClientcb) myClientcb->SignalNetClientShowTimeoutDialog(reason, remainingSec); diff --git a/src/gui/generic/serverguiwrapper.h b/src/gui/generic/serverguiwrapper.h index ebf23c28..2986c074 100644 --- a/src/gui/generic/serverguiwrapper.h +++ b/src/gui/generic/serverguiwrapper.h @@ -126,6 +126,7 @@ public: void SignalNetClientError(int errorID, int osErrorID); void SignalNetClientNotification(int notificationId); void SignalNetClientStatsUpdate(const ServerStats &stats); + void SignalNetClientPingUpdate(unsigned minPing, unsigned avgPing, unsigned maxPing); void SignalNetClientShowTimeoutDialog(NetTimeoutReason reason, unsigned remainingSec); void SignalNetClientRemovedFromGame(int notificationId); void SignalNetClientSelfJoined(unsigned playerId, const std::string &playerName, bool isGameAdmin); diff --git a/src/gui/qt/guiwrapper.cpp b/src/gui/qt/guiwrapper.cpp index a8736112..20ef8b6e 100644 --- a/src/gui/qt/guiwrapper.cpp +++ b/src/gui/qt/guiwrapper.cpp @@ -341,6 +341,10 @@ void GuiWrapper::SignalNetClientStatsUpdate(const ServerStats &stats) { myStartWindow->signalNetClientStatsUpdate(stats); } +void GuiWrapper::SignalNetClientPingUpdate(unsigned minPing, unsigned avgPing, unsigned maxPing) +{ + // TODO +} void GuiWrapper::SignalNetClientShowTimeoutDialog(NetTimeoutReason reason, unsigned remainingSec) { myStartWindow->signalNetClientShowTimeoutDialog(reason, remainingSec); diff --git a/src/gui/qt/guiwrapper.h b/src/gui/qt/guiwrapper.h index 6a52e331..a3548f39 100644 --- a/src/gui/qt/guiwrapper.h +++ b/src/gui/qt/guiwrapper.h @@ -138,6 +138,7 @@ public: void SignalNetClientError(int errorID, int osErrorID); void SignalNetClientNotification(int notificationId); void SignalNetClientStatsUpdate(const ServerStats &stats); + void SignalNetClientPingUpdate(unsigned minPing, unsigned avgPing, unsigned maxPing); void SignalNetClientShowTimeoutDialog(NetTimeoutReason reason, unsigned remainingSec); void SignalNetClientRemovedFromGame(int notificationId); void SignalNetClientSelfJoined(unsigned playerId, const std::string &playerName, bool isGameAdmin); diff --git a/src/gui/qt/startwindow/startwindowimpl.h b/src/gui/qt/startwindow/startwindowimpl.h index c101dba1..d826902f 100644 --- a/src/gui/qt/startwindow/startwindowimpl.h +++ b/src/gui/qt/startwindow/startwindowimpl.h @@ -40,7 +40,8 @@ #include "ui_startwindow.h" #endif -#include "game_defs.h" +#include +#include #include #include "mymessagebox.h" diff --git a/src/net/clientcallback.h b/src/net/clientcallback.h index cc6d95af..4f57b28f 100644 --- a/src/net/clientcallback.h +++ b/src/net/clientcallback.h @@ -38,6 +38,7 @@ #include #include +#include class Game; @@ -51,6 +52,7 @@ public: virtual void SignalNetClientError(int errorID, int osErrorID) = 0; virtual void SignalNetClientNotification(int notificationId) = 0; virtual void SignalNetClientStatsUpdate(const ServerStats &stats) = 0; + virtual void SignalNetClientPingUpdate(unsigned minPing, unsigned avgPing, unsigned maxPing) = 0; virtual void SignalNetClientShowTimeoutDialog(NetTimeoutReason reason, unsigned remainingSec) = 0; virtual void SignalNetClientRemovedFromGame(int notificationId) = 0; diff --git a/src/net/clientthread.h b/src/net/clientthread.h index 39de5407..77758997 100644 --- a/src/net/clientthread.h +++ b/src/net/clientthread.h @@ -37,6 +37,8 @@ #include #include #include +#include +#include #include #include @@ -56,6 +58,33 @@ class Log; class QtToolsInterface; struct Gsasl; +#define SIZE_PING_BACKLOG 20 + +class PingData +{ +public: + PingData() : pingTimer(boost::posix_time::time_duration(0, 0, 0), boost::timers::portable::microsec_timer::manual_start) {} + + unsigned MinPing() {return *std::min_element(pingValues.begin(), pingValues.end());} + unsigned MaxPing() {return *std::max_element(pingValues.begin(), pingValues.end());} + unsigned AveragePing() {return std::accumulate(pingValues.begin(), pingValues.end(), 0) / (unsigned)pingValues.size();} + void StartPing() {pingTimer.start();} + void EndPing() + { + if (pingTimer.is_running()) { + pingValues.push_back((unsigned)pingTimer.elapsed().total_milliseconds()); + if (pingValues.size() > SIZE_PING_BACKLOG) { + pingValues.pop_front(); + } + pingTimer.reset(); + } + } + +private: + std::list pingValues; + boost::timers::portable::microsec_timer pingTimer; +}; + class ClientThread : public Thread, public boost::enable_shared_from_this, public SessionDataCallback { public: @@ -228,6 +257,7 @@ protected: void EndPetition(unsigned petitionId); void UpdateStatData(const ServerStats &stats); + void EndPing(); bool IsSessionEstablished() const; void SetSessionEstablished(bool flag); @@ -298,6 +328,9 @@ private: mutable boost::mutex m_curStatsMutex; ServerStats m_curStats; + mutable boost::mutex m_pingDataMutex; + PingData m_pingData; + boost::asio::deadline_timer m_stateTimer; boost::asio::deadline_timer m_avatarTimer; diff --git a/src/net/common/clientstate.cpp b/src/net/common/clientstate.cpp index f1bf33a0..e1b8e15c 100644 --- a/src/net/common/clientstate.cpp +++ b/src/net/common/clientstate.cpp @@ -1771,6 +1771,10 @@ ClientStateRunHand::InternalHandlePacket(boost::shared_ptr client, client->GetClientLog()->transformPlayerActionLog(PlayerAction(netActionDone.playeraction())), netActionDone.totalplayerbet() - tmpPlayer->getMySet() ); + if (tmpPlayer->getMyID() == 0) + { + client->EndPing(); + } } // Update last players turn only after the blinds. curGame->getCurrentHand()->setPreviousPlayerID(tmpPlayer->getMyID()); diff --git a/src/net/common/clientthread.cpp b/src/net/common/clientthread.cpp index 775bce70..fc0c4d6f 100644 --- a/src/net/common/clientthread.cpp +++ b/src/net/common/clientthread.cpp @@ -158,6 +158,10 @@ ClientThread::SendPlayerAction() { // Warning: This function is called in the context of the GUI thread. // Create a network packet containing the current player action. + { + boost::mutex::scoped_lock lock(m_pingDataMutex); + m_pingData.StartPing(); + } boost::shared_ptr packet(new NetPacket); packet->GetMsg()->set_messagetype(PokerTHMessage::Type_MyActionRequestMessage); MyActionRequestMessage *netMyAction = packet->GetMsg()->mutable_myactionrequestmessage(); @@ -1558,6 +1562,14 @@ ClientThread::UpdateStatData(const ServerStats &stats) GetCallback().SignalNetClientStatsUpdate(m_curStats); } +void +ClientThread::EndPing() +{ + boost::mutex::scoped_lock lock(m_pingDataMutex); + m_pingData.EndPing(); + GetCallback().SignalNetClientPingUpdate(m_pingData.MinPing(), m_pingData.AveragePing(), m_pingData.MaxPing()); +} + ServerStats ClientThread::GetStatData() const { diff --git a/src/serverdata.h b/src/serverdata.h index cb41dfe2..42dd1218 100644 --- a/src/serverdata.h +++ b/src/serverdata.h @@ -35,7 +35,6 @@ #include - struct ServerInfo { ServerInfo() : id(0), supportsSctp(false), port(0) {} unsigned id; @@ -49,5 +48,18 @@ struct ServerInfo { std::string avatarServerAddr; }; +struct ServerStats { + ServerStats() + : numberOfPlayersOnServer(0), numberOfGamesOpen(0), totalPlayersEverLoggedIn(0), + totalGamesEverCreated(0), maxGamesOpen(0), maxPlayersLoggedIn(0) {} + unsigned numberOfPlayersOnServer; + unsigned numberOfGamesOpen; + unsigned totalPlayersEverLoggedIn; + unsigned totalGamesEverCreated; + unsigned maxGamesOpen; + unsigned maxPlayersLoggedIn; +}; + + #endif