X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=include%2Fvlc_threads.h;h=dd0bce783580ee79d9e3cacf82f9bdb636d44375;hb=10865b25e025324b96b4e12d0e376d47b0843a5a;hp=0232dc78df8be09163085436dddbbeb98fedd6a8;hpb=b3eb9ab9bdba36e85d63ca0234cc8e95d2188eed;p=vlc diff --git a/include/vlc_threads.h b/include/vlc_threads.h index 0232dc78df..dd0bce7835 100644 --- a/include/vlc_threads.h +++ b/include/vlc_threads.h @@ -122,10 +122,10 @@ typedef struct 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; @@ -143,6 +143,7 @@ VLC_EXPORT( int, vlc_mutex_init, ( vlc_mutex_t * ) ); VLC_EXPORT( int, 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 * ) ); VLC_EXPORT( void, vlc_mutex_unlock, ( vlc_mutex_t * ) ); VLC_EXPORT( int, vlc_cond_init, ( vlc_cond_t * ) ); VLC_EXPORT( void, vlc_cond_destroy, ( vlc_cond_t * ) ); @@ -152,7 +153,9 @@ 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 ) ); VLC_EXPORT( int, __vlc_thread_set_priority, ( vlc_object_t *, const char *, int, int ) ); VLC_EXPORT( void, __vlc_thread_join, ( vlc_object_t * ) ); @@ -163,62 +166,15 @@ 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) /** @@ -280,42 +236,6 @@ 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; @@ -415,7 +335,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__) @@ -436,8 +356,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