gallium/osmesa: Fix a race in creating the stmgr.
authorEric Anholt <eric@anholt.net>
Wed, 3 Jul 2019 18:28:49 +0000 (11:28 -0700)
committerEric Anholt <eric@anholt.net>
Wed, 4 Sep 2019 23:43:36 +0000 (16:43 -0700)
Noticed while looking at other OSMesa bugs.

Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
src/gallium/state_trackers/osmesa/osmesa.c

index 41ff9216fc69a7b5a142745344e9f146d32b5a8e..8854987496609cdb9b1aa71085aa62cfc0ec347a 100644 (file)
@@ -50,6 +50,7 @@
 
 
 #include <stdio.h>
+#include <c11/threads.h>
 #include "GL/osmesa.h"
 
 #include "glapi/glapi.h"  /* for OSMesaGetProcAddress below */
@@ -149,6 +150,18 @@ get_st_api(void)
    return stapi;
 }
 
+static struct st_manager *stmgr = NULL;
+
+static void
+create_st_manager(void)
+{
+   stmgr = CALLOC_STRUCT(st_manager);
+   if (stmgr) {
+      stmgr->screen = osmesa_create_screen();
+      stmgr->get_param = osmesa_st_get_param;
+      stmgr->get_egl_image = NULL;
+   }
+}
 
 /**
  * Create/return a singleton st_manager object.
@@ -156,15 +169,10 @@ get_st_api(void)
 static struct st_manager *
 get_st_manager(void)
 {
-   static struct st_manager *stmgr = NULL;
-   if (!stmgr) {
-      stmgr = CALLOC_STRUCT(st_manager);
-      if (stmgr) {
-         stmgr->screen = osmesa_create_screen();
-         stmgr->get_param = osmesa_st_get_param;
-         stmgr->get_egl_image = NULL;
-      }         
-   }
+   static once_flag create_once_flag = ONCE_FLAG_INIT;
+
+   call_once(&create_once_flag, create_st_manager);
+
    return stmgr;
 }