diff --git a/src/modules/love/boot.lua b/src/modules/love/boot.lua index c91510471..2e1518e9f 100644 --- a/src/modules/love/boot.lua +++ b/src/modules/love/boot.lua @@ -379,6 +379,13 @@ function love.init() end end + -- The first couple event pumps on some systems (e.g. macOS) can take a + -- while. We'd rather hit that slowdown here than in event processing + -- within the first frames. + if love.event then + for i = 1, 2 do love.event.pump() end + end + -- Our first timestep, because window creation can take some time if love.timer then love.timer.step() diff --git a/src/modules/thread/sdl/Thread.cpp b/src/modules/thread/sdl/Thread.cpp index 02be5e433..aa69b9276 100644 --- a/src/modules/thread/sdl/Thread.cpp +++ b/src/modules/thread/sdl/Thread.cpp @@ -48,13 +48,24 @@ bool Thread::start() #endif Lock l(mutex); + if (running) return false; + if (thread) // Clean old handle up SDL_WaitThread(thread, nullptr); + + // Keep the threadable around until the thread is done with it. + // This is done before thread_runner executes because there can be a delay + // between CreateThread and the start of the thread code's execution. + t->retain(); + thread = SDL_CreateThread(thread_runner, t->getThreadName(), this); running = (thread != nullptr); + if (!running) + t->release(); // thread_runner is never called in this situation. + return running; } @@ -80,7 +91,6 @@ bool Thread::isRunning() int Thread::thread_runner(void *data) { Thread *self = (Thread *) data; // some compilers don't like 'this' - self->t->retain(); self->t->threadFunction(); @@ -89,6 +99,7 @@ int Thread::thread_runner(void *data) self->running = false; } + // This was retained in start(). self->t->release(); return 0; }