Browse Source

linux: fix issues if certain codepaths are hit while signal handlers are temporarily off.

Alex Szpakowski 3 years ago
parent
commit
b3b1317f61
3 changed files with 25 additions and 24 deletions
  1. 18 20
      src/modules/audio/openal/Audio.cpp
  2. 1 4
      src/modules/thread/sdl/Thread.cpp
  3. 6 0
      src/modules/thread/threads.h

+ 18 - 20
src/modules/audio/openal/Audio.cpp

@@ -100,11 +100,6 @@ Audio::Audio()
 	, poolThread(nullptr)
 	, distanceModel(DISTANCE_INVERSE_CLAMPED)
 {
-#if defined(LOVE_LINUX)
-	// Temporarly block signals, as the thread inherits this mask
-	love::thread::disableSignals();
-#endif
-
 	// Before opening new device, check if recording
 	// is requested.
 	if (getRequestRecordingPermission())
@@ -114,29 +109,32 @@ Audio::Audio()
 			requestRecordingPermission();
 	}
 
-	// Passing null for default device.
-	device = alcOpenDevice(nullptr);
+	{
+#if defined(LOVE_LINUX)
+		// Temporarly block signals, as the thread inherits this mask
+		love::thread::ScopedDisableSignals disableSignals;
+#endif
 
-	if (device == nullptr)
-		throw love::Exception("Could not open device.");
+		// Passing null for default device.
+		device = alcOpenDevice(nullptr);
+
+		if (device == nullptr)
+			throw love::Exception("Could not open device.");
 
 #ifdef ALC_EXT_EFX
-	ALint attribs[4] = { ALC_MAX_AUXILIARY_SENDS, MAX_SOURCE_EFFECTS, 0, 0 };
+		ALint attribs[4] = { ALC_MAX_AUXILIARY_SENDS, MAX_SOURCE_EFFECTS, 0, 0 };
 #else
-	ALint *attribs = nullptr;
+		ALint *attribs = nullptr;
 #endif
 
-	context = alcCreateContext(device, attribs);
-
-	if (context == nullptr)
-		throw love::Exception("Could not create context.");
+		context = alcCreateContext(device, attribs);
 
-	if (!alcMakeContextCurrent(context) || alcGetError(device) != ALC_NO_ERROR)
-		throw love::Exception("Could not make context current.");
+		if (context == nullptr)
+			throw love::Exception("Could not create context.");
 
-#if defined(LOVE_LINUX)
-	love::thread::reenableSignals();
-#endif
+		if (!alcMakeContextCurrent(context) || alcGetError(device) != ALC_NO_ERROR)
+			throw love::Exception("Could not make context current.");
+	}
 
 #ifdef ALC_EXT_EFX
 	initializeEFX();

+ 1 - 4
src/modules/thread/sdl/Thread.cpp

@@ -44,7 +44,7 @@ bool Thread::start()
 {
 #if defined(LOVE_LINUX)
 	// Temporarly block signals, as the thread inherits this mask
-	love::thread::disableSignals();
+	love::thread::ScopedDisableSignals disableSignals;
 #endif
 
 	Lock l(mutex);
@@ -55,9 +55,6 @@ bool Thread::start()
 	thread = SDL_CreateThread(thread_runner, t->getThreadName(), this);
 	running = (thread != nullptr);
 
-#if defined(LOVE_LINUX)
-	love::thread::reenableSignals();
-#endif
 	return running;
 }
 

+ 6 - 0
src/modules/thread/threads.h

@@ -132,6 +132,12 @@ Thread *newThread(Threadable *t);
 #if defined(LOVE_LINUX)
 void disableSignals();
 void reenableSignals();
+
+struct ScopedDisableSignals
+{
+	ScopedDisableSignals() { disableSignals(); }
+	~ScopedDisableSignals() { reenableSignals(); }
+};
 #endif
 
 } // thread