-VLC_EXPORT( int, __vlc_thread_create, ( vlc_object_t *, const char *, int, const char *, void * ( * ) ( vlc_object_t * ), int, bool ) );
-VLC_EXPORT( int, __vlc_thread_set_priority, ( vlc_object_t *, const char *, int, int ) );
-VLC_EXPORT( void, __vlc_thread_join, ( vlc_object_t *, const char *, int ) );
-
-#define vlc_thread_ready vlc_object_signal
-
-/*****************************************************************************
- * vlc_mutex_lock: lock a mutex
- *****************************************************************************/
-#define vlc_mutex_lock( P_MUTEX ) \
- __vlc_mutex_lock( __FILE__, __LINE__, P_MUTEX )
-
-VLC_EXPORT(void, vlc_pthread_fatal, (const char *action, int error, const char *file, unsigned line));
-
-#if defined(LIBVLC_USE_PTHREAD)
-# define VLC_THREAD_ASSERT( action ) \
- if (val) \
- vlc_pthread_fatal (action, val, psz_file, i_line)
-#else
-# define VLC_THREAD_ASSERT ((void)(val))
-#endif
-
-static inline void __vlc_mutex_lock( const char * psz_file, int i_line,
- vlc_mutex_t * p_mutex )
-{
-#if defined(LIBVLC_USE_PTHREAD)
-# define vlc_assert_locked( m ) \
- assert (pthread_mutex_lock (m) == EDEADLK)
- int val = pthread_mutex_lock( p_mutex );
- VLC_THREAD_ASSERT ("locking mutex");
-
-#elif defined( UNDER_CE )
- (void)psz_file; (void)i_line;
-
- EnterCriticalSection( &p_mutex->csection );
-
-#elif defined( WIN32 )
- (void)psz_file; (void)i_line;
-
- WaitForSingleObject( *p_mutex, INFINITE );
-
-#elif defined( SYS_BEOS )
- acquire_sem( p_mutex->lock );
-
-#endif
-}
-
-#ifndef vlc_assert_locked
-# define vlc_assert_locked( m ) (void)0
-#endif
-
-/*****************************************************************************
- * vlc_mutex_unlock: unlock a mutex
- *****************************************************************************/
-#define vlc_mutex_unlock( P_MUTEX ) \
- __vlc_mutex_unlock( __FILE__, __LINE__, P_MUTEX )
-
-static inline void __vlc_mutex_unlock( const char * psz_file, int i_line,
- vlc_mutex_t *p_mutex )
-{
-#if defined(LIBVLC_USE_PTHREAD)
- int val = pthread_mutex_unlock( p_mutex );
- VLC_THREAD_ASSERT ("unlocking mutex");
-
-#elif defined( UNDER_CE )
- (void)psz_file; (void)i_line;
-
- LeaveCriticalSection( &p_mutex->csection );
-
-#elif defined( WIN32 )
- (void)psz_file; (void)i_line;
-
- ReleaseMutex( *p_mutex );
-
-#elif defined( SYS_BEOS )
- release_sem( p_mutex->lock );
-
-#endif
-}
-
-/*****************************************************************************
- * vlc_mutex_destroy: destroy a mutex
- *****************************************************************************/
-#define vlc_mutex_destroy( P_MUTEX ) \
- __vlc_mutex_destroy( __FILE__, __LINE__, P_MUTEX )
-
-/*****************************************************************************
- * vlc_cond_init: initialize a condition
- *****************************************************************************/
-#define vlc_cond_init( P_THIS, P_COND ) \
- __vlc_cond_init( P_COND )
-
-/*****************************************************************************
- * vlc_cond_signal: start a thread on condition completion
- *****************************************************************************/
-#define vlc_cond_signal( P_COND ) \
- __vlc_cond_signal( __FILE__, __LINE__, P_COND )
-
-static inline void __vlc_cond_signal( const char * psz_file, int i_line,
- vlc_cond_t *p_condvar )
-{
-#if defined(LIBVLC_USE_PTHREAD)
- int val = pthread_cond_signal( p_condvar );
- VLC_THREAD_ASSERT ("signaling condition variable");
-
-#elif defined( UNDER_CE ) || defined( WIN32 )
- (void)psz_file; (void)i_line;
-
- /* Release one waiting thread if one is available. */
- /* For this trick to work properly, the vlc_cond_signal must be surrounded
- * by a mutex. This will prevent another thread from stealing the signal */
- /* PulseEvent() only works if none of the waiting threads is suspended.
- * This is particularily problematic under a debug session.
- * as documented in http://support.microsoft.com/kb/q173260/ */
- PulseEvent( *p_condvar );
-
-#elif defined( SYS_BEOS )
- while( p_condvar->thread != -1 )
- {
- thread_info info;
- if( get_thread_info(p_condvar->thread, &info) == B_BAD_VALUE )
- return;
-
- if( info.state != B_THREAD_SUSPENDED )
- {
- /* The waiting thread is not suspended so it could
- * have been interrupted beetwen the unlock and the
- * suspend_thread line. That is why we sleep a little
- * before retesting p_condver->thread. */
- snooze( 10000 );
- }
- else
- {
- /* Ok, we have to wake up that thread */
- resume_thread( p_condvar->thread );
- }
- }
-
-#endif
-}
-
-/*****************************************************************************
- * vlc_cond_wait: wait until condition completion
- *****************************************************************************/
-#define vlc_cond_wait( P_COND, P_MUTEX ) \
- __vlc_cond_wait( __FILE__, __LINE__, P_COND, P_MUTEX )
-
-static inline void __vlc_cond_wait( const char * psz_file, int i_line,
- vlc_cond_t *p_condvar, vlc_mutex_t *p_mutex )
-{
-#if defined(LIBVLC_USE_PTHREAD)
- int val = pthread_cond_wait( p_condvar, p_mutex );
- VLC_THREAD_ASSERT ("waiting on condition");
-
-#elif defined( UNDER_CE )
- LeaveCriticalSection( &p_mutex->csection );
- WaitForSingleObject( *p_condvar, INFINITE );
-
- /* Reacquire the mutex before returning. */
- vlc_mutex_lock( p_mutex );
-
-#elif defined( WIN32 )
- (void)psz_file; (void)i_line;
-
- /* Increase our wait count */
- SignalObjectAndWait( *p_mutex, *p_condvar, INFINITE, FALSE );
-
- /* Reacquire the mutex before returning. */
- vlc_mutex_lock( p_mutex );
-
-#elif defined( SYS_BEOS )
- /* The p_condvar->thread var is initialized before the unlock because
- * it enables to identify when the thread is interrupted beetwen the
- * unlock line and the suspend_thread line */
- p_condvar->thread = find_thread( NULL );
- vlc_mutex_unlock( p_mutex );
- suspend_thread( p_condvar->thread );
- p_condvar->thread = -1;
-
- vlc_mutex_lock( p_mutex );
-
+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) 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, ...));
+
+VLC_EXPORT( int, vlc_timer_create, (vlc_timer_t *, void (*) (void *), void *) LIBVLC_USED );
+VLC_EXPORT( void, vlc_timer_destroy, (vlc_timer_t) );
+VLC_EXPORT( void, vlc_timer_schedule, (vlc_timer_t, bool, mtime_t, mtime_t) );
+VLC_EXPORT( unsigned, vlc_timer_getoverrun, (vlc_timer_t) LIBVLC_USED );
+
+#ifndef LIBVLC_USE_PTHREAD_CANCEL
+enum {
+ VLC_CLEANUP_PUSH,
+ VLC_CLEANUP_POP,
+};