-/*****************************************************************************
- * vlc_mutex_init: initialize a recursive mutex (Do not use)
- *****************************************************************************/
-int vlc_mutex_init_recursive( vlc_mutex_t *p_mutex )
-{
-#if defined( LIBVLC_USE_PTHREAD )
- pthread_mutexattr_t attr;
- int i_result;
-
- pthread_mutexattr_init( &attr );
-# if defined (__GLIBC__) && (__GLIBC_MINOR__ < 6)
- pthread_mutexattr_setkind_np( &attr, PTHREAD_MUTEX_RECURSIVE_NP );
-# else
- pthread_mutexattr_settype( &attr, PTHREAD_MUTEX_RECURSIVE );
-# endif
- i_result = pthread_mutex_init( p_mutex, &attr );
- pthread_mutexattr_destroy( &attr );
- return( i_result );
-
-#elif defined( WIN32 )
- InitializeCriticalSection( &p_mutex->mutex );
- p_mutex->initialized = 1;
- return 0;
-
-#endif
-}
-
-
-/**
- * Destroys a mutex. The mutex must not be locked.
- *
- * @param p_mutex mutex to destroy
- * @return always succeeds
- */
-void vlc_mutex_destroy (vlc_mutex_t *p_mutex)
-{
-#if defined( LIBVLC_USE_PTHREAD )
- int val = pthread_mutex_destroy( p_mutex );
- VLC_THREAD_ASSERT ("destroying mutex");
-
-#elif defined( WIN32 )
- assert (InterlockedExchange (&p_mutex->initialized, -1) == 1);
- DeleteCriticalSection (&p_mutex->mutex);
-
-#endif
-}
-
-#if defined(LIBVLC_USE_PTHREAD) && !defined(NDEBUG)
-void vlc_assert_locked (vlc_mutex_t *p_mutex)
-{
- assert (pthread_mutex_lock (p_mutex) == EDEADLK);
-}
-#endif
-
-/**
- * Acquires a mutex. If needed, waits for any other thread to release it.
- * Beware of deadlocks when locking multiple mutexes at the same time,
- * or when using mutexes from callbacks.
- * This function is not a cancellation-point.
- *
- * @param p_mutex mutex initialized with vlc_mutex_init() or
- * vlc_mutex_init_recursive()
- */
-void vlc_mutex_lock (vlc_mutex_t *p_mutex)
-{
-#if defined(LIBVLC_USE_PTHREAD)
- int val = pthread_mutex_lock( p_mutex );
- VLC_THREAD_ASSERT ("locking mutex");
-
-#elif defined( WIN32 )
- if (InterlockedCompareExchange (&p_mutex->initialized, 0, 0) == 0)
- { /* ^^ We could also lock super_mutex all the time... sluggish */
- assert (p_mutex != &super_mutex); /* this one cannot be static */
-
- vlc_mutex_lock (&super_mutex);
- if (InterlockedCompareExchange (&p_mutex->initialized, 0, 0) == 0)
- vlc_mutex_init (p_mutex);
- /* FIXME: destroy the mutex some time... */
- vlc_mutex_unlock (&super_mutex);
- }
- assert (InterlockedExchange (&p_mutex->initialized, 1) == 1);
- EnterCriticalSection (&p_mutex->mutex);
-
-#endif
-}
-
-/**
- * Acquires a mutex if and only if it is not currently held by another thread.
- * This function never sleeps and can be used in delay-critical code paths.
- * This function is not a cancellation-point.
- *
- * <b>Beware</b>: If this function fails, then the mutex is held... by another
- * thread. The calling thread must deal with the error appropriately. That
- * typically implies postponing the operations that would have required the
- * mutex. If the thread cannot defer those operations, then it must use
- * vlc_mutex_lock(). If in doubt, use vlc_mutex_lock() instead.
- *
- * @param p_mutex mutex initialized with vlc_mutex_init() or
- * vlc_mutex_init_recursive()
- * @return 0 if the mutex could be acquired, an error code otherwise.
- */
-int vlc_mutex_trylock (vlc_mutex_t *p_mutex)
-{
-#if defined(LIBVLC_USE_PTHREAD)
- int val = pthread_mutex_trylock( p_mutex );
-
- if (val != EBUSY)
- VLC_THREAD_ASSERT ("locking mutex");
- return val;
-
-#elif defined( WIN32 )
- if (InterlockedCompareExchange (&p_mutex->initialized, 0, 0) == 0)
- { /* ^^ We could also lock super_mutex all the time... sluggish */
- assert (p_mutex != &super_mutex); /* this one cannot be static */
-
- vlc_mutex_lock (&super_mutex);
- if (InterlockedCompareExchange (&p_mutex->initialized, 0, 0) == 0)
- vlc_mutex_init (p_mutex);
- /* FIXME: destroy the mutex some time... */
- vlc_mutex_unlock (&super_mutex);
- }
- assert (InterlockedExchange (&p_mutex->initialized, 1) == 1);
- return TryEnterCriticalSection (&p_mutex->mutex) ? 0 : EBUSY;
-
-#endif
-}
-
-/**
- * Releases a mutex (or crashes if the mutex is not locked by the caller).
- * @param p_mutex mutex locked with vlc_mutex_lock().
- */
-void vlc_mutex_unlock (vlc_mutex_t *p_mutex)
-{
-#if defined(LIBVLC_USE_PTHREAD)
- int val = pthread_mutex_unlock( p_mutex );
- VLC_THREAD_ASSERT ("unlocking mutex");
-
-#elif defined( WIN32 )
- assert (InterlockedExchange (&p_mutex->initialized, 1) == 1);
- LeaveCriticalSection (&p_mutex->mutex);
-
-#endif
-}
-
-/*****************************************************************************
- * vlc_cond_init: initialize a condition variable
- *****************************************************************************/
-int vlc_cond_init( vlc_cond_t *p_condvar )
-{
-#if defined( LIBVLC_USE_PTHREAD )
- pthread_condattr_t attr;
- int ret;
-
- ret = pthread_condattr_init (&attr);
- if (ret)
- return ret;
-
-# 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
-
- ret = pthread_cond_init (p_condvar, &attr);
- pthread_condattr_destroy (&attr);
- return ret;
-
-#elif defined( WIN32 )
- /* Create a manual-reset event (manual reset is needed for broadcast). */
- *p_condvar = CreateEvent( NULL, TRUE, FALSE, NULL );
- return *p_condvar ? 0 : ENOMEM;
-
-#endif
-}
-
-/**
- * Destroys a condition variable. No threads shall be waiting or signaling the
- * condition.
- * @param p_condvar condition variable to destroy