1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-06-27 16:36:03 +00:00

Fix local server startup and shutdown blocking the main thread

Co-authored-by: sfan5 <sfan5@live.de>
This commit is contained in:
Gregor Parzefall 2024-04-02 14:57:25 +02:00 committed by sfan5
parent b2982a6f14
commit fd8e02195e
4 changed files with 113 additions and 10 deletions

View file

@ -66,6 +66,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "settings.h"
#include "shader.h"
#include "sky.h"
#include "threading/lambda.h"
#include "translation.h"
#include "util/basic_macros.h"
#include "util/directiontables.h"
@ -1014,12 +1015,6 @@ Game::Game() :
Game::~Game()
{
delete client;
delete soundmaker;
sound_manager.reset();
delete server; // deleted first to stop all server threads
delete hud;
delete camera;
delete quicktune;
@ -1268,6 +1263,28 @@ void Game::shutdown()
sleep_ms(100);
}
}
delete client;
delete soundmaker;
sound_manager.reset();
auto stop_thread = runInThread([=] {
delete server;
}, "ServerStop");
FpsControl fps_control;
fps_control.reset();
while (stop_thread->isRunning()) {
m_rendering_engine->run();
f32 dtime;
fps_control.limit(device, &dtime);
showOverlayMessage(N_("Shutting down..."), dtime, 0, false);
}
stop_thread->rethrow();
// to be continued in Game::~Game
}
@ -1373,11 +1390,33 @@ bool Game::createSingleplayerServer(const std::string &map_dir,
server = new Server(map_dir, gamespec, simple_singleplayer_mode, bind_addr,
false, nullptr, error_message);
server->start();
copyServerClientCache();
auto start_thread = runInThread([=] {
server->start();
copyServerClientCache();
}, "ServerStart");
return true;
input->clear();
bool success = true;
FpsControl fps_control;
fps_control.reset();
while (start_thread->isRunning()) {
if (!m_rendering_engine->run() || input->cancelPressed())
success = false;
f32 dtime;
fps_control.limit(device, &dtime);
if (success)
showOverlayMessage(N_("Creating server..."), dtime, 5);
else
showOverlayMessage(N_("Shutting down..."), dtime, 0, false);
}
start_thread->rethrow();
return success;
}
void Game::copyServerClientCache()