[vlc-devel] [PATCH 4/4] threads: remove uneeded vlc_cond_value()

Rémi Denis-Courmont remi at remlab.net
Mon Feb 10 11:47:14 CET 2020


Hi,

They're not specific to cond_init. The assertions should be in global context IMO (nit). Otherwise LGTM

Le 10 février 2020 11:02:22 GMT+02:00, Steve Lhomme <robux4 at ycbcr.xyz> a écrit :
>We can use the atomic variable directly without any cast.
>
>Only the C++ user need to be checked for the proper storage
>size/alignment of the variable they pass.
>---
> src/misc/threads.c | 35 ++++++++++++++---------------------
> 1 file changed, 14 insertions(+), 21 deletions(-)
>
>diff --git a/src/misc/threads.c b/src/misc/threads.c
>index 304ae972199..92d226cfb72 100644
>--- a/src/misc/threads.c
>+++ b/src/misc/threads.c
>@@ -208,20 +208,15 @@ void (vlc_tick_sleep)(vlc_tick_t delay)
> #ifdef LIBVLC_NEED_CONDVAR
> #include <stdalign.h>
> 
>-static inline atomic_uint *vlc_cond_value(vlc_cond_t *cond)
>+void vlc_cond_init(vlc_cond_t *cond)
> {
>/* Don't use C++ atomic types in vlc_threads.h for the C atomic storage
>*/
>+    /* Initial value is irrelevant but set it for happy debuggers */
>     static_assert (sizeof (cond->cpp_value) <= sizeof (cond->value),
>                    "Size mismatch!");
>static_assert ((alignof (cond->cpp_value) % alignof (cond->value)) ==
>0,
>                    "Alignment mismatch");
>-    return &cond->value;
>-}
>-
>-void vlc_cond_init(vlc_cond_t *cond)
>-{
>-    /* Initial value is irrelevant but set it for happy debuggers */
>-    atomic_init(vlc_cond_value(cond), 0);
>+    atomic_init(&cond->value, 0);
> }
> 
> void vlc_cond_init_daytime(vlc_cond_t *cond)
>@@ -232,7 +227,7 @@ void vlc_cond_init_daytime(vlc_cond_t *cond)
> void vlc_cond_destroy(vlc_cond_t *cond)
> {
>     /* Tempting sanity check but actually incorrect:
>-    assert((atomic_load_explicit(vlc_cond_value(cond),
>+    assert((atomic_load_explicit(&cond->value,
>                                  memory_order_relaxed) & 1) == 0);
> * Due to timeouts and spurious wake-ups, the futex value can look like
>      * there are waiters, even though there are none. */
>@@ -250,53 +245,51 @@ void vlc_cond_signal(vlc_cond_t *cond)
>  * - cnd_signal() sets the futex to the equal-or-next odd value, while
>      * - cnd_wait() sets the futex to the equal-or-next even value.
>      **/
>-    atomic_fetch_or_explicit(vlc_cond_value(cond), 1,
>memory_order_relaxed);
>+    atomic_fetch_or_explicit(&cond->value, 1, memory_order_relaxed);
>     vlc_atomic_notify_one(&cond->value);
> }
> 
> void vlc_cond_broadcast(vlc_cond_t *cond)
> {
>-    atomic_fetch_or_explicit(vlc_cond_value(cond), 1,
>memory_order_relaxed);
>+    atomic_fetch_or_explicit(&cond->value, 1, memory_order_relaxed);
>     vlc_atomic_notify_all(&cond->value);
> }
> 
> void vlc_cond_wait(vlc_cond_t *cond, vlc_mutex_t *mutex)
> {
>-    unsigned value = atomic_load_explicit(vlc_cond_value(cond),
>-                                     memory_order_relaxed);
>+    unsigned value = atomic_load_explicit(&cond->value,
>memory_order_relaxed);
>     while (value & 1)
>     {
>-        if
>(atomic_compare_exchange_weak_explicit(vlc_cond_value(cond), &value,
>+        if (atomic_compare_exchange_weak_explicit(&cond->value,
>&value,
>                                                   value + 1,
>                                                  memory_order_relaxed,
>                                                 memory_order_relaxed))
>             value++;
>     }
> 
>-    vlc_cancel_addr_prepare(vlc_cond_value(cond));
>+    vlc_cancel_addr_prepare(&cond->value);
>     vlc_mutex_unlock(mutex);
> 
>     vlc_atomic_wait(&cond->value, value);
> 
>     vlc_mutex_lock(mutex);
>-    vlc_cancel_addr_finish(vlc_cond_value(cond));
>+    vlc_cancel_addr_finish(&cond->value);
> }
> 
> static int vlc_cond_wait_delay(vlc_cond_t *cond, vlc_mutex_t *mutex,
>                                vlc_tick_t delay)
> {
>-    unsigned value = atomic_load_explicit(vlc_cond_value(cond),
>-                                          memory_order_relaxed);
>+    unsigned value = atomic_load_explicit(&cond->value,
>memory_order_relaxed);
>     while (value & 1)
>     {
>-        if
>(atomic_compare_exchange_weak_explicit(vlc_cond_value(cond), &value,
>+        if (atomic_compare_exchange_weak_explicit(&cond->value,
>&value,
>                                                   value + 1,
>                                                  memory_order_relaxed,
>                                                 memory_order_relaxed))
>             value++;
>     }
> 
>-    vlc_cancel_addr_prepare(vlc_cond_value(cond));
>+    vlc_cancel_addr_prepare(&cond->value);
>     vlc_mutex_unlock(mutex);
> 
>     if (delay > 0)
>@@ -305,7 +298,7 @@ static int vlc_cond_wait_delay(vlc_cond_t *cond,
>vlc_mutex_t *mutex,
>         value = 0;
> 
>     vlc_mutex_lock(mutex);
>-    vlc_cancel_addr_finish(vlc_cond_value(cond));
>+    vlc_cancel_addr_finish(&cond->value);
> 
>     return value ? 0 : ETIMEDOUT;
> }
>-- 
>2.17.1
>
>_______________________________________________
>vlc-devel mailing list
>To unsubscribe or modify your subscription options:
>https://mailman.videolan.org/listinfo/vlc-devel

-- 
Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez excuser ma brièveté.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20200210/f3c7f2ed/attachment-0001.html>


More information about the vlc-devel mailing list