Subversion Repositories shark

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
55 pj 1
/* $Id: glthread.h,v 1.1 2003-02-28 11:42:02 pj Exp $ */
2
 
3
/*
4
 * Mesa 3-D graphics library
5
 * Version:  3.5
6
 *
7
 * Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
8
 *
9
 * Permission is hereby granted, free of charge, to any person obtaining a
10
 * copy of this software and associated documentation files (the "Software"),
11
 * to deal in the Software without restriction, including without limitation
12
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13
 * and/or sell copies of the Software, and to permit persons to whom the
14
 * Software is furnished to do so, subject to the following conditions:
15
 *
16
 * The above copyright notice and this permission notice shall be included
17
 * in all copies or substantial portions of the Software.
18
 *
19
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
22
 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23
 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25
 */
26
 
27
 
28
/*
29
 * Thread support for gl dispatch.
30
 *
31
 * Initial version by John Stone (j.stone@acm.org) (johns@cs.umr.edu)
32
 *                and Christoph Poliwoda (poliwoda@volumegraphics.com)
33
 * Revised by Keith Whitwell
34
 * Adapted for new gl dispatcher by Brian Paul
35
 *
36
 *
37
 *
38
 * DOCUMENTATION
39
 *
40
 * This thread module exports the following types:
41
 *   _glthread_TSD     Thread-specific data area
42
 *   _glthread_Thread  Thread datatype
43
 *   _glthread_Mutex   Mutual exclusion lock
44
 *
45
 * Macros:
46
 *   _glthread_DECLARE_STATIC_MUTEX(name)   Declare a non-local mutex
47
 *   _glthread_INIT_MUTEX(name)             Initialize a mutex
48
 *   _glthread_LOCK_MUTEX(name)             Lock a mutex
49
 *   _glthread_UNLOCK_MUTEX(name)           Unlock a mutex
50
 *
51
 * Functions:
52
 *   _glthread_GetID(v)      Get integer thread ID
53
 *   _glthread_InitTSD()     Initialize thread-specific data
54
 *   _glthread_GetTSD()      Get thread-specific data
55
 *   _glthread_SetTSD()      Set thread-specific data
56
 *
57
 */
58
 
59
/*
60
 * If this file is accidentally included by a non-threaded build,
61
 * it should not cause the build to fail, or otherwise cause problems.
62
 * In general, it should only be included when needed however.
63
 */
64
 
65
#ifndef GLTHREAD_H
66
#define GLTHREAD_H
67
 
68
 
69
#if defined(PTHREADS) || defined(SOLARIS_THREADS) || defined(WIN32_THREADS) || defined(XTHREADS)
70
#define THREADS
71
#endif
72
 
73
#ifdef VMS
74
#include <GL/vms_x_fix.h>
75
#endif
76
 
77
/*
78
 * POSIX threads. This should be your choice in the Unix world
79
 * whenever possible.  When building with POSIX threads, be sure
80
 * to enable any compiler flags which will cause the MT-safe
81
 * libc (if one exists) to be used when linking, as well as any
82
 * header macros for MT-safe errno, etc.  For Solaris, this is the -mt
83
 * compiler flag.  On Solaris with gcc, use -D_REENTRANT to enable
84
 * proper compiling for MT-safe libc etc.
85
 */
86
#if defined(PTHREADS)
87
#include <pthread.h> /* POSIX threads headers */
88
 
89
typedef struct {
90
   pthread_key_t  key;
91
   int initMagic;
92
} _glthread_TSD;
93
 
94
typedef pthread_t _glthread_Thread;
95
 
96
typedef pthread_mutex_t _glthread_Mutex;
97
 
98
#define _glthread_DECLARE_STATIC_MUTEX(name) \
99
   static _glthread_Mutex name = PTHREAD_MUTEX_INITIALIZER
100
 
101
#define _glthread_INIT_MUTEX(name) \
102
   pthread_mutex_init(&(name), NULL)
103
 
104
#define _glthread_LOCK_MUTEX(name) \
105
   (void) pthread_mutex_lock(&(name))
106
 
107
#define _glthread_UNLOCK_MUTEX(name) \
108
   (void) pthread_mutex_unlock(&(name))
109
 
110
#endif /* PTHREADS */
111
 
112
 
113
 
114
 
115
/*
116
 * Solaris threads. Use only up to Solaris 2.4.
117
 * Solaris 2.5 and higher provide POSIX threads.
118
 * Be sure to compile with -mt on the Solaris compilers, or
119
 * use -D_REENTRANT if using gcc.
120
 */
121
#ifdef SOLARIS_THREADS
122
#include <thread.h>
123
 
124
typedef struct {
125
   thread_key_t key;
126
   mutex_t      keylock;
127
   int          initMagic;
128
} _glthread_TSD;
129
 
130
typedef thread_t _glthread_Thread;
131
 
132
typedef mutex_t _glthread_Mutex;
133
 
