mirror of
https://github.com/luanti-org/luanti.git
synced 2025-06-27 16:36:03 +00:00
Fix use of previously deallocated EmergeManager
This commit is contained in:
parent
6e352e3cbf
commit
9b978db0c2
3 changed files with 46 additions and 8 deletions
|
@ -92,6 +92,11 @@ EmergeManager::EmergeManager(IGameDef *gamedef) {
|
|||
this->biomedef = new BiomeDefManager();
|
||||
this->params = NULL;
|
||||
|
||||
// Note that accesses to this variable are not synchronized.
|
||||
// This is because the *only* thread ever starting or stopping
|
||||
// EmergeThreads should be the ServerThread.
|
||||
this->threads_active = false;
|
||||
|
||||
this->luaoverride_params = NULL;
|
||||
this->luaoverride_params_modified = 0;
|
||||
this->luaoverride_flagmask = 0;
|
||||
|
@ -128,9 +133,11 @@ EmergeManager::EmergeManager(IGameDef *gamedef) {
|
|||
|
||||
EmergeManager::~EmergeManager() {
|
||||
for (unsigned int i = 0; i != emergethread.size(); i++) {
|
||||
emergethread[i]->Stop();
|
||||
emergethread[i]->qevent.signal();
|
||||
emergethread[i]->Wait();
|
||||
if (threads_active) {
|
||||
emergethread[i]->Stop();
|
||||
emergethread[i]->qevent.signal();
|
||||
emergethread[i]->Wait();
|
||||
}
|
||||
delete emergethread[i];
|
||||
delete mapgen[i];
|
||||
}
|
||||
|
@ -252,9 +259,32 @@ Mapgen *EmergeManager::getCurrentMapgen() {
|
|||
}
|
||||
|
||||
|
||||
void EmergeManager::startAllThreads() {
|
||||
void EmergeManager::startThreads() {
|
||||
if (threads_active)
|
||||
return;
|
||||
|
||||
for (unsigned int i = 0; i != emergethread.size(); i++)
|
||||
emergethread[i]->Start();
|
||||
|
||||
threads_active = true;
|
||||
}
|
||||
|
||||
|
||||
void EmergeManager::stopThreads() {
|
||||
if (!threads_active)
|
||||
return;
|
||||
|
||||
// Request thread stop in parallel
|
||||
for (unsigned int i = 0; i != emergethread.size(); i++) {
|
||||
emergethread[i]->Stop();
|
||||
emergethread[i]->qevent.signal();
|
||||
}
|
||||
|
||||
// Then do the waiting for each
|
||||
for (unsigned int i = 0; i != emergethread.size(); i++)
|
||||
emergethread[i]->Wait();
|
||||
|
||||
threads_active = false;
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue