From 3971424207e27a662d4416eedfb68e18ff287350 Mon Sep 17 00:00:00 2001 From: Niklas Haas Date: Mon, 8 Nov 2021 14:47:32 +0100 Subject: [PATCH] Initialize global mutex in a thread-safe manner 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 | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/glslang/OSDependent/Unix/ossource.cpp b/glslang/OSDependent/Unix/ossource.cpp index 3f029f023..81da99c2c 100644 --- a/glslang/OSDependent/Unix/ossource.cpp +++ b/glslang/OSDependent/Unix/ossource.cpp @@ -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);