mirror of
https://github.com/ddnet/ddnet.git
synced 2024-11-10 18:18:18 +00:00
wait for score-threads on shutdown
This commit is contained in:
parent
13688bbb2a
commit
cd41220a44
|
@ -176,7 +176,9 @@ public:
|
||||||
virtual void OnInit() = 0;
|
virtual void OnInit() = 0;
|
||||||
virtual void OnConsoleInit() = 0;
|
virtual void OnConsoleInit() = 0;
|
||||||
virtual void OnMapChange(char *pNewMapName, int MapNameSize) = 0;
|
virtual void OnMapChange(char *pNewMapName, int MapNameSize) = 0;
|
||||||
virtual void OnShutdown() = 0;
|
|
||||||
|
// FullShutdown is true if the program is about to exit (not if the map is changed)
|
||||||
|
virtual void OnShutdown(bool FullShutdown = false) = 0;
|
||||||
|
|
||||||
virtual void OnTick() = 0;
|
virtual void OnTick() = 0;
|
||||||
virtual void OnPreSnap() = 0;
|
virtual void OnPreSnap() = 0;
|
||||||
|
|
|
@ -1828,7 +1828,7 @@ int CServer::Run()
|
||||||
m_Fifo.Shutdown();
|
m_Fifo.Shutdown();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
GameServer()->OnShutdown();
|
GameServer()->OnShutdown(true);
|
||||||
m_pMap->Unload();
|
m_pMap->Unload();
|
||||||
|
|
||||||
if(m_pCurrentMapData)
|
if(m_pCurrentMapData)
|
||||||
|
|
|
@ -2705,8 +2705,11 @@ void CGameContext::OnMapChange(char *pNewMapName, int MapNameSize)
|
||||||
str_copy(m_aDeleteTempfile, aTemp, sizeof(m_aDeleteTempfile));
|
str_copy(m_aDeleteTempfile, aTemp, sizeof(m_aDeleteTempfile));
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGameContext::OnShutdown()
|
void CGameContext::OnShutdown(bool FullShutdown)
|
||||||
{
|
{
|
||||||
|
if (FullShutdown)
|
||||||
|
Score()->OnShutdown();
|
||||||
|
|
||||||
DeleteTempfile();
|
DeleteTempfile();
|
||||||
Console()->ResetServerGameSettings();
|
Console()->ResetServerGameSettings();
|
||||||
Layers()->Dest();
|
Layers()->Dest();
|
||||||
|
|
|
@ -197,7 +197,7 @@ public:
|
||||||
virtual void OnInit();
|
virtual void OnInit();
|
||||||
virtual void OnConsoleInit();
|
virtual void OnConsoleInit();
|
||||||
virtual void OnMapChange(char *pNewMapName, int MapNameSize);
|
virtual void OnMapChange(char *pNewMapName, int MapNameSize);
|
||||||
virtual void OnShutdown();
|
virtual void OnShutdown(bool FullShutdown = false);
|
||||||
|
|
||||||
virtual void OnTick();
|
virtual void OnTick();
|
||||||
virtual void OnPreSnap();
|
virtual void OnPreSnap();
|
||||||
|
|
|
@ -65,6 +65,9 @@ public:
|
||||||
|
|
||||||
virtual void SaveTeam(int Team, const char* Code, int ClientID, const char* Server) = 0;
|
virtual void SaveTeam(int Team, const char* Code, int ClientID, const char* Server) = 0;
|
||||||
virtual void LoadTeam(const char* Code, int ClientID) = 0;
|
virtual void LoadTeam(const char* Code, int ClientID) = 0;
|
||||||
|
|
||||||
|
// called when the server is shut down but not on mapchange/reload
|
||||||
|
virtual void OnShutdown() = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -351,3 +351,8 @@ void CFileScore::LoadTeam(const char* Code, int ClientID)
|
||||||
str_format(aBuf, sizeof(aBuf), "Save-function not supported in file based servers");
|
str_format(aBuf, sizeof(aBuf), "Save-function not supported in file based servers");
|
||||||
GameServer()->SendChatTarget(ClientID, aBuf);
|
GameServer()->SendChatTarget(ClientID, aBuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CFileScore::OnShutdown()
|
||||||
|
{
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
|
@ -84,6 +84,8 @@ public:
|
||||||
virtual void RandomUnfinishedMap(int ClientID, int stars);
|
virtual void RandomUnfinishedMap(int ClientID, int stars);
|
||||||
virtual void SaveTeam(int Team, const char* Code, int ClientID, const char* Server);
|
virtual void SaveTeam(int Team, const char* Code, int ClientID, const char* Server);
|
||||||
virtual void LoadTeam(const char* Code, int ClientID);
|
virtual void LoadTeam(const char* Code, int ClientID);
|
||||||
|
|
||||||
|
virtual void OnShutdown();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -23,6 +23,8 @@ const char* CSqlData::ms_pMap = 0;
|
||||||
bool CSqlData::ms_GameContextAvailable = false;
|
bool CSqlData::ms_GameContextAvailable = false;
|
||||||
int CSqlData::ms_Instance = 0;
|
int CSqlData::ms_Instance = 0;
|
||||||
|
|
||||||
|
int CSqlExecData::ms_InstanceCount = 0;
|
||||||
|
|
||||||
CSqlScore::CSqlScore(CGameContext *pGameServer) :
|
CSqlScore::CSqlScore(CGameContext *pGameServer) :
|
||||||
m_pGameServer(pGameServer),
|
m_pGameServer(pGameServer),
|
||||||
m_pServer(pGameServer->Server())
|
m_pServer(pGameServer->Server())
|
||||||
|
@ -36,7 +38,7 @@ m_pServer(pGameServer->Server())
|
||||||
CSqlData::ms_pMap = m_aMap;
|
CSqlData::ms_pMap = m_aMap;
|
||||||
|
|
||||||
CSqlData::ms_GameContextAvailable = true;
|
CSqlData::ms_GameContextAvailable = true;
|
||||||
CSqlData::ms_Instance++;
|
++CSqlData::ms_Instance;
|
||||||
|
|
||||||
CSqlConnector::ResetReachable();
|
CSqlConnector::ResetReachable();
|
||||||
|
|
||||||
|
@ -50,6 +52,24 @@ CSqlScore::~CSqlScore()
|
||||||
CSqlData::ms_GameContextAvailable = false;
|
CSqlData::ms_GameContextAvailable = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CSqlScore::OnShutdown()
|
||||||
|
{
|
||||||
|
CSqlData::ms_GameContextAvailable = false;
|
||||||
|
int i = 0;
|
||||||
|
while (CSqlExecData::ms_InstanceCount != 0)
|
||||||
|
{
|
||||||
|
// print a log about every two seconds
|
||||||
|
if (i % 20 == 0)
|
||||||
|
{
|
||||||
|
char aBuf[128];
|
||||||
|
str_format(aBuf, sizeof(aBuf), "Waiting for score-threads to complete (%d left)", CSqlExecData::ms_InstanceCount);
|
||||||
|
dbg_msg("sql", aBuf);
|
||||||
|
}
|
||||||
|
++i;
|
||||||
|
thread_sleep(100);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void CSqlScore::ExecSqlFunc(void *pUser)
|
void CSqlScore::ExecSqlFunc(void *pUser)
|
||||||
{
|
{
|
||||||
CSqlExecData* pData = (CSqlExecData *)pUser;
|
CSqlExecData* pData = (CSqlExecData *)pUser;
|
||||||
|
|
|
@ -61,10 +61,20 @@ struct CSqlExecData
|
||||||
m_pFuncPtr(pFuncPtr),
|
m_pFuncPtr(pFuncPtr),
|
||||||
m_pSqlData(pSqlData),
|
m_pSqlData(pSqlData),
|
||||||
m_ReadOnly(ReadOnly)
|
m_ReadOnly(ReadOnly)
|
||||||
{}
|
{
|
||||||
|
++ms_InstanceCount;
|
||||||
|
}
|
||||||
|
~CSqlExecData()
|
||||||
|
{
|
||||||
|
--ms_InstanceCount;
|
||||||
|
}
|
||||||
|
|
||||||
bool (*m_pFuncPtr) (CSqlServer*, CSqlData *, bool);
|
bool (*m_pFuncPtr) (CSqlServer*, CSqlData *, bool);
|
||||||
CSqlData *m_pSqlData;
|
CSqlData *m_pSqlData;
|
||||||
bool m_ReadOnly;
|
bool m_ReadOnly;
|
||||||
|
|
||||||
|
// keeps track of score-threads
|
||||||
|
static int ms_InstanceCount;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct CSqlPlayerData : CSqlData
|
struct CSqlPlayerData : CSqlData
|
||||||
|
@ -190,6 +200,8 @@ public:
|
||||||
virtual void RandomUnfinishedMap(int ClientID, int stars);
|
virtual void RandomUnfinishedMap(int ClientID, int stars);
|
||||||
virtual void SaveTeam(int Team, const char* Code, int ClientID, const char* Server);
|
virtual void SaveTeam(int Team, const char* Code, int ClientID, const char* Server);
|
||||||
virtual void LoadTeam(const char* Code, int ClientID);
|
virtual void LoadTeam(const char* Code, int ClientID);
|
||||||
|
|
||||||
|
virtual void OnShutdown();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue