diff options
author | Eric Anholt <[email protected]> | 2019-07-03 11:28:49 -0700 |
---|---|---|
committer | Eric Anholt <[email protected]> | 2019-09-04 16:43:36 -0700 |
commit | 9e7eb9780aaac0737095a7ce87e8af336ea42f86 (patch) | |
tree | ff1c7ea1c3a41a90e96e885a28ae5e11766519d1 /src | |
parent | 281466332ba81a4277a1ebd379d7463586125086 (diff) |
gallium/osmesa: Fix a race in creating the stmgr.
Noticed while looking at other OSMesa bugs.
Reviewed-by: Timothy Arceri <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/state_trackers/osmesa/osmesa.c | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/src/gallium/state_trackers/osmesa/osmesa.c b/src/gallium/state_trackers/osmesa/osmesa.c index 41ff9216fc6..88549874966 100644 --- a/src/gallium/state_trackers/osmesa/osmesa.c +++ b/src/gallium/state_trackers/osmesa/osmesa.c @@ -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; } |