Commit 0a908c0b authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

(Potentially) allow pthread without pthread native cancellation

parent dde85414
...@@ -47,6 +47,7 @@ ...@@ -47,6 +47,7 @@
#else /* pthreads (like Linux & BSD) */ #else /* pthreads (like Linux & BSD) */
# define LIBVLC_USE_PTHREAD 1 # define LIBVLC_USE_PTHREAD 1
# define LIBVLC_USE_PTHREAD_CANCEL 1
# define _APPLE_C_SOURCE 1 /* Proper pthread semantics on OSX */ # define _APPLE_C_SOURCE 1 /* Proper pthread semantics on OSX */
# include <stdlib.h> /* lldiv_t definition (only in C99) */ # include <stdlib.h> /* lldiv_t definition (only in C99) */
...@@ -181,7 +182,7 @@ VLC_EXPORT( void, vlc_cancel, (vlc_thread_t) ); ...@@ -181,7 +182,7 @@ VLC_EXPORT( void, vlc_cancel, (vlc_thread_t) );
VLC_EXPORT( int, vlc_join, (vlc_thread_t, void **) ); VLC_EXPORT( int, vlc_join, (vlc_thread_t, void **) );
VLC_EXPORT (void, vlc_control_cancel, (int cmd, ...)); VLC_EXPORT (void, vlc_control_cancel, (int cmd, ...));
#ifndef LIBVLC_USE_PTHREAD #ifndef LIBVLC_USE_PTHREAD_CANCEL
enum { enum {
VLC_SAVE_CANCEL, VLC_SAVE_CANCEL,
VLC_RESTORE_CANCEL, VLC_RESTORE_CANCEL,
...@@ -283,7 +284,7 @@ static inline void __vlc_mutex_unlock( const char * psz_file, int i_line, ...@@ -283,7 +284,7 @@ static inline void __vlc_mutex_unlock( const char * psz_file, int i_line,
static inline int vlc_savecancel (void) static inline int vlc_savecancel (void)
{ {
int state; int state;
#if defined (LIBVLC_USE_PTHREAD) #if defined (LIBVLC_USE_PTHREAD_CANCEL)
(void) pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &state); (void) pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &state);
#else #else
vlc_control_cancel (VLC_SAVE_CANCEL, &state); vlc_control_cancel (VLC_SAVE_CANCEL, &state);
...@@ -298,7 +299,7 @@ static inline int vlc_savecancel (void) ...@@ -298,7 +299,7 @@ static inline int vlc_savecancel (void)
*/ */
static inline void vlc_restorecancel (int state) static inline void vlc_restorecancel (int state)
{ {
#if defined (LIBVLC_USE_PTHREAD) #if defined (LIBVLC_USE_PTHREAD_CANCEL)
(void) pthread_setcancelstate (state, NULL); (void) pthread_setcancelstate (state, NULL);
#else #else
vlc_control_cancel (VLC_RESTORE_CANCEL, state); vlc_control_cancel (VLC_RESTORE_CANCEL, state);
...@@ -312,14 +313,14 @@ static inline void vlc_restorecancel (int state) ...@@ -312,14 +313,14 @@ static inline void vlc_restorecancel (int state)
*/ */
static inline void vlc_testcancel (void) static inline void vlc_testcancel (void)
{ {
#if defined (LIBVLC_USE_PTHREAD) #if defined (LIBVLC_USE_PTHREAD_CANCEL)
pthread_testcancel (); pthread_testcancel ();
#else #else
vlc_control_cancel (VLC_TEST_CANCEL); vlc_control_cancel (VLC_TEST_CANCEL);
#endif #endif
} }
#if defined (LIBVLC_USE_PTHREAD) #if defined (LIBVLC_USE_PTHREAD_CANCEL)
/** /**
* Registers a new procedure to run if the thread is cancelled (or otherwise * Registers a new procedure to run if the thread is cancelled (or otherwise
* exits prematurely). Any call to vlc_cleanup_push() <b>must</b> paired with a * exits prematurely). Any call to vlc_cleanup_push() <b>must</b> paired with a
...@@ -371,7 +372,7 @@ struct vlc_cleanup_t ...@@ -371,7 +372,7 @@ struct vlc_cleanup_t
vlc_cleanup_data.proc (vlc_cleanup_data.data); \ vlc_cleanup_data.proc (vlc_cleanup_data.data); \
} while (0) } while (0)
#endif /* LIBVLC_USE_PTHREAD */ #endif /* LIBVLC_USE_PTHREAD_CANCEL */
static inline void vlc_cleanup_lock (void *lock) static inline void vlc_cleanup_lock (void *lock)
{ {
......
...@@ -180,7 +180,7 @@ int vlc_threads_init( void ) ...@@ -180,7 +180,7 @@ int vlc_threads_init( void )
vlc_threadvar_create( &thread_object_key, NULL ); vlc_threadvar_create( &thread_object_key, NULL );
#endif #endif
vlc_threadvar_create( &msg_context_global_key, msg_StackDestroy ); vlc_threadvar_create( &msg_context_global_key, msg_StackDestroy );
#ifndef LIBVLC_USE_PTHREAD #ifndef LIBVLC_USE_PTHREAD_CANCEL
vlc_threadvar_create( &cancel_key, free ); vlc_threadvar_create( &cancel_key, free );
#endif #endif
} }
...@@ -586,10 +586,12 @@ static void CALLBACK vlc_cancel_self (ULONG_PTR dummy) ...@@ -586,10 +586,12 @@ static void CALLBACK vlc_cancel_self (ULONG_PTR dummy)
*/ */
void vlc_cancel (vlc_thread_t thread_id) void vlc_cancel (vlc_thread_t thread_id)
{ {
#if defined (LIBVLC_USE_PTHREAD) #if defined (LIBVLC_USE_PTHREAD_CANCEL)
pthread_cancel (thread_id); pthread_cancel (thread_id);
#elif defined (WIN32) #elif defined (WIN32)
QueueUserAPC (vlc_cancel_self, thread_id->handle, 0); QueueUserAPC (vlc_cancel_self, thread_id->handle, 0);
#else
# warning vlc_cancel is not implemented!
#endif #endif
} }
...@@ -864,7 +866,7 @@ void vlc_thread_cancel (vlc_object_t *obj) ...@@ -864,7 +866,7 @@ void vlc_thread_cancel (vlc_object_t *obj)
vlc_cancel (priv->thread_id); vlc_cancel (priv->thread_id);
} }
#ifndef LIBVLC_USE_PTHREAD #ifndef LIBVLC_USE_PTHREAD_CANCEL
typedef struct vlc_cancel_t typedef struct vlc_cancel_t
{ {
vlc_cleanup_t *cleaners; vlc_cleanup_t *cleaners;
...@@ -877,7 +879,7 @@ void vlc_control_cancel (int cmd, ...) ...@@ -877,7 +879,7 @@ void vlc_control_cancel (int cmd, ...)
{ {
/* NOTE: This function only modifies thread-specific data, so there is no /* NOTE: This function only modifies thread-specific data, so there is no
* need to lock anything. */ * need to lock anything. */
#ifdef LIBVLC_USE_PTHREAD #ifdef LIBVLC_USE_PTHREAD_CANCEL
(void) cmd; (void) cmd;
assert (0); assert (0);
#else #else
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment