Browse Source

Merge branch 'main' into 12.0-development

Sasha Szpakowski 2 years ago
parent
commit
2b01179b35
2 changed files with 19 additions and 1 deletions
  1. 7 0
      src/modules/love/boot.lua
  2. 12 1
      src/modules/thread/sdl/Thread.cpp

+ 7 - 0
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()

+ 12 - 1
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;
 }