X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FOSThreads.h;h=571c90ea6de088141dc66e5f2d77559ef92e88b9;hb=9e6162f9d0102d1f5738bf78258b24ea5a647ea4;hp=feca45f728403c5f9d6e5eff868284847eeed979;hpb=48ccd03ca6db00ad6a12ca173826e2bccf3734f7;p=ghc-hetmet.git diff --git a/ghc/rts/OSThreads.h b/ghc/rts/OSThreads.h index feca45f..571c90e 100644 --- a/ghc/rts/OSThreads.h +++ b/ghc/rts/OSThreads.h @@ -9,39 +9,59 @@ * --------------------------------------------------------------------------*/ #ifndef __OSTHREADS_H__ #define __OSTHREADS_H__ -#if defined(RTS_SUPPORTS_THREADS) /*to the end */ +#if defined(RTS_SUPPORTS_THREADS) /* to the end */ -#if defined(HAVE_PTHREAD_H) && !defined(WANT_NATIVE_WIN32_THREADS) -#include -typedef pthread_cond_t CondVar; -typedef pthread_mutex_t MutexVar; +# if defined(HAVE_PTHREAD_H) && !defined(WANT_NATIVE_WIN32_THREADS) +# include +typedef pthread_cond_t Condition; +typedef pthread_mutex_t Mutex; typedef pthread_t OSThreadId; -#define INIT_MUTEX_VAR PTHREAD_MUTEX_INITIALIZER -#define INIT_COND_VAR PTHREAD_COND_INITIALIZER -#elif defined(HAVE_WINDOWS_H) +#define INIT_MUTEX_VAR PTHREAD_MUTEX_INITIALIZER +#define INIT_COND_VAR PTHREAD_COND_INITIALIZER + +#ifdef LOCK_DEBUG +#define ACQUIRE_LOCK(mutex) fprintf(stderr, "ACQUIRE_LOCK(0x%p) %s %d\n", mutex,__FILE__,__LINE__); fflush(stderr); pthread_mutex_lock(mutex) +#define RELEASE_LOCK(mutex) fprintf(stderr, "RELEASE_LOCK(0x%p) %s %d\n", mutex,__FILE__,__LINE__); fflush(stderr); pthread_mutex_unlock(mutex) +#else +#define ACQUIRE_LOCK(mutex) pthread_mutex_lock(mutex) +#define RELEASE_LOCK(mutex) pthread_mutex_unlock(mutex) +#endif + +# elif defined(HAVE_WINDOWS_H) #include -typedef HANDLE CondVar; -typedef HANDLE MutexVar; + +typedef HANDLE Condition; +typedef HANDLE Mutex; typedef DWORD OSThreadId; #define INIT_MUTEX_VAR 0 #define INIT_COND_VAR 0 -#else -#error "Threads not supported" -#endif -extern void initCondVar ( CondVar* pCond ); -extern void closeCondVar ( CondVar* pCond ); -extern rtsBool broadcastCondVar (CondVar* pCond ); -extern rtsBool signalCondVar ( CondVar* pCond ); -extern rtsBool waitCondVar ( CondVar* pCond, MutexVar* pMut); +#define ACQUIRE_LOCK(mutex) WaitForSingleObject(mutex,INFINITE) +#define RELEASE_LOCK(mutex) ReleaseMutex(mutex) +# else +# error "Threads not supported" +# endif + +extern void initCondition ( Condition* pCond ); +extern void closeCondition ( Condition* pCond ); +extern rtsBool broadcastCondition ( Condition* pCond ); +extern rtsBool signalCondition ( Condition* pCond ); +extern rtsBool waitCondition ( Condition* pCond, + Mutex* pMut ); -extern OSThreadId osThreadId(void); -extern void shutdownThread(void); -extern int createOSThread ( OSThreadId* tid, void *(*startProc)(void*)); +extern void initMutex ( Mutex* pMut ); + +extern OSThreadId osThreadId ( void ); +extern void shutdownThread ( void ); +extern void yieldThread ( void ); +extern int createOSThread ( OSThreadId* tid, + void (*startProc)(void) ); +#else -extern void initMutexVar ( MutexVar* pMut ); +#define ACQUIRE_LOCK(l) +#define RELEASE_LOCK(l) #endif /* defined(RTS_SUPPORTS_THREADS) */