vlc | branch: master | Steve Lhomme <[email protected]> | Mon Feb 10 13:48:50 2020 +0100| [999df27e422e6eb01a5215e5ec5cf3ba1ec4bcf3] | committer: Steve Lhomme
threads: no need for varargs in vlc_control_cancel() anymore Either we pass a cleaner (PUSH) or NULL (POP). > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=999df27e422e6eb01a5215e5ec5cf3ba1ec4bcf3 --- include/vlc_threads.h | 19 ++++++------------- src/missing.c | 4 ++-- src/os2/thread.c | 30 ++++++++++-------------------- src/win32/thread.c | 30 ++++++++++-------------------- 4 files changed, 28 insertions(+), 55 deletions(-) diff --git a/include/vlc_threads.h b/include/vlc_threads.h index 68b98b6b33..0e27ea803f 100644 --- a/include/vlc_threads.h +++ b/include/vlc_threads.h @@ -816,13 +816,15 @@ VLC_API int vlc_savecancel(void); */ VLC_API void vlc_restorecancel(int state); +typedef struct vlc_cleanup_t vlc_cleanup_t; + /** * Internal handler for thread cancellation. * * Do not call this function directly. Use wrapper macros instead: * vlc_cleanup_push(), vlc_cleanup_pop(). */ -VLC_API void vlc_control_cancel(int cmd, ...); +VLC_API void vlc_control_cancel(vlc_cleanup_t *); /** * Thread handle. @@ -1033,12 +1035,6 @@ VLC_API unsigned vlc_timer_getoverrun(vlc_timer_t) VLC_USED; */ VLC_API unsigned vlc_GetCPUCount(void); -enum -{ - VLC_CLEANUP_PUSH, - VLC_CLEANUP_POP, -}; - #if defined (LIBVLC_USE_PTHREAD_CLEANUP) /** * Registers a thread cancellation handler. @@ -1067,9 +1063,7 @@ enum */ # define vlc_cleanup_pop( ) pthread_cleanup_pop (0) -#else -typedef struct vlc_cleanup_t vlc_cleanup_t; - +#else /* !LIBVLC_USE_PTHREAD_CLEANUP */ struct vlc_cleanup_t { vlc_cleanup_t *next; @@ -1084,11 +1078,10 @@ struct vlc_cleanup_t */ # define vlc_cleanup_push( routine, arg ) \ do { \ - vlc_control_cancel(VLC_CLEANUP_PUSH, \ - &(vlc_cleanup_t){ NULL, routine, arg }) + vlc_control_cancel(&(vlc_cleanup_t){ NULL, routine, arg }) # define vlc_cleanup_pop( ) \ - vlc_control_cancel (VLC_CLEANUP_POP); \ + vlc_control_cancel (NULL); \ } while (0) # else /* Those macros do not work in C++. However common C/C++ helpers may call them diff --git a/src/missing.c b/src/missing.c index dcab1b1d6b..72c60c9315 100644 --- a/src/missing.c +++ b/src/missing.c @@ -297,9 +297,9 @@ noreturn update_release_t *update_GetRelease(update_t *u) #include <vlc_threads.h> #if defined(LIBVLC_USE_PTHREAD_CLEANUP) -noreturn void vlc_control_cancel (int cmd, ...) +noreturn void vlc_control_cancel (vlc_cleanup_t *cleaner) { - (void) cmd; + (void) cleaner; vlc_assert_unreachable (); } #endif diff --git a/src/os2/thread.c b/src/os2/thread.c index 98a72984af..7975cd52a7 100644 --- a/src/os2/thread.c +++ b/src/os2/thread.c @@ -749,36 +749,26 @@ void vlc_testcancel (void) } } -void vlc_control_cancel (int cmd, ...) +void vlc_control_cancel (vlc_cleanup_t *cleaner) { /* NOTE: This function only modifies thread-specific data, so there is no * need to lock anything. */ - va_list ap; struct vlc_thread *th = vlc_thread_self (); if (th == NULL) return; /* Main thread - cannot be cancelled anyway */ - va_start (ap, cmd); - switch (cmd) + if (cleaner != NULL) { - case VLC_CLEANUP_PUSH: - { - /* cleaner is a pointer to the caller stack, no need to allocate - * and copy anything. As a nice side effect, this cannot fail. */ - vlc_cleanup_t *cleaner = va_arg (ap, vlc_cleanup_t *); - cleaner->next = th->cleaners; - th->cleaners = cleaner; - break; - } - - case VLC_CLEANUP_POP: - { - th->cleaners = th->cleaners->next; - break; - } + /* cleaner is a pointer to the caller stack, no need to allocate + * and copy anything. As a nice side effect, this cannot fail. */ + cleaner->next = th->cleaners; + th->cleaners = cleaner; + } + else + { + th->cleaners = th->cleaners->next; } - va_end (ap); } static int vlc_select( int nfds, fd_set *rdset, fd_set *wrset, fd_set *exset, diff --git a/src/win32/thread.c b/src/win32/thread.c index 994bd1631b..7bc6196519 100644 --- a/src/win32/thread.c +++ b/src/win32/thread.c @@ -638,36 +638,26 @@ void vlc_testcancel (void) _endthreadex(0); } -void vlc_control_cancel (int cmd, ...) +void vlc_control_cancel (vlc_cleanup_t *cleaner) { /* NOTE: This function only modifies thread-specific data, so there is no * need to lock anything. */ - va_list ap; struct vlc_thread *th = vlc_thread_self(); if (th == NULL) return; /* Main thread - cannot be cancelled anyway */ - va_start (ap, cmd); - switch (cmd) + if (cleaner != NULL) { - case VLC_CLEANUP_PUSH: - { - /* cleaner is a pointer to the caller stack, no need to allocate - * and copy anything. As a nice side effect, this cannot fail. */ - vlc_cleanup_t *cleaner = va_arg (ap, vlc_cleanup_t *); - cleaner->next = th->cleaners; - th->cleaners = cleaner; - break; - } - - case VLC_CLEANUP_POP: - { - th->cleaners = th->cleaners->next; - break; - } + /* cleaner is a pointer to the caller stack, no need to allocate + * and copy anything. As a nice side effect, this cannot fail. */ + cleaner->next = th->cleaners; + th->cleaners = cleaner; + } + else + { + th->cleaners = th->cleaners->next; } - va_end (ap); } void vlc_cancel_addr_set(atomic_uint *addr) _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
