1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-07-02 16:38:41 +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

64
src/threading/lambda.h Normal file
View file

@ -0,0 +1,64 @@
// Minetest
// SPDX-License-Identifier: LGPL-2.1-or-later
#pragma once
#include <exception>
#include <functional>
#include <memory>
#include "debug.h"
#include "threading/thread.h"
/**
* Class returned by `runInThread`.
*
* Provides the usual thread methods along with `rethrow()`.
*/
class LambdaThread : public Thread
{
friend std::unique_ptr<LambdaThread> runInThread(
const std::function<void()> &, const std::string &);
public:
/// Re-throw a caught exception, if any. Can only be called after thread exit.
void rethrow()
{
sanity_check(!isRunning());
if (m_exptr)
std::rethrow_exception(m_exptr);
}
private:
// hide methods
LambdaThread(const std::string &name="") : Thread(name) {}
using Thread::start;
std::function<void()> m_fn;
std::exception_ptr m_exptr;
void *run()
{
try {
m_fn();
} catch(...) {
m_exptr = std::current_exception();
}
return nullptr;
};
};
/**
* Run a lambda in a separate thread.
*
* Exceptions will be caught.
* @param fn function to run
* @param thread_name name for thread
* @return thread object of type `LambdaThread`
*/
std::unique_ptr<LambdaThread> runInThread(const std::function<void()> &fn,
const std::string &thread_name = "")
{
std::unique_ptr<LambdaThread> t(new LambdaThread(thread_name));
t->m_fn = fn;
t->start();
return t;
}

View file

@ -59,6 +59,7 @@ public:
Thread(const std::string &name="");
virtual ~Thread();
DISABLE_CLASS_COPY(Thread)
// Note: class cannot be moved since other references exist
/*
* Begins execution of a new thread at the pure virtual method Thread::run().