One sender thread per client. Requires loads of resources. Kind of hacked, because the internal dependencies are very ugly now. Requires loads of testing. A problem might be the last packet sent by the server to a specific client before closing the connection, for example an error message. It might never even reach the client, because the sender thread is terminated before. I have not yet found a good way to fix this.

This commit is contained in:
lotodore
2009-01-07 21:52:16 +00:00
parent 606158c4f0
commit d72cdb6873
16 changed files with 150 additions and 325 deletions
+5 -43
View File
@@ -39,31 +39,11 @@
using namespace std;
class ClientSenderCallback : public SenderCallback
{
public:
ClientSenderCallback(ClientThread &client) : m_client(client) {}
virtual ~ClientSenderCallback() {}
virtual void SignalNetError(SessionId /*session*/, int errorID, int osErrorID)
{
// Just signal the error.
// We assume that the client thread will be terminated.
m_client.GetCallback().SignalNetClientError(errorID, osErrorID);
}
private:
ClientThread &m_client;
};
ClientThread::ClientThread(GuiInterface &gui, AvatarManager &avatarManager)
: m_curState(NULL), m_gui(gui), m_avatarManager(avatarManager),
m_curGameId(0), m_curGameNum(1), m_guiPlayerId(0), m_sessionEstablished(false)
{
m_context.reset(new ClientContext);
m_senderCallback.reset(new ClientSenderCallback(*this));
m_sender.reset(new SenderThread(GetSenderCallback()));
m_receiver.reset(new ReceiverHelper);
myQtToolsInterface.reset(CreateQtToolsWrapper());
}
@@ -351,8 +331,6 @@ ClientThread::Main()
{
SetState(CLIENT_INITIAL_STATE::Instance());
GetSender().Run();
try
{
while (!ShouldTerminate())
@@ -388,8 +366,6 @@ ClientThread::Main()
{
GetCallback().SignalNetClientError(e.GetErrorId(), e.GetOsErrorCode());
}
GetSender().SignalTermination();
GetSender().Join(SENDER_THREAD_TERMINATE_TIMEOUT);
}
void
@@ -411,7 +387,7 @@ ClientThread::SendPacketLoop()
while (i != end)
{
GetSender().Send(GetContext().GetSessionData(), *i);
GetContext().GetSessionData()->GetSender().Send(GetContext().GetSessionData(), *i);
++i;
}
m_outPacketList.clear();
@@ -442,7 +418,7 @@ ClientThread::RequestPlayerInfo(unsigned id, bool requestAvatar)
NetPacketRetrievePlayerInfo::Data reqData;
reqData.playerId = id;
static_cast<NetPacketRetrievePlayerInfo *>(req.get())->SetData(reqData);
GetSender().Send(GetContext().GetSessionData(), req);
GetContext().GetSessionData()->GetSender().Send(GetContext().GetSessionData(), req);
m_playerInfoRequestList.push_back(id);
@@ -546,7 +522,7 @@ ClientThread::RetrieveAvatarIfNeeded(unsigned id, const PlayerInfo &info)
retrieveAvatarData.requestId = id;
retrieveAvatarData.avatar = info.avatar;
static_cast<NetPacketRetrieveAvatar *>(retrieveAvatar.get())->SetData(retrieveAvatarData);
GetSender().Send(GetContext().GetSessionData(), retrieveAvatar);
GetContext().GetSessionData()->GetSender().Send(GetContext().GetSessionData(), retrieveAvatar);
}
}
}
@@ -621,7 +597,7 @@ ClientThread::UnsubscribeLobbyMsg()
{
// Send unsubscribe request.
boost::shared_ptr<NetPacket> unsubscr(new NetPacketUnsubscribeGameList);
GetSender().Send(GetContext().GetSessionData(), unsubscr);
GetContext().GetSessionData()->GetSender().Send(GetContext().GetSessionData(), unsubscr);
GetContext().SetSubscribeLobbyMsg(false);
}
}
@@ -635,7 +611,7 @@ ClientThread::ResubscribeLobbyMsg()
ClearGameInfoMap();
// Send resubscribe request.
boost::shared_ptr<NetPacket> resubscr(new NetPacketResubscribeGameList);
GetSender().Send(GetContext().GetSessionData(), resubscr);
GetContext().GetSessionData()->GetSender().Send(GetContext().GetSessionData(), resubscr);
GetContext().SetSubscribeLobbyMsg(true);
}
}
@@ -667,13 +643,6 @@ ClientThread::SetState(ClientState &newState)
m_curState = &newState;
}
SenderThread &
ClientThread::GetSender()
{
assert(m_sender.get());
return *m_sender;
}
ReceiverHelper &
ClientThread::GetReceiver()
{
@@ -737,13 +706,6 @@ ClientThread::GetGame()
return m_game;
}
ClientSenderCallback &
ClientThread::GetSenderCallback()
{
assert(m_senderCallback.get());
return *m_senderCallback;
}
QtToolsInterface &
ClientThread::GetQtToolsInterface()
{