]> git.sesse.net Git - ffmpeg/commitdiff
avutil/cpu: Fix race condition in av_cpu_count()
authorAndreas Rheinhardt <andreas.rheinhardt@gmail.com>
Wed, 2 Dec 2020 22:57:16 +0000 (23:57 +0100)
committerAndreas Rheinhardt <andreas.rheinhardt@outlook.com>
Fri, 2 Apr 2021 17:12:43 +0000 (19:12 +0200)
av_cpu_count() intends to emit a debug message containing the number of
logical cores when called the first time. The check currently works with
a static volatile int; yet this does not help at all in case of
concurrent accesses by multiple threads. So replace this with an
atomic_int.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
libavutil/cpu.c

index 52f6b9a3bf62674528bb9c75dda0cbd60058f0be..8e3576a1f305ee72fa211793b5cb7a0b305abbc9 100644 (file)
@@ -274,7 +274,7 @@ int av_parse_cpu_caps(unsigned *flags, const char *s)
 
 int av_cpu_count(void)
 {
-    static volatile int printed;
+    static atomic_int printed = ATOMIC_VAR_INIT(0);
 
     int nb_cpus = 1;
 #if HAVE_WINRT
@@ -306,10 +306,8 @@ int av_cpu_count(void)
     nb_cpus = sysinfo.dwNumberOfProcessors;
 #endif
 
-    if (!printed) {
+    if (!atomic_exchange_explicit(&printed, 1, memory_order_relaxed))
         av_log(NULL, AV_LOG_DEBUG, "detected %d logical cores\n", nb_cpus);
-        printed = 1;
-    }
 
     return nb_cpus;
 }