gallium/radeon: Use call_once() when initailizing LLVM targets
authorTom Stellard <thomas.stellard@amd.com>
Wed, 30 Sep 2015 15:00:39 +0000 (15:00 +0000)
committerTom Stellard <thomas.stellard@amd.com>
Fri, 2 Oct 2015 23:19:01 +0000 (23:19 +0000)
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Reviewed-by: Mathias Fröhlich <Mathias.Froehlich@web.de>
Reviewed-by: Emil Velikov <emil.l.velikov@gmail.com>
CC: "10.6 11.0" <mesa-stable@lists.freedesktop.org>
src/gallium/drivers/radeon/radeon_llvm_emit.c

index 3acbd02643e5a4324ed0ba62b39c67a4a190cc70..ff30a14b0af3078784c4fbaded2a6e14848a5e1a 100644 (file)
@@ -25,6 +25,7 @@
  */
 #include "radeon_llvm_emit.h"
 #include "radeon_elf_util.h"
+#include "c11/threads.h"
 #include "util/u_memory.h"
 #include "pipe/p_shader_tokens.h"
 
@@ -86,30 +87,28 @@ void radeon_llvm_shader_type(LLVMValueRef F, unsigned type)
 
 static void init_r600_target()
 {
-       static unsigned initialized = 0;
-       if (!initialized) {
 #if HAVE_LLVM < 0x0307
-               LLVMInitializeR600TargetInfo();
-               LLVMInitializeR600Target();
-               LLVMInitializeR600TargetMC();
-               LLVMInitializeR600AsmPrinter();
+       LLVMInitializeR600TargetInfo();
+       LLVMInitializeR600Target();
+       LLVMInitializeR600TargetMC();
+       LLVMInitializeR600AsmPrinter();
 #else
-               LLVMInitializeAMDGPUTargetInfo();
-               LLVMInitializeAMDGPUTarget();
-               LLVMInitializeAMDGPUTargetMC();
-               LLVMInitializeAMDGPUAsmPrinter();
+       LLVMInitializeAMDGPUTargetInfo();
+       LLVMInitializeAMDGPUTarget();
+       LLVMInitializeAMDGPUTargetMC();
+       LLVMInitializeAMDGPUAsmPrinter();
 
 #endif
-               initialized = 1;
-       }
 }
 
+static once_flag init_r600_target_once_flag = ONCE_FLAG_INIT;
+
 LLVMTargetRef radeon_llvm_get_r600_target(const char *triple)
 {
        LLVMTargetRef target = NULL;
        char *err_message = NULL;
 
-       init_r600_target();
+       call_once(&init_r600_target_once_flag, init_r600_target);
 
        if (LLVMGetTargetFromTriple(triple, &target, &err_message)) {
                fprintf(stderr, "Cannot find target for triple %s ", triple);