[vlc-devel] [[PATCH v3] 1/6] threads: turn vlc_cancel_addr_set/clear into internal functions

Steve Lhomme robux4 at ycbcr.xyz
Mon Feb 10 14:39:10 CET 2020


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



More information about the vlc-devel mailing list