134
/* XXX need to really implement mutex-related macros */
135
#define _glthread_DECLARE_STATIC_MUTEX(name)  static _glthread_Mutex name = 0
136
#define _glthread_INIT_MUTEX(name)  (void) name
137
#define _glthread_LOCK_MUTEX(name)  (void) name
138
#define _glthread_UNLOCK_MUTEX(name)  (void) name
139
 
140
#endif /* SOLARIS_THREADS */
141
 
142
 
143
 
144
 
145
/*
146
 * Windows threads. Should work with Windows NT and 95.
147
 * IMPORTANT: Link with multithreaded runtime library when THREADS are
148
 * used!
149
 */
150
#ifdef WIN32_THREADS
151
#include <windows.h>
152
 
153
typedef struct {
154
   DWORD key;
155
   int   initMagic;
156
} _glthread_TSD;
157
 
158
typedef HANDLE _glthread_Thread;
159
 
160
typedef CRITICAL_SECTION _glthread_Mutex;
161
 
162
/* XXX need to really implement mutex-related macros */
163
#define _glthread_DECLARE_STATIC_MUTEX(name)  static _glthread_Mutex name = 0
164
#define _glthread_INIT_MUTEX(name)  (void) name
165
#define _glthread_LOCK_MUTEX(name)  (void) name
166
#define _glthread_UNLOCK_MUTEX(name)  (void) name
167
 
168
#endif /* WIN32_THREADS */
169
 
170
 
171
 
172
 
173
/*
174
 * XFree86 has its own thread wrapper, Xthreads.h
175
 * We wrap it again for GL.
176
 */
177
#ifdef XTHREADS
178
#include "Xthreads.h"
179
 
180
typedef struct {
181
   xthread_key_t key;
182
   int initMagic;
183
} _glthread_TSD;
184
 
185
typedef xthread_t _glthread_Thread;
186
 
187
typedef xmutex_rec _glthread_Mutex;
188
 
189
#ifdef XMUTEX_INITIALIZER
190
#define _glthread_DECLARE_STATIC_MUTEX(name) \
191
   static _glthread_Mutex name = XMUTEX_INITIALIZER
192
#else
193
#define _glthread_DECLARE_STATIC_MUTEX(name) \
194
   static _glthread_Mutex name
195
#endif
196
 
197
#define _glthread_INIT_MUTEX(name) \
198
   xmutex_init(&(name))
199
 
200
#define _glthread_LOCK_MUTEX(name) \
201
   (void) xmutex_lock(&(name))
202
 
203
#define _glthread_UNLOCK_MUTEX(name) \
204
   (void) xmutex_unlock(&(name))
205
 
206
#endif /* XTHREADS */
207
 
208
 
209
 
210
/*
211
 * BeOS threads. R5.x required.
212
 */
213
#ifdef BEOS_THREADS
214
#include <kernel/OS.h>
215
#include <support/TLS.h>
216
 
217
typedef struct {
218
   int32        key;
219
   int          initMagic;
220
} _glthread_TSD;
221
 
222
typedef thread_id _glthread_Thread;
223
 
224
/* Use Benaphore, aka speeder semaphore */
225
typedef struct {
226
    int32   lock;
227
    sem_id  sem;
228
} benaphore;
229
typedef benaphore _glthread_Mutex;
230
 
231
#define _glthread_DECLARE_STATIC_MUTEX(name)  static _glthread_Mutex name = { 0,
232
create_sem(0, #name"_benaphore") }
233
#define _glthread_INIT_MUTEX(name)    name.sem = create_sem(0, #name"_benaphore"), name.lock = 0
234
#define _glthread_LOCK_MUTEX(name)    if((atomic_add(&(name.lock), 1)) >= 1) acquire_sem(name.sem)
235
#define _glthread_UNLOCK_MUTEX(name)  if((atomic_add(&(name.lock), -1)) > 1) release_sem(name.sem)
236
 
237
#endif /* BEOS_THREADS */
238
 
239
 
240
 
241
#ifndef THREADS
242
 
243
/*
244
 * THREADS not defined
245
 */
246
 
247
typedef GLuint _glthread_TSD;
248
 
249
typedef GLuint _glthread_Thread;
250
 
251
typedef GLuint _glthread_Mutex;
252
 
253
#define _glthread_DECLARE_STATIC_MUTEX(name)  static _glthread_Mutex name = 0
254
 
255
#define _glthread_INIT_MUTEX(name)  (void) name
256
 
257
#define _glthread_LOCK_MUTEX(name)  (void) name
258
 
259
#define _glthread_UNLOCK_MUTEX(name)  (void) name
260
 
261
#endif /* THREADS */
262
 
263
 
264
 
265
/*
266
 * Platform independent thread specific data API.
267
 */
268
 
269
extern unsigned long
270
_glthread_GetID(void);
271
 
272
 
273
extern void
274
_glthread_InitTSD(_glthread_TSD *);
275
 
276
 
277
extern void *
278
_glthread_GetTSD(_glthread_TSD *);
279
 
280
 
281
extern void
282
_glthread_SetTSD(_glthread_TSD *, void *);
283
 
284
 
285
 
286
#endif /* THREADS_H */