Initialize global mutex in a thread-safe manner
authorNiklas Haas <git@haasn.dev>
Mon, 8 Nov 2021 13:47:32 +0000 (14:47 +0100)
committerNiklas Haas <git@haasn.dev>
Mon, 8 Nov 2021 13:47:32 +0000 (14:47 +0100)
Currently, ShInitialize() and friends call glslang::InitGlobalLock()
which *overwrites* the global mutex. As such, even though it ostensibly
takes a mutex, this function is actually completely thread-unsafe.

Fix it by using pthread_once to ensure the mutex is only initialized
once, and then never again.

glslang/OSDependent/Unix/ossource.cpp

index 3f029f0..81da99c 100644 (file)
@@ -172,7 +172,7 @@ namespace {
     pthread_mutex_t gMutex;
 }
 
-void InitGlobalLock()
+static void InitMutex(void)
 {
   pthread_mutexattr_t mutexattr;
   pthread_mutexattr_init(&mutexattr);
@@ -180,6 +180,12 @@ void InitGlobalLock()
   pthread_mutex_init(&gMutex, &mutexattr);
 }
 
+void InitGlobalLock()
+{
+  static pthread_once_t once = PTHREAD_ONCE_INIT;
+  pthread_once(&once, InitMutex);
+}
+
 void GetGlobalLock()
 {
   pthread_mutex_lock(&gMutex);