[vlc-devel] [PATCH 5/5] threads: store the condition variable value as an atomic_int
Steve Lhomme
robux4 at ycbcr.xyz
Mon Feb 10 09:39:12 CET 2020
On 2020-02-07 16:39, Rémi Denis-Courmont wrote:
> Hi,
>
> I intended to do something like that, yes. But the static inline is no
> longer useful then.
That could be the next path, using the value directly, without needing
the static assert.
> Le 7 février 2020 17:02:10 GMT+02:00, Steve Lhomme <robux4 at ycbcr.xyz> a
> écrit :
>
> We can include stdatomic.h in the headers, we do it in many places. But we
> can't use it with C++ because the std:atomic_int storage is likely different
> and can be initialized/released the same way.
>
> We change the static assert in the core to make sure the type in the union that
> will be used for storage by C++ modules is correct.
> ------------------------------------------------------------------------
> include/vlc_threads.h | 12 +++++++++++-
> src/misc/threads.c | 8 ++++----
> 2 files changed, 15 insertions(+), 5 deletions(-)
>
> diff --git a/include/vlc_threads.h b/include/vlc_threads.h
> index a5425236b1c..075083d1005 100644
> --- a/include/vlc_threads.h
> +++ b/include/vlc_threads.h
> @@ -351,9 +351,19 @@ typedef struct vlc_timer *vlc_timer_t;
> #endif
>
> #ifdef LIBVLC_NEED_CONDVAR
> +#ifndef __cplusplus
> +#include <stdatomic.h>
> +#endif
> +
> +
> typedef struct
> {
> - unsigned value;
> + union {
> +#ifndef __cplusplus
> + atomic_int value;
> +#endif
> + int cpp_value;
> + };
> } vlc_cond_t;
> # define VLC_STATIC_COND { 0 }
> #endif
> diff --git a/src/misc/threads.c b/src/misc/threads.c
> index 7699cfae05d..47bf1dfcb14 100644
> --- a/src/misc/threads.c
> +++ b/src/misc/threads.c
> @@ -210,12 +210,12 @@ void (vlc_tick_sleep)(vlc_tick_t delay)
>
> static inline atomic_int *vlc_cond_value(vlc_cond_t *cond)
> {
> - /* XXX: ugly but avoids including stdatomic.h in vlc_threads.h */
> - static_assert (sizeof (cond->value) <= sizeof (atomic_int),
> + /* Don't use C++ atomic types in vlc_threads.h for the C atomic storage */
> + static_assert (sizeof (cond->cpp_value) <= sizeof (cond->value),
> "Size mismatch!");
> - static_assert ((alignof (cond->value) % alignof (atomic_int)) == 0,
> + static_assert ((alignof (cond->cpp_value) % alignof (cond->value)) == 0,
> "Alignment mismatch");
> - return (atomic_int *)&cond->value;
> + return &cond->value;
> }
>
> void vlc_cond_init(vlc_cond_t *cond)
>
>
> --
> Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez excuser
> ma brièveté.
>
> _______________________________________________
> 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