[vlc-devel] [[PATCH v3] 1/6] threads: turn vlc_cancel_addr_set/clear into internal functions
Rémi Denis-Courmont
remi at remlab.net
Mon Feb 10 14:43:11 CET 2020
LGTM
Le 10 février 2020 15:39:10 GMT+02:00, Steve Lhomme <robux4 at ycbcr.xyz> a écrit :
>Should only be called on Win32 and Android, the only platforms where
>LIBVLC_NEED_CONDVAR is defined.
>
>LIBVLC_NEED_SLEEP is always found when LIBVLC_NEED_CONDVAR is set, so
>no need
>to test it.
>---
> include/vlc_threads.h | 15 ++++--------
> src/android/thread.c | 56 +++++++++++++++++++------------------------
> src/win32/thread.c | 42 ++++++++++++++++----------------
> 3 files changed, 50 insertions(+), 63 deletions(-)
>
>diff --git a/include/vlc_threads.h b/include/vlc_threads.h
>index 2e85d63d6be..0025ca7ea7d 100644
>--- a/include/vlc_threads.h
>+++ b/include/vlc_threads.h
>@@ -1028,8 +1028,6 @@ enum
> {
> VLC_CLEANUP_PUSH,
> VLC_CLEANUP_POP,
>- VLC_CANCEL_ADDR_SET,
>- VLC_CANCEL_ADDR_CLEAR,
> };
>
> #if defined (LIBVLC_USE_PTHREAD_CLEANUP)
>@@ -1100,15 +1098,10 @@ static inline void vlc_cleanup_lock (void
>*lock)
> }
>#define mutex_cleanup_push( lock ) vlc_cleanup_push (vlc_cleanup_lock,
>lock)
>
>-static inline void vlc_cancel_addr_set(void *addr)
>-{
>- vlc_control_cancel(VLC_CANCEL_ADDR_SET, addr);
>-}
>-
>-static inline void vlc_cancel_addr_clear(void *addr)
>-{
>- vlc_control_cancel(VLC_CANCEL_ADDR_CLEAR, addr);
>-}
>+#if defined(LIBVLC_NEED_CONDVAR)
>+void vlc_cancel_addr_set(void *addr);
>+void vlc_cancel_addr_clear(void *addr);
>+#endif
>
> #ifdef __cplusplus
> /**
>diff --git a/src/android/thread.c b/src/android/thread.c
>index ca715418d41..c213e237ea4 100644
>--- a/src/android/thread.c
>+++ b/src/android/thread.c
>@@ -34,6 +34,7 @@
> #include <signal.h>
> #include <errno.h>
> #include <stdatomic.h>
>+#include <stdnoreturn.h>
> #include <time.h>
> #include <assert.h>
>
>@@ -328,44 +329,35 @@ void vlc_testcancel (void)
> pthread_exit(NULL);
> }
>
>-void vlc_control_cancel(int cmd, ...)
>+noreturn void vlc_control_cancel (int cmd, ...)
>+{
>+ (void) cmd;
>+ vlc_assert_unreachable ();
>+}
>+
>+void vlc_cancel_addr_set(void *addr)
> {
> vlc_thread_t th = vlc_thread_self();
>- va_list ap;
>+ if (th == NULL)
>+ return;
>
>+ vlc_mutex_lock(&th->wait.lock);
>+ assert(th->wait.addr == NULL);
>+ th->wait.addr = addr;
>+ vlc_mutex_unlock(&th->wait.lock);
>+}
>+
>+void vlc_cancel_addr_clear(void *addr)
>+{
>+ vlc_thread_t th = vlc_thread_self();
> if (th == NULL)
> return;
>
>- va_start(ap, cmd);
>- switch (cmd)
>- {
>- case VLC_CANCEL_ADDR_SET:
>- {
>- void *addr = va_arg(ap, void *);
>-
>- vlc_mutex_lock(&th->wait.lock);
>- assert(th->wait.addr == NULL);
>- th->wait.addr = addr;
>- vlc_mutex_unlock(&th->wait.lock);
>- break;
>- }
>-
>- case VLC_CANCEL_ADDR_CLEAR:
>- {
>- void *addr = va_arg(ap, void *);
>-
>- vlc_mutex_lock(&th->wait.lock);
>- assert(th->wait.addr == addr);
>- th->wait.addr = NULL;
>- (void) addr;
>- vlc_mutex_unlock(&th->wait.lock);
>- break;
>- }
>-
>- default:
>- vlc_assert_unreachable ();
>- }
>- va_end(ap);
>+ vlc_mutex_lock(&th->wait.lock);
>+ assert(th->wait.addr == addr);
>+ th->wait.addr = NULL;
>+ (void) addr;
>+ vlc_mutex_unlock(&th->wait.lock);
> }
>
> /* threadvar */
>diff --git a/src/win32/thread.c b/src/win32/thread.c
>index 6af2eb83852..23f9c0afe50 100644
>--- a/src/win32/thread.c
>+++ b/src/win32/thread.c
>@@ -666,30 +666,32 @@ void vlc_control_cancel (int cmd, ...)
> th->cleaners = th->cleaners->next;
> break;
> }
>+ }
>+ va_end (ap);
>+}
>
>- case VLC_CANCEL_ADDR_SET:
>- {
>- void *addr = va_arg(ap, void *);
>+void vlc_cancel_addr_set(void *addr)
>+{
>+ struct vlc_thread *th = vlc_thread_self();
>+ if (th == NULL)
>+ return; /* Main thread - cannot be cancelled anyway */
>
>- EnterCriticalSection(&th->wait.lock);
>- assert(th->wait.addr == NULL);
>- th->wait.addr = addr;
>- LeaveCriticalSection(&th->wait.lock);
>- break;
>- }
>+ EnterCriticalSection(&th->wait.lock);
>+ assert(th->wait.addr == NULL);
>+ th->wait.addr = addr;
>+ LeaveCriticalSection(&th->wait.lock);
>+}
>
>- case VLC_CANCEL_ADDR_CLEAR:
>- {
>- void *addr = va_arg(ap, void *);
>+void vlc_cancel_addr_clear(void *addr)
>+{
>+ struct vlc_thread *th = vlc_thread_self();
>+ if (th == NULL)
>+ return; /* Main thread - cannot be cancelled anyway */
>
>- EnterCriticalSection(&th->wait.lock);
>- assert(th->wait.addr == addr);
>- th->wait.addr = NULL;
>- LeaveCriticalSection(&th->wait.lock);
>- break;
>- }
>- }
>- va_end (ap);
>+ EnterCriticalSection(&th->wait.lock);
>+ assert(th->wait.addr == addr);
>+ th->wait.addr = NULL;
>+ LeaveCriticalSection(&th->wait.lock);
> }
>
> /*** Clock ***/
>--
>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/e14d1e4d/attachment.html>
More information about the vlc-devel
mailing list