From 171c3c551a5aea02871d322493361d66c4d9815d Mon Sep 17 00:00:00 2001 From: Yonggang Luo Date: Sat, 24 Sep 2022 15:28:52 +0800 Subject: [PATCH] util: Fixes debug_get_option_* thread safety by set initialized=true after the value get MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Yonggang Luo Acked-by: Marek Olšák Part-of: --- src/util/u_debug.h | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/util/u_debug.h b/src/util/u_debug.h index 43b2a41e19d19..a2afd86643940 100644 --- a/src/util/u_debug.h +++ b/src/util/u_debug.h @@ -46,6 +46,7 @@ #endif #include "util/os_misc.h" +#include "util/u_atomic.h" #include "util/detect_os.h" #include "util/macros.h" @@ -374,9 +375,9 @@ debug_get_option_ ## suffix (void) \ { \ static bool initialized = false; \ static const char * value; \ - if (!initialized) { \ - initialized = true; \ + if (unlikely(!p_atomic_read_relaxed(&initialized))) { \ value = debug_get_option(name, dfault); \ + p_atomic_set(&initialized, true); \ } \ return value; \ } @@ -397,9 +398,9 @@ debug_get_option_ ## sufix (void) \ { \ static bool initialized = false; \ static bool value; \ - if (!initialized) { \ - initialized = true; \ + if (unlikely(!p_atomic_read_relaxed(&initialized))) { \ value = debug_get_bool_option(name, dfault); \ + p_atomic_set(&initialized, true); \ } \ return value; \ } @@ -410,9 +411,9 @@ debug_get_option_ ## sufix (void) \ { \ static bool initialized = false; \ static long value; \ - if (!initialized) { \ - initialized = true; \ + if (unlikely(!p_atomic_read_relaxed(&initialized))) { \ value = debug_get_num_option(name, dfault); \ + p_atomic_set(&initialized, true); \ } \ return value; \ } @@ -423,9 +424,9 @@ debug_get_option_ ## sufix (void) \ { \ static bool initialized = false; \ static unsigned long value; \ - if (!initialized) { \ - initialized = true; \ + if (unlikely(!p_atomic_read_relaxed(&initialized))) { \ value = debug_get_flags_option(name, flags, dfault); \ + p_atomic_set(&initialized, true); \ } \ return value; \ }