[vlc-devel] [PATCH 4/4] cpu: remove initialization lock
Steve Lhomme
robux4 at ycbcr.xyz
Mon Mar 30 08:27:26 CEST 2020
Looks OK (apart from the unsigned / uint32_t mismatch)
On 2020-03-29 22:43, RĂ©mi Denis-Courmont wrote:
> In the unlikely event that multiple threads want to check the CPU
> flags concurrently, simply compute them as many times.
> ---
> src/misc/cpu.c | 20 +++++++++++---------
> 1 file changed, 11 insertions(+), 9 deletions(-)
>
> diff --git a/src/misc/cpu.c b/src/misc/cpu.c
> index 7f3a89a3cb..7053a391e7 100644
> --- a/src/misc/cpu.c
> +++ b/src/misc/cpu.c
> @@ -29,6 +29,8 @@
> # include "config.h"
> #endif
>
> +#include <stdatomic.h>
> +
> #include <vlc_common.h>
> #include <vlc_cpu.h>
> #include <vlc_memstream.h>
> @@ -247,18 +249,18 @@ out:
> return i_capabilities;
> }
>
> -static uint32_t cpu_flags;
> -
> -static void vlc_CPU_init(void)
> -{
> - cpu_flags = vlc_CPU_raw();
> -}
> +static atomic_uint cpu_flags = ATOMIC_VAR_INIT(-1);
>
> VLC_WEAK unsigned vlc_CPU(void)
> {
> - static vlc_once_t once = VLC_STATIC_ONCE;
> - vlc_once(&once, vlc_CPU_init);
> - return cpu_flags;
> + unsigned flags = atomic_load_explicit(&cpu_flags, memory_order_relaxed);
> +
> + if (unlikely(flags == -1U)) {
> + flags = vlc_CPU_raw();
> + atomic_store_explicit(&cpu_flags, flags, memory_order_relaxed);
> + }
> +
> + return flags;
> }
>
> void vlc_CPU_dump (vlc_object_t *obj)
> --
> 2.26.0
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
>
More information about the vlc-devel
mailing list