-#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 )
- DWORD result;
-
- do
- {
- vlc_testcancel ();
- result = SignalObjectAndWait (*p_mutex, *p_condvar, INFINITE, TRUE);
-
- /* Reacquire the mutex before returning. */
- vlc_mutex_lock( p_mutex );
- }
- while (result == WAIT_IO_COMPLETION);
-
- vlc_testcancel ();
-
- (void)psz_file; (void)i_line;
-
-#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 );
-
-#endif
-}
-
-
-/*****************************************************************************
- * vlc_cond_timedwait: wait until condition completion or expiration
- *****************************************************************************
- * Returns 0 if object signaled, an error code in case of timeout or error.
- *****************************************************************************/
-#define vlc_cond_timedwait( P_COND, P_MUTEX, DEADLINE ) \
- __vlc_cond_timedwait( __FILE__, __LINE__, P_COND, P_MUTEX, DEADLINE )
-
-static inline int __vlc_cond_timedwait( const char * psz_file, int i_line,
- vlc_cond_t *p_condvar,
- vlc_mutex_t *p_mutex,
- mtime_t deadline )
-{
-#if defined(LIBVLC_USE_PTHREAD)
- lldiv_t d = lldiv( deadline, 1000000 );
- struct timespec ts = { d.quot, d.rem * 1000 };
-
- int val = pthread_cond_timedwait (p_condvar, p_mutex, &ts);
- if (val != ETIMEDOUT)
- VLC_THREAD_ASSERT ("timed-waiting on condition");
- return val;
-
-#elif defined( UNDER_CE )
- mtime_t delay_ms = (deadline - mdate())/1000;
- DWORD result;
- if( delay_ms < 0 )
- delay_ms = 0;
-
- LeaveCriticalSection( &p_mutex->csection );
- result = WaitForSingleObject( *p_condvar, delay_ms );
-
- /* Reacquire the mutex before returning. */
- vlc_mutex_lock( p_mutex );
-
- (void)psz_file; (void)i_line;
-
- return (result == WAIT_TIMEOUT) ? ETIMEDOUT : 0;
-
-#elif defined( WIN32 )
- mtime_t total;
- DWORD result = WAIT_TIMEOUT;
-
- (void)psz_file; (void)i_line;
-
- vlc_testcancel ();
- while ((total = (deadline - mdate ()) > 0))
- {
- DWORD delay = (total > 0x7fffffff) ? 0x7fffffff : total;
- result = SignalObjectAndWait( *p_mutex, *p_condvar,
- delay, TRUE );
-
- /* Reacquire the mutex before return/cancel. */
- vlc_mutex_lock (p_mutex);
- if (result == WAIT_OBJECT_0)
- return 0; /* Condition signaled! */
- vlc_testcancel ();
- }
- return ETIMEDOUT;
-
-#elif defined( SYS_BEOS )
-# error Unimplemented
-
-#endif
-}
-
-/*****************************************************************************
- * vlc_cond_destroy: destroy a condition
- *****************************************************************************/
-#define vlc_cond_destroy( P_COND ) \
- __vlc_cond_destroy( __FILE__, __LINE__, P_COND )
-
-/*****************************************************************************
- * 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( SYS_BEOS )
- i_ret = EINVAL;
-
-#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( SYS_BEOS )
- p_ret = NULL;
-
-#elif defined( UNDER_CE ) || defined( WIN32 )
- p_ret = TlsGetValue( *p_tls );
-
-#endif
-
- return p_ret;