Index: src/runtime/threading.m ================================================================== --- src/runtime/threading.m +++ src/runtime/threading.m @@ -23,11 +23,10 @@ #import "ObjFW_RT.h" #import "private.h" #import "threading.h" static of_rmutex_t global_mutex; -static of_once_t once_control = OF_ONCE_INIT; static void init(void) { if (!of_rmutex_new(&global_mutex)) @@ -35,10 +34,11 @@ } void objc_global_mutex_lock(void) { + static of_once_t once_control = OF_ONCE_INIT; of_once(&once_control, init); if (!of_rmutex_lock(&global_mutex)) OBJC_ERROR("Failed to lock global mutex!"); } Index: src/socket.m ================================================================== --- src/socket.m +++ src/socket.m @@ -37,14 +37,13 @@ # include <3ds/types.h> # include <3ds/services/soc.h> #endif #ifdef OF_HAVE_THREADS -static of_once_t onceControl = OF_ONCE_INIT; static of_mutex_t mutex; #endif -static bool initialized = false; +static bool initSuccessful = false; static void init(void) { #if defined(OF_WINDOWS) @@ -75,24 +74,28 @@ if (!of_spinlock_new(&spinlock)) return; # endif #endif - initialized = true; + initSuccessful = true; } bool of_socket_init() { #ifdef OF_HAVE_THREADS + static of_once_t onceControl = OF_ONCE_INIT; of_once(&onceControl, init); #else - if (!initialized) + static bool initialized = false; + if (!initialized) { init(); + initialized = true; + } #endif - return initialized; + return initSuccessful; } int of_socket_errno() {