From: RĂ©mi Denis-Courmont Date: Fri, 11 Jul 2008 21:02:37 +0000 (+0300) Subject: Stub cancellation support X-Git-Tag: 1.0.0-pre1~3774 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=5a6312880481cc2f2cef82b141ddbd82b28825d9;p=vlc Stub cancellation support --- diff --git a/include/vlc_threads.h b/include/vlc_threads.h index 9610793a4a..c2dd3030a8 100644 --- a/include/vlc_threads.h +++ b/include/vlc_threads.h @@ -589,6 +589,16 @@ static inline void barrier (void) #endif } +#ifndef LIBVLC_USE_PTHREAD +enum { + VLC_SAVE_CANCEL, + VLC_RESTORE_CANCEL, + VLC_TEST_CANCEL, +}; +#endif + +VLC_EXPORT (void, vlc_control_cancel, (int cmd, ...)); + /** * Save the cancellation state and disable cancellation for the calling thread. * This function must be called before entering a piece of code that is not @@ -600,6 +610,8 @@ static inline void vlc_savecancel (int *p_state) { #if defined (LIBVLC_USE_PTHREAD) (void) pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, p_state); +#else + vlc_control_cancel (VLC_SAVE_CANCEL, p_state); #endif } @@ -612,6 +624,8 @@ static inline void vlc_restorecancel (int state) { #if defined (LIBVLC_USE_PTHREAD) (void) pthread_setcancelstate (state, NULL); +#else + vlc_control_cancel (VLC_RESTORE_CANCEL, state); #endif } @@ -624,6 +638,8 @@ static inline void vlc_testcancel (void) { #if defined (LIBVLC_USE_PTHREAD) pthread_testcancel (); +#else + vlc_control_cancel (VLC_TEST_CANCEL); #endif } diff --git a/src/libvlccore.sym b/src/libvlccore.sym index f61c17d6c6..78aaf52d51 100644 --- a/src/libvlccore.sym +++ b/src/libvlccore.sym @@ -426,6 +426,7 @@ __vlc_cond_destroy __vlc_cond_init vlc_config_create vlc_config_set +vlc_control_cancel vlc_CPU vlc_error __vlc_event_attach diff --git a/src/misc/threads.c b/src/misc/threads.c index af65ddb4a0..97f9f194c7 100644 --- a/src/misc/threads.c +++ b/src/misc/threads.c @@ -31,6 +31,7 @@ #include #include "libvlc.h" +#include #include #ifdef HAVE_UNISTD_H # include @@ -836,3 +837,45 @@ void vlc_thread_cancel (vlc_object_t *obj) if (priv->b_thread) vlc_cancel (priv->thread_id); } + +void vlc_control_cancel (int cmd, ...) +{ +#ifdef LIBVLC_USE_PTHREAD + (void) cmd; + abort(); +#else + static __thread struct vlc_cancel_t *stack = NULL; + static __thread bool killed = false, killable = true; + va_list ap; + + va_start (ap, cmd); + + switch (cmd) + { + case VLC_SAVE_CANCEL: + { + int *p_state = va_arg (ap, int *); + *p_state = killable; + killable = false; + break; + } + + case VLC_RESTORE_CANCEL: + { + int state = va_arg (ap, int); + killable = state != 0; + break; + } + + case VLC_TEST_CANCEL: + if (killable) +#ifdef WIN32 + _endthread (); +#else +# error Not implemented! +#endif + break; + } + va_end (ap); +#endif +}