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:
parent
b2982a6f14
commit
fd8e02195e
4 changed files with 113 additions and 10 deletions
|
@ -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()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue