Fix: on startup, NewGRF scan could case race-condition (#9382)

Creating a thread was not thread-safe. The irony.

The video-driver has a function GameLoopPause() which first checks
if the thread is the game-thread or not. For this it needs access
to this->game_thread. This variable is set in StartNewThread().

However, due to timing, it is well possible GameLoopPause() is
called from the thread well before this->game_thread is assigned.

And so we have a race-condition!

Simply solve this by preventing a thread to start till we are
done with our bookkeeping.
pull/332/head
Patric Stout 3 years ago committed by GitHub
parent c12a152ec9
commit b45c006ab9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -14,6 +14,7 @@
#include "crashlog.h"
#include <system_error>
#include <thread>
#include <mutex>
/**
* Sleep on the current thread for a defined time.
@ -46,7 +47,17 @@ inline bool StartNewThread(std::thread *thr, const char *name, TFn&& _Fx, TArgs&
{
#ifndef NO_THREADS
try {
static std::mutex thread_startup_mutex;
std::lock_guard<std::mutex> lock(thread_startup_mutex);
std::thread t([] (const char *name, TFn&& F, TArgs&&... A) {
/* Delay starting the thread till the main thread is finished
* with the administration. This prevent race-conditions on
* startup. */
{
std::lock_guard<std::mutex> lock(thread_startup_mutex);
}
SetCurrentThreadName(name);
CrashLog::InitThread();
try {

Loading…
Cancel
Save