Skip to content

Commit cf3c602

Browse files
committed
Improve server list (+list interface) performance, and reduce background overhead
1 parent 354d61f commit cf3c602

8 files changed

+766
-184
lines changed

Client/core/ServerBrowser/CServerBrowser.MasterServerManager.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ class CMasterServerManager : public CMasterServerManagerInterface
2424
virtual void Refresh();
2525
virtual bool HasData();
2626
virtual bool ParseList(CServerListItemList& itemList);
27+
virtual void CancelRefresh();
2728

2829
// CMasterServerManager
2930
protected:
@@ -65,6 +66,7 @@ CMasterServerManager::CMasterServerManager()
6566
///////////////////////////////////////////////////////////////
6667
CMasterServerManager::~CMasterServerManager()
6768
{
69+
CancelRefresh();
6870
for (uint i = 0; i < m_MasterServerList.size(); i++)
6971
SAFE_RELEASE(m_MasterServerList[i]);
7072

@@ -152,3 +154,15 @@ bool CMasterServerManager::ParseList(CServerListItemList& itemList)
152154

153155
return uiParsedCount > 0;
154156
}
157+
158+
void CMasterServerManager::CancelRefresh()
159+
{
160+
for (uint i = 0; i < m_MasterServerList.size(); ++i)
161+
{
162+
if (m_MasterServerList[i])
163+
m_MasterServerList[i]->Cancel();
164+
}
165+
166+
m_iActiveAmount = 0;
167+
m_ElapsedTime.Reset();
168+
}

Client/core/ServerBrowser/CServerBrowser.MasterServerManager.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ class CMasterServerManagerInterface
1111
virtual void Refresh() = 0;
1212
virtual bool HasData() = 0;
1313
virtual bool ParseList(CServerListItemList& itemList) = 0;
14+
virtual void CancelRefresh() = 0;
1415
};
1516

1617
CMasterServerManagerInterface* NewMasterServerManager();

Client/core/ServerBrowser/CServerBrowser.RemoteMasterServer.cpp

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ class CRemoteMasterServer : public CRemoteMasterServerInterface
2323
virtual void Refresh();
2424
virtual bool HasData();
2525
virtual bool ParseList(CServerListItemList& itemList);
26+
virtual void Cancel();
2627

2728
// CRemoteMasterServer
2829
void Init(const SString& strURL);
@@ -42,6 +43,7 @@ class CRemoteMasterServer : public CRemoteMasterServerInterface
4243
SString m_strStage;
4344
SString m_strURL;
4445
CBuffer m_Data;
46+
bool m_bPendingDownload = false;
4547
};
4648

4749
///////////////////////////////////////////////////////////////
@@ -121,10 +123,35 @@ void CRemoteMasterServer::Refresh()
121123
// Send new request
122124
m_strStage = "waitingreply";
123125
m_llLastRefreshTime = GetTickCount64_();
124-
AddRef(); // Keep alive
125126
SHttpRequestOptions options;
126127
options.uiConnectionAttempts = 1;
127-
GetHTTP()->QueueFile(m_strURL, NULL, this, &CRemoteMasterServer::StaticDownloadFinished, options);
128+
if (GetHTTP()->QueueFile(m_strURL, NULL, this, &CRemoteMasterServer::StaticDownloadFinished, options))
129+
{
130+
m_bPendingDownload = true;
131+
AddRef(); // Keep alive
132+
}
133+
else
134+
{
135+
m_strStage = "nogood";
136+
}
137+
}
138+
139+
void CRemoteMasterServer::Cancel()
140+
{
141+
if (!m_bPendingDownload)
142+
return;
143+
144+
if (GetHTTP()->CancelDownload(this, &CRemoteMasterServer::StaticDownloadFinished))
145+
{
146+
m_bPendingDownload = false;
147+
m_strStage.clear();
148+
Release();
149+
}
150+
else
151+
{
152+
m_bPendingDownload = false;
153+
m_strStage.clear();
154+
}
128155
}
129156

130157
///////////////////////////////////////////////////////////////
@@ -150,6 +177,8 @@ void CRemoteMasterServer::StaticDownloadFinished(const SHttpDownloadResult& resu
150177
///////////////////////////////////////////////////////////////
151178
void CRemoteMasterServer::DownloadFinished(const SHttpDownloadResult& result)
152179
{
180+
m_bPendingDownload = false;
181+
153182
if (result.bSuccess)
154183
{
155184
if (m_strStage == "waitingreply")

Client/core/ServerBrowser/CServerBrowser.RemoteMasterServer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ class CRemoteMasterServerInterface : public CRefCountable
1616
virtual void Refresh() = 0;
1717
virtual bool HasData() = 0;
1818
virtual bool ParseList(CServerListItemList& itemList) = 0;
19+
virtual void Cancel() = 0;
1920
};
2021

2122
CRemoteMasterServerInterface* NewRemoteMasterServer(const SString& strURL);

0 commit comments

Comments
 (0)