X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=include%2Fvlc_threads.h;h=7ccafbbafce2890e507139c7ddee0bb4348df89e;hb=66bd92014e5d721d8fe74bfd69f601bfd228012a;hp=7b66e5b07cbee6dd6f90be6f2258f3ae84ae098a;hpb=14e89cbcefbdd8efd03c6d7484d13682ffe67b4e;p=vlc diff --git a/include/vlc_threads.h b/include/vlc_threads.h index 7b66e5b07c..7ccafbbafc 100644 --- a/include/vlc_threads.h +++ b/include/vlc_threads.h @@ -115,14 +115,17 @@ typedef struct HANDLE handle; void *(*entry) (void *); void *data; +#if defined( UNDER_CE ) + HANDLE cancel_event; +#endif } *vlc_thread_t; typedef struct { - CRITICAL_SECTION mutex; LONG initialized; + CRITICAL_SECTION mutex; } vlc_mutex_t; -#define VLC_STATIC_MUTEX { .initialized = 0, } +#define VLC_STATIC_MUTEX { 0, } typedef HANDLE vlc_cond_t; typedef DWORD vlc_threadvar_t; @@ -136,12 +139,13 @@ typedef DWORD vlc_threadvar_t; /***************************************************************************** * Function definitions *****************************************************************************/ -VLC_EXPORT( int, vlc_mutex_init, ( vlc_mutex_t * ) ); -VLC_EXPORT( int, vlc_mutex_init_recursive, ( vlc_mutex_t * ) ); +VLC_EXPORT( void, vlc_mutex_init, ( vlc_mutex_t * ) ); +VLC_EXPORT( void, vlc_mutex_init_recursive, ( vlc_mutex_t * ) ); VLC_EXPORT( void, vlc_mutex_destroy, ( vlc_mutex_t * ) ); VLC_EXPORT( void, vlc_mutex_lock, ( vlc_mutex_t * ) ); +VLC_EXPORT( int, vlc_mutex_trylock, ( vlc_mutex_t * ) LIBVLC_USED ); VLC_EXPORT( void, vlc_mutex_unlock, ( vlc_mutex_t * ) ); -VLC_EXPORT( int, vlc_cond_init, ( vlc_cond_t * ) ); +VLC_EXPORT( void, vlc_cond_init, ( vlc_cond_t * ) ); VLC_EXPORT( void, vlc_cond_destroy, ( vlc_cond_t * ) ); VLC_EXPORT( void, vlc_cond_signal, (vlc_cond_t *) ); VLC_EXPORT( void, vlc_cond_broadcast, (vlc_cond_t *) ); @@ -149,73 +153,28 @@ VLC_EXPORT( void, vlc_cond_wait, (vlc_cond_t *, vlc_mutex_t *) ); VLC_EXPORT( int, vlc_cond_timedwait, (vlc_cond_t *, vlc_mutex_t *, mtime_t) ); VLC_EXPORT( int, vlc_threadvar_create, (vlc_threadvar_t * , void (*) (void *) ) ); VLC_EXPORT( void, vlc_threadvar_delete, (vlc_threadvar_t *) ); -VLC_EXPORT( int, __vlc_thread_create, ( vlc_object_t *, const char *, int, const char *, void * ( * ) ( vlc_object_t * ), int, bool ) ); +VLC_EXPORT( int, vlc_threadvar_set, (vlc_threadvar_t, void *) ); +VLC_EXPORT( void *, vlc_threadvar_get, (vlc_threadvar_t) ); +VLC_EXPORT( int, vlc_thread_create, ( vlc_object_t *, const char *, int, const char *, void * ( * ) ( vlc_object_t * ), int ) LIBVLC_USED ); VLC_EXPORT( int, __vlc_thread_set_priority, ( vlc_object_t *, const char *, int, int ) ); VLC_EXPORT( void, __vlc_thread_join, ( vlc_object_t * ) ); -VLC_EXPORT( int, vlc_clone, (vlc_thread_t *, void * (*) (void *), void *, int) ); +VLC_EXPORT( int, vlc_clone, (vlc_thread_t *, void * (*) (void *), void *, int) LIBVLC_USED ); VLC_EXPORT( void, vlc_cancel, (vlc_thread_t) ); VLC_EXPORT( void, vlc_join, (vlc_thread_t, void **) ); VLC_EXPORT (void, vlc_control_cancel, (int cmd, ...)); #ifndef LIBVLC_USE_PTHREAD_CANCEL enum { - VLC_SAVE_CANCEL, - VLC_RESTORE_CANCEL, - VLC_TEST_CANCEL, VLC_DO_CANCEL, VLC_CLEANUP_PUSH, VLC_CLEANUP_POP, }; #endif -VLC_EXPORT(void, vlc_thread_ready, (vlc_object_t *obj)); -#define vlc_thread_ready(o) vlc_thread_ready(VLC_OBJECT(o)) - -/** - * 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 - * cancellation-safe. - * @return Previous cancellation state (opaque value). - */ -static inline int vlc_savecancel (void) -{ - int state; -#if defined (LIBVLC_USE_PTHREAD_CANCEL) - (void) pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &state); -#else - vlc_control_cancel (VLC_SAVE_CANCEL, &state); -#endif - return state; -} - -/** - * Restore the cancellation state for the calling thread. - * @param state previous state as returned by vlc_savecancel(). - * @return Nothing, always succeeds. - */ -static inline void vlc_restorecancel (int state) -{ -#if defined (LIBVLC_USE_PTHREAD_CANCEL) - (void) pthread_setcancelstate (state, NULL); -#else - vlc_control_cancel (VLC_RESTORE_CANCEL, state); -#endif -} - -/** - * Issues an explicit deferred cancellation point. - * This has no effect if thread cancellation is disabled. - * This can be called when there is a rather slow non-sleeping operation. - */ -static inline void vlc_testcancel (void) -{ -#if defined (LIBVLC_USE_PTHREAD_CANCEL) - pthread_testcancel (); -#else - vlc_control_cancel (VLC_TEST_CANCEL); -#endif -} +VLC_EXPORT( int, vlc_savecancel, (void) ); +VLC_EXPORT( void, vlc_restorecancel, (int state) ); +VLC_EXPORT( void, vlc_testcancel, (void) ); #if defined (LIBVLC_USE_PTHREAD_CANCEL) /** @@ -277,51 +236,16 @@ static inline void vlc_cleanup_lock (void *lock) } #define mutex_cleanup_push( lock ) vlc_cleanup_push (vlc_cleanup_lock, lock) -/***************************************************************************** - * vlc_threadvar_set: create: set the value of a thread-local variable - *****************************************************************************/ -static inline int vlc_threadvar_set( vlc_threadvar_t * p_tls, void *p_value ) -{ - int i_ret; - -#if defined(LIBVLC_USE_PTHREAD) - i_ret = pthread_setspecific( *p_tls, p_value ); - -#elif defined( UNDER_CE ) || defined( WIN32 ) - i_ret = TlsSetValue( *p_tls, p_value ) ? EINVAL : 0; - -#endif - - return i_ret; -} - -/***************************************************************************** - * vlc_threadvar_get: create: get the value of a thread-local variable - *****************************************************************************/ -static inline void* vlc_threadvar_get( vlc_threadvar_t * p_tls ) -{ - void *p_ret; - -#if defined(LIBVLC_USE_PTHREAD) - p_ret = pthread_getspecific( *p_tls ); - -#elif defined( UNDER_CE ) || defined( WIN32 ) - p_ret = TlsGetValue( *p_tls ); - -#endif - - return p_ret; -} - # if defined (_POSIX_SPIN_LOCKS) && ((_POSIX_SPIN_LOCKS - 0) > 0) typedef pthread_spinlock_t vlc_spinlock_t; /** * Initializes a spinlock. */ -static inline int vlc_spin_init (vlc_spinlock_t *spin) +static inline void vlc_spin_init (vlc_spinlock_t *spin) { - return pthread_spin_init (spin, PTHREAD_PROCESS_PRIVATE); + if (pthread_spin_init (spin, PTHREAD_PROCESS_PRIVATE)) + abort (); } /** @@ -348,21 +272,17 @@ static inline void vlc_spin_destroy (vlc_spinlock_t *spin) pthread_spin_destroy (spin); } -#elif defined( WIN32 ) +#elif defined (WIN32) && !defined (UNDER_CE) typedef CRITICAL_SECTION vlc_spinlock_t; /** * Initializes a spinlock. */ -static inline int vlc_spin_init (vlc_spinlock_t *spin) +static inline void vlc_spin_init (vlc_spinlock_t *spin) { -#ifdef UNDER_CE - InitializeCriticalSection(spin); - return 0; -#else - return !InitializeCriticalSectionAndSpinCount(spin, 4000); -#endif + if (!InitializeCriticalSectionAndSpinCount(spin, 4000)) + abort (); } /** @@ -394,9 +314,9 @@ static inline void vlc_spin_destroy (vlc_spinlock_t *spin) /* Fallback to plain mutexes if spinlocks are not available */ typedef vlc_mutex_t vlc_spinlock_t; -static inline int vlc_spin_init (vlc_spinlock_t *spin) +static inline void vlc_spin_init (vlc_spinlock_t *spin) { - return vlc_mutex_init (spin); + vlc_mutex_init (spin); } # define vlc_spin_lock vlc_mutex_lock @@ -412,7 +332,7 @@ static inline int vlc_spin_init (vlc_spinlock_t *spin) #endif static inline void barrier (void) { -#if defined (__GNUC__) && \ +#if defined (__GNUC__) && !defined (__APPLE__) && \ ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1)) __sync_synchronize (); #elif defined(__APPLE__) @@ -433,8 +353,8 @@ static inline void barrier (void) /***************************************************************************** * vlc_thread_create: create a thread *****************************************************************************/ -#define vlc_thread_create( P_THIS, PSZ_NAME, FUNC, PRIORITY, WAIT ) \ - __vlc_thread_create( VLC_OBJECT(P_THIS), __FILE__, __LINE__, PSZ_NAME, FUNC, PRIORITY, WAIT ) +#define vlc_thread_create( P_THIS, PSZ_NAME, FUNC, PRIORITY ) \ + vlc_thread_create( VLC_OBJECT(P_THIS), __FILE__, __LINE__, PSZ_NAME, FUNC, PRIORITY ) /***************************************************************************** * vlc_thread_set_priority: set the priority of the calling thread