X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=include%2Fvlc_threads_funcs.h;h=f99ff3305a533edf50bd4b0eb0001d749ffa1cf0;hb=83aa9e53cd10f367dad1f3290be83de385db6e30;hp=a5d8143dec20e8459a7a30006b3f2d2d4284b0e2;hpb=8f92249ae4cc44e2eceecfba0610e43174813156;p=vlc diff --git a/include/vlc_threads_funcs.h b/include/vlc_threads_funcs.h index a5d8143dec..f99ff3305a 100644 --- a/include/vlc_threads_funcs.h +++ b/include/vlc_threads_funcs.h @@ -84,7 +84,7 @@ VLC_EXPORT( void, __vlc_thread_join, ( vlc_object_t *, const char *, int ) ); #define vlc_mutex_lock( P_MUTEX ) \ __vlc_mutex_lock( __FILE__, __LINE__, P_MUTEX ) -#if defined( PTHREAD_COND_T_IN_PTHREAD_H ) +#if defined(LIBVLC_USE_PTHREAD) static inline unsigned long int CAST_PTHREAD_TO_INT (pthread_t th) { union { pthread_t th; unsigned long int i; } v = { }; @@ -100,13 +100,7 @@ static inline int __vlc_mutex_lock( const char * psz_file, int i_line, /* In case of error : */ unsigned long int i_thread = 0; -#if defined( PTH_INIT_IN_PTH_H ) - i_result = ( pth_mutex_acquire( &p_mutex->mutex, FALSE, NULL ) == FALSE ); - -#elif defined( ST_INIT_IN_ST_H ) - i_result = st_mutex_lock( p_mutex->mutex ); - -#elif defined( UNDER_CE ) +#if defined( UNDER_CE ) EnterCriticalSection( &p_mutex->csection ); i_result = 0; @@ -135,7 +129,7 @@ static inline int __vlc_mutex_lock( const char * psz_file, int i_line, i_result = acquire_sem( p_mutex->lock ); } -#elif defined( PTHREAD_COND_T_IN_PTHREAD_H ) +#elif defined(LIBVLC_USE_PTHREAD) # define vlc_assert_locked( m ) \ assert (pthread_mutex_lock (&((m)->mutex)) == EDEADLK) @@ -146,10 +140,6 @@ static inline int __vlc_mutex_lock( const char * psz_file, int i_line, errno = i_result; } -#elif defined( HAVE_CTHREADS_H ) - mutex_lock( p_mutex->mutex ); - i_result = 0; - #endif if( i_result ) @@ -179,13 +169,7 @@ static inline int __vlc_mutex_unlock( const char * psz_file, int i_line, /* In case of error : */ unsigned long int i_thread = 0; -#if defined( PTH_INIT_IN_PTH_H ) - i_result = ( pth_mutex_release( &p_mutex->mutex ) == FALSE ); - -#elif defined( ST_INIT_IN_ST_H ) - i_result = st_mutex_unlock( p_mutex->mutex ); - -#elif defined( UNDER_CE ) +#if defined( UNDER_CE ) LeaveCriticalSection( &p_mutex->csection ); i_result = 0; @@ -215,7 +199,7 @@ static inline int __vlc_mutex_unlock( const char * psz_file, int i_line, return B_OK; } -#elif defined( PTHREAD_COND_T_IN_PTHREAD_H ) +#elif defined(LIBVLC_USE_PTHREAD) i_result = pthread_mutex_unlock( &p_mutex->mutex ); if ( i_result ) { @@ -223,10 +207,6 @@ static inline int __vlc_mutex_unlock( const char * psz_file, int i_line, errno = i_result; } -#elif defined( HAVE_CTHREADS_H ) - mutex_unlock( p_mutex ); - i_result = 0; - #endif if( i_result ) @@ -265,13 +245,7 @@ static inline int __vlc_cond_signal( const char * psz_file, int i_line, /* In case of error : */ unsigned long int i_thread = 0; -#if defined( PTH_INIT_IN_PTH_H ) - i_result = ( pth_cond_notify( &p_condvar->cond, FALSE ) == FALSE ); - -#elif defined( ST_INIT_IN_ST_H ) - i_result = st_cond_signal( p_condvar->cond ); - -#elif defined( UNDER_CE ) +#if defined( UNDER_CE ) PulseEvent( p_condvar->event ); i_result = 0; @@ -358,7 +332,7 @@ static inline int __vlc_cond_signal( const char * psz_file, int i_line, i_result = 0; } -#elif defined( PTHREAD_COND_T_IN_PTHREAD_H ) +#elif defined(LIBVLC_USE_PTHREAD) i_result = pthread_cond_signal( &p_condvar->cond ); if ( i_result ) { @@ -366,14 +340,6 @@ static inline int __vlc_cond_signal( const char * psz_file, int i_line, errno = i_result; } -#elif defined( HAVE_CTHREADS_H ) - /* condition_signal() */ - if ( p_condvar->queue.head || p_condvar->implications ) - { - cond_signal( (condition_t)p_condvar ); - } - i_result = 0; - #endif if( i_result ) @@ -400,16 +366,7 @@ static inline int __vlc_cond_wait( const char * psz_file, int i_line, /* In case of error : */ unsigned long int i_thread = 0; -#if defined( PTH_INIT_IN_PTH_H ) - i_result = ( pth_cond_await( &p_condvar->cond, &p_mutex->mutex, NULL ) - == FALSE ); - -#elif defined( ST_INIT_IN_ST_H ) - st_mutex_unlock( p_mutex->mutex ); - i_result = st_cond_wait( p_condvar->cond ); - st_mutex_lock( p_mutex->mutex ); - -#elif defined( UNDER_CE ) +#if defined( UNDER_CE ) p_condvar->i_waiting_threads++; LeaveCriticalSection( &p_mutex->csection ); WaitForSingleObject( p_condvar->event, INFINITE ); @@ -521,43 +478,14 @@ static inline int __vlc_cond_wait( const char * psz_file, int i_line, vlc_mutex_lock( p_mutex ); i_result = 0; -#elif defined( PTHREAD_COND_T_IN_PTHREAD_H ) - -# ifdef DEBUG - /* In debug mode, timeout */ - struct timespec timeout = { - (mdate() / 1000000) + THREAD_COND_TIMEOUT, - 0 /* 1Hz precision is sufficient here :-) */ - }; - - i_result = pthread_cond_timedwait( &p_condvar->cond, &p_mutex->mutex, - &timeout ); - - if( i_result == ETIMEDOUT ) - { - errno = ETIMEDOUT; - msg_Dbg( p_condvar->p_this, - "thread %li: possible condition deadlock " - "at %s:%d (%m)", CAST_PTHREAD_TO_INT(pthread_self()), - psz_file, i_line ); - - i_result = pthread_cond_wait( &p_condvar->cond, &p_mutex->mutex ); - } - -# else +#elif defined(LIBVLC_USE_PTHREAD) i_result = pthread_cond_wait( &p_condvar->cond, &p_mutex->mutex ); -# endif - if ( i_result ) { i_thread = CAST_PTHREAD_TO_INT(pthread_self()); errno = i_result; } -#elif defined( HAVE_CTHREADS_H ) - condition_wait( (condition_t)p_condvar, (mutex_t)p_mutex ); - i_result = 0; - #endif if( i_result ) @@ -588,11 +516,7 @@ static inline int __vlc_cond_timedwait( const char * psz_file, int i_line, int i_res; unsigned long int i_thread = 0; -#if defined( PTH_INIT_IN_PTH_H ) -# error Unimplemented -#elif defined( ST_INIT_IN_ST_H ) -# error Unimplemented -#elif defined( UNDER_CE ) +#if defined( UNDER_CE ) mtime_t delay_ms = (deadline - mdate())/1000; DWORD result; @@ -705,7 +629,7 @@ static inline int __vlc_cond_timedwait( const char * psz_file, int i_line, #elif defined( HAVE_KERNEL_SCHEDULER_H ) # error Unimplemented -#elif defined( PTHREAD_COND_T_IN_PTHREAD_H ) +#elif defined(LIBVLC_USE_PTHREAD) lldiv_t d = lldiv( deadline, 1000000 ); struct timespec ts = { d.quot, d.rem * 1000 }; @@ -719,8 +643,6 @@ static inline int __vlc_cond_timedwait( const char * psz_file, int i_line, errno = i_res; } -#elif defined( HAVE_CTHREADS_H ) -# error Unimplemented #endif if( i_res ) @@ -753,21 +675,15 @@ static inline int vlc_threadvar_set( vlc_threadvar_t * p_tls, void *p_value ) { int i_ret; -#if defined( PTH_INIT_IN_PTH_H ) - return pth_key_setdata( p_tls->handle, p_value ); -#elif defined( ST_INIT_IN_ST_H ) - return st_thread_setspecific( p_tls->handle, p_value ); -#elif defined( HAVE_KERNEL_SCHEDULER_H ) +#if defined( HAVE_KERNEL_SCHEDULER_H ) return -1; #elif defined( UNDER_CE ) || defined( WIN32 ) i_ret = ( TlsSetValue( p_tls->handle, p_value ) != 0 ); -#elif defined( PTHREAD_COND_T_IN_PTHREAD_H ) +#elif defined(LIBVLC_USE_PTHREAD) i_ret = pthread_setspecific( p_tls->handle, p_value ); -#elif defined( HAVE_CTHREADS_H ) - i_ret = cthread_setspecific( p_tls->handle, p_value ); #endif return i_ret; @@ -780,23 +696,14 @@ static inline void* vlc_threadvar_get( vlc_threadvar_t * p_tls ) { void* p_ret; -#if defined( PTH_INIT_IN_PTH_H ) - p_ret = pth_key_getdata( p_handle->key ); -#elif defined( ST_INIT_IN_ST_H ) - p_ret = st_thread_getspecific( p_handle->key ); -#elif defined( HAVE_KERNEL_SCHEDULER_H ) +#if defined( HAVE_KERNEL_SCHEDULER_H ) p_ret = NULL; #elif defined( UNDER_CE ) || defined( WIN32 ) p_ret = TlsGetValue( p_tls->handle ); -#elif defined( PTHREAD_COND_T_IN_PTHREAD_H ) +#elif defined(LIBVLC_USE_PTHREAD) p_ret = pthread_getspecific( p_tls->handle ); -#elif defined( HAVE_CTHREADS_H ) - if ( !cthread_getspecific( p_tls->handle, &p_ret ) ) - { - p_ret = NULL; - } #endif return p_ret; @@ -839,13 +746,56 @@ static inline int vlc_spin_destroy (vlc_spinlock_t *spin) { return pthread_spin_destroy (&spin->spin); } + +#elif defined( WIN32 ) + +typedef CRITICAL_SECTION vlc_spinlock_t; + +/** + * Initializes a spinlock. + */ +static inline int vlc_spin_init (vlc_spinlock_t *spin) +{ + return !InitializeCriticalSectionAndSpinCount(spin, 4000); +} + +/** + * Acquires a spinlock. + */ +static inline int vlc_spin_lock (vlc_spinlock_t *spin) +{ + EnterCriticalSection(spin); + return 0; +} + +/** + * Releases a spinlock. + */ +static inline int vlc_spin_unlock (vlc_spinlock_t *spin) +{ + LeaveCriticalSection(spin); + return 0; +} + +/** + * Deinitializes a spinlock. + */ +static inline int vlc_spin_destroy (vlc_spinlock_t *spin) +{ + DeleteCriticalSection(spin); + return 0; +} + + #else + + /* 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) { - return vlc_mutex_init (NULL, spin); + return __vlc_mutex_init (NULL, spin); } # define vlc_spin_lock vlc_mutex_lock