[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