[project @ 2002-01-31 11:18:06 by sof]
[ghc-hetmet.git] / ghc / rts / OSThreads.c
1 /* ---------------------------------------------------------------------------
2  *
3  * (c) The GHC Team, 2001
4  *
5  * Accessing OS threads functionality in a (mostly) OS-independent
6  * manner. 
7  *
8  * 
9  * --------------------------------------------------------------------------*/
10 #include "Rts.h"
11 #if defined(RTS_SUPPORTS_THREADS)
12 #include "OSThreads.h"
13
14
15 #if defined(HAVE_PTHREAD_H) && !defined(WANT_NATIVE_WIN32_THREADS)
16 /*
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.
20  *
21  */
22
23 void initCondVar( CondVar* pCond )
24 {
25   pthread_cond_init(pCond, NULL);
26   return;
27 }
28
29 void closeCondVar( CondVar* pCond )
30 {
31   pthread_cond_destroy(pCond);
32   return;
33 }
34
35 rtsBool
36 broadcastCondVar ( CondVar* pCond )
37 {
38   return (pthread_cond_broadcast(pCond) == 0);
39 }
40
41 rtsBool
42 signalCondVar ( CondVar* pCond )
43 {
44   return (pthread_cond_signal(pCond) == 0);
45 }
46
47 rtsBool
48 waitCondVar ( CondVar* pCond, MutexVar* pMut )
49 {
50   return (pthread_cond_wait(pCond,pMut) == 0);
51 }
52
53 void shutdownThread()
54 {
55   pthread_exit(NULL);
56 }
57
58 int createOSThread ( OSThreadId* pId, void *(*startProc)(void*))
59 {
60   return pthread_create(pId, NULL, startProc, NULL);
61 }
62
63 OSThreadId osThreadId()
64 {
65   return pthread_self();
66 }
67
68 void initMutexVar (MutexVar* pMut)
69 {
70   pthread_mutex_init(pMut,NULL);
71   return;
72 }
73
74 #elif defined(HAVE_WINDOWS_H)
75 /* Win32 threads and synchronisation objects */
76
77 /* A CondVar is represented by a Win32 Event object,
78  * a MutexVar by a Mutex kernel object.
79  */
80
81 void initCondVar( CondVar* pCond )
82 {
83   HANDLE h =  CreateEvent(NULL, 
84                           TRUE,  /* manual reset */
85                           TRUE,  /* initially signalled */
86                           NULL); /* unnamed => process-local. */
87   
88
89
90   pthread_cond_init(pCond, NULL);
91   return;
92 }
93
94 void closeCondVar( CondVar* pCond )
95 {
96   pthread_cond_destroy(pCond);
97   return;
98 }
99
100 rtsBool
101 broadcastCondVar ( CondVar* pCond )
102 {
103   return (pthread_cond_broadcast(pCond) == 0);
104 }
105
106 rtsBool
107 signalCondVar ( CondVar* pCond )
108 {
109   return (pthread_cond_signal(pCond) == 0);
110 }
111
112 rtsBool
113 waitCondVar ( CondVar* pCond, MutexVar* pMut )
114 {
115   return (pthread_cond_wait(pCond,pMut) == 0);
116 }
117
118 void shutdownThread()
119 {
120   pthread_exit(NULL);
121 }
122
123 int createOSThread ( OSThreadId* pId, void *(*startProc)(void*))
124 {
125   return pthread_create(pId, NULL, startProc, NULL);
126 }
127
128 OSThreadId osThreadId()
129 {
130   return pthread_self();
131 }
132
133 void initMutexVar (MutexVar* pMut)
134 {
135   pthread_mutex_init(pMut);
136   return;
137 }
138
139 #endif /* defined(HAVE_PTHREAD_H) */
140
141 #endif /* defined(RTS_SUPPORTS_THREADS) */