1 /* ---------------------------------------------------------------------------
3 * (c) The GHC Team, 2001
5 * Accessing OS threads functionality in a (mostly) OS-independent
9 * --------------------------------------------------------------------------*/
11 #if defined(RTS_SUPPORTS_THREADS)
12 #include "OSThreads.h"
15 #if defined(HAVE_PTHREAD_H) && !defined(WANT_NATIVE_WIN32_THREADS)
17 * This (allegedly) OS threads independent layer was initially
18 * abstracted away from code that used Pthreads, so the functions
19 * provided here are mostly just wrappers to the Pthreads API.
23 void initCondVar( CondVar* pCond )
25 pthread_cond_init(pCond, NULL);
29 void closeCondVar( CondVar* pCond )
31 pthread_cond_destroy(pCond);
36 broadcastCondVar ( CondVar* pCond )
38 return (pthread_cond_broadcast(pCond) == 0);
42 signalCondVar ( CondVar* pCond )
44 return (pthread_cond_signal(pCond) == 0);
48 waitCondVar ( CondVar* pCond, MutexVar* pMut )
50 return (pthread_cond_wait(pCond,pMut) == 0);
58 int createOSThread ( OSThreadId* pId, void *(*startProc)(void*))
60 return pthread_create(pId, NULL, startProc, NULL);
63 OSThreadId osThreadId()
65 return pthread_self();
68 void initMutexVar (MutexVar* pMut)
70 pthread_mutex_init(pMut,NULL);
74 #elif defined(HAVE_WINDOWS_H)
75 /* Win32 threads and synchronisation objects */
77 /* A CondVar is represented by a Win32 Event object,
78 * a MutexVar by a Mutex kernel object.
81 void initCondVar( CondVar* pCond )
83 HANDLE h = CreateEvent(NULL,
84 TRUE, /* manual reset */
85 TRUE, /* initially signalled */
86 NULL); /* unnamed => process-local. */
90 pthread_cond_init(pCond, NULL);
94 void closeCondVar( CondVar* pCond )
96 pthread_cond_destroy(pCond);
101 broadcastCondVar ( CondVar* pCond )
103 return (pthread_cond_broadcast(pCond) == 0);
107 signalCondVar ( CondVar* pCond )
109 return (pthread_cond_signal(pCond) == 0);
113 waitCondVar ( CondVar* pCond, MutexVar* pMut )
115 return (pthread_cond_wait(pCond,pMut) == 0);
118 void shutdownThread()
123 int createOSThread ( OSThreadId* pId, void *(*startProc)(void*))
125 return pthread_create(pId, NULL, startProc, NULL);
128 OSThreadId osThreadId()
130 return pthread_self();
133 void initMutexVar (MutexVar* pMut)
135 pthread_mutex_init(pMut);
139 #endif /* defined(HAVE_PTHREAD_H) */
141 #endif /* defined(RTS_SUPPORTS_THREADS) */