home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / mesa5.zip / mesa5src.zip / glthread.h < prev    next >
C/C++ Source or Header  |  2002-03-07  |  8KB  |  287 lines

  1. /* $Id: glthread.h,v 1.11 2002/03/07 21:50:41 brianp 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 */
  287.