X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmisc%2Fthreads.c;h=908f510bc4e19386257f113d52721eb99d2fe7f8;hb=192a2076ddccdb60053ae5be615ae1303353bbe4;hp=affdc2276fb39df6fb6b0d119f025f6f6f3c2740;hpb=bec377a7e0cd1429e7d3179e0d7dfb5ae8c7f188;p=vlc diff --git a/src/misc/threads.c b/src/misc/threads.c index affdc2276f..908f510bc4 100644 --- a/src/misc/threads.c +++ b/src/misc/threads.c @@ -86,7 +86,7 @@ vlc_threadvar_t msg_context_global_key; void __vlc_threads_error( vlc_object_t *p_this ) { - msg_Err( p_this, "Error detected. Put a breakpoint in '%s' to debug.", + msg_Err( p_this, "Error detected. Put a breakpoint in '%s' to debug.", __func__ ); } @@ -321,6 +321,7 @@ int __vlc_mutex_init( vlc_object_t *p_this, vlc_mutex_t *p_mutex ) # else pthread_mutexattr_settype( &attr, PTHREAD_MUTEX_ERRORCHECK ); # endif + i_result = pthread_mutex_init( &p_mutex->mutex, &attr ); pthread_mutexattr_destroy( &attr ); return( i_result ); @@ -335,6 +336,40 @@ int __vlc_mutex_init( vlc_object_t *p_this, vlc_mutex_t *p_mutex ) #endif } +/***************************************************************************** + * vlc_mutex_init: initialize a recursive mutex (Do not use) + *****************************************************************************/ +int __vlc_mutex_init_recursive( vlc_object_t *p_this, vlc_mutex_t *p_mutex ) +{ +#if defined( WIN32 ) + /* Create mutex returns a recursive mutex */ + p_mutex->mutex = CreateMutex( 0, FALSE, 0 ); + return ( p_mutex->mutex != NULL ? 0 : 1 ); +#elif defined( PTHREAD_COND_T_IN_PTHREAD_H ) + pthread_mutexattr_t attr; + int i_result; + + pthread_mutexattr_init( &attr ); +# if defined(DEBUG) + /* Create error-checking mutex to detect problems more easily. */ +# if defined(SYS_LINUX) + pthread_mutexattr_setkind_np( &attr, PTHREAD_MUTEX_ERRORCHECK_NP ); +# else + pthread_mutexattr_settype( &attr, PTHREAD_MUTEX_ERRORCHECK ); +# endif +# endif + pthread_mutexattr_settype( &attr, PTHREAD_MUTEX_RECURSIVE ); + i_result = pthread_mutex_init( &p_mutex->mutex, &attr ); + pthread_mutexattr_destroy( &attr ); + return( i_result ); +#else + msg_Err(p_this, "no recursive mutex found. Falling back to regular mutex.\n" + "Expect hangs\n") + return __vlc_mutex_init( p_this, p_mutex ); +#endif +} + + /***************************************************************************** * vlc_mutex_destroy: destroy a mutex, inner version *****************************************************************************/ @@ -484,7 +519,11 @@ int __vlc_cond_init( vlc_object_t *p_this, vlc_cond_t *p_condvar ) if (ret) return ret; -# if defined (_POSIX_CLOCK_SELECTION) && (_POSIX_CLOCK_SELECTION >= 0) +# if !defined (_POSIX_CLOCK_SELECTION) + /* Fairly outdated POSIX support (that was defined in 2001) */ +# define _POSIX_CLOCK_SELECTION (-1) +# endif +# if (_POSIX_CLOCK_SELECTION >= 0) /* NOTE: This must be the same clock as the one in mtime.c */ pthread_condattr_setclock (&attr, CLOCK_MONOTONIC); # endif