/* $Id: Thread.h,v 1.10 2004/03/16 16:14:03 titer Exp $
This file is part of the HandBrake source code.
Homepage: .
It may be used under the terms of the GNU General Public License. */
#ifndef HB_THREAD_H
#define HB_THREAD_H
/* System headers */
#if defined( HB_BEOS )
# include
#elif defined( HB_MACOSX ) || defined( HB_LINUX )
# include
#elif defined( HB_CYGWIN )
# include
#endif
#include "Utils.h"
/* Thread priorities */
#if defined( HB_BEOS )
# define HB_LOW_PRIORITY 5
# define HB_NORMAL_PRIORITY 10
#elif defined( HB_MACOSX )
# define HB_LOW_PRIORITY 0
# define HB_NORMAL_PRIORITY 31
#elif defined( HB_LINUX ) || defined( HB_CYGWIN )
/* Actually unused */
# define HB_LOW_PRIORITY 0
# define HB_NORMAL_PRIORITY 0
#endif
/**********************************************************************
* HBThread/HBLock/HBCond declarations
**********************************************************************/
HBThread * HBThreadInit( char * name,
void (* function)(void *),
void * arg, int priority );
void HBThreadClose( HBThread ** );
HBLock * HBLockInit();
static inline void HBLockLock( HBLock * );
static inline void HBLockUnlock( HBLock * );
void HBLockClose( HBLock ** );
HBCond * HBCondInit();
static inline void HBCondWait( HBCond *, HBLock * );
static inline void HBCondSignal( HBCond * );
void HBCondClose( HBCond ** );
/**********************************************************************
* HBLock implementation (inline functions)
**********************************************************************/
struct HBLock
{
#if defined( HB_BEOS )
sem_id sem;
#elif defined( HB_MACOSX ) || defined( HB_LINUX )
pthread_mutex_t mutex;
#elif defined( HB_CYGWIN )
HANDLE mutex;
#endif
};
static inline void HBLockLock( HBLock * l )
{
#if defined( HB_BEOS )
acquire_sem( l->sem );
#elif defined( HB_MACOSX ) || defined( HB_LINUX )
pthread_mutex_lock( &l->mutex );
#elif defined( HB_CYGWIN )
WaitForSingleObject( l->mutex, INFINITE );
#endif
}
static inline void HBLockUnlock( HBLock * l )
{
#if defined( HB_BEOS )
release_sem( l->sem );
#elif defined( HB_MACOSX ) || defined( HB_LINUX )
pthread_mutex_unlock( &l->mutex );
#elif defined( HB_CYGWIN )
ReleaseMutex( l->mutex );
#endif
}
/**********************************************************************
* HBCond implementation (inline functions)
**********************************************************************/
struct HBCond
{
#if defined( HB_BEOS )
int thread;
#elif defined( HB_MACOSX ) || defined( HB_LINUX )
pthread_cond_t cond;
#elif defined( HB_CYGWIN )
HANDLE event;
#endif
};
static inline void HBCondWait( HBCond * c, HBLock * lock )
{
#if defined( HB_BEOS )
c->thread = find_thread( NULL );
release_sem( lock->sem );
suspend_thread( c->thread );
acquire_sem( lock->sem );
c->thread = -1;
#elif defined( HB_MACOSX ) || defined( HB_LINUX )
pthread_cond_wait( &c->cond, &lock->mutex );
#elif defined( HB_CYGWIN )
SignalObjectAndWait( lock->mutex, c->event, INFINITE, FALSE );
WaitForSingleObject( lock->mutex, INFINITE );
#endif
}
static inline void HBCondSignal( HBCond * c )
{
#if defined( HB_BEOS )
while( c->thread != -1 )
{
thread_info info;
get_thread_info( c->thread, &info );
if( info.state == B_THREAD_SUSPENDED )
{
resume_thread( c->thread );
break;
}
/* In case HBCondSignal is called between HBCondWait's
release_sem() and suspend_thread() lines, wait a bit */
snooze( 5000 );
}
#elif defined( HB_MACOSX ) || defined( HB_LINUX )
pthread_cond_signal( &c->cond );
#elif defined( HB_CYGWIN )
PulseEvent( c->event );
#endif
}
#endif