1a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu/*
2a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu * Mesa 3-D graphics library
3a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu * Version:  6.5.2
4a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu *
5a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
6a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu *
7a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu * Permission is hereby granted, free of charge, to any person obtaining a
8a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu * copy of this software and associated documentation files (the "Software"),
9a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu * to deal in the Software without restriction, including without limitation
10a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu * and/or sell copies of the Software, and to permit persons to whom the
12a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu * Software is furnished to do so, subject to the following conditions:
13a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu *
14a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu * The above copyright notice and this permission notice shall be included
15a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu * in all copies or substantial portions of the Software.
16a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu *
17a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu */
24a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu
25a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu
26a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu/*
27a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu * Thread support for gl dispatch.
28a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu *
29a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu * Initial version by John Stone (j.stone@acm.org) (johns@cs.umr.edu)
30a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu *                and Christoph Poliwoda (poliwoda@volumegraphics.com)
31a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu * Revised by Keith Whitwell
32a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu * Adapted for new gl dispatcher by Brian Paul
33a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu * Modified for use in mapi by Chia-I Wu
34a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu */
35a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu
36a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu/*
37a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu * If this file is accidentally included by a non-threaded build,
38a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu * it should not cause the build to fail, or otherwise cause problems.
39a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu * In general, it should only be included when needed however.
40a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu */
41a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu
42a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu#ifndef _U_THREAD_H_
43a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu#define _U_THREAD_H_
44a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu
45b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner#include <stdio.h>
46b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner#include <stdlib.h>
47a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu#include "u_compiler.h"
48a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu
49a2f28ceea22254f09ee37039eec873ccdf689e6cMatt Turner#if defined(HAVE_PTHREAD)
5063e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca#include <pthread.h> /* POSIX threads headers */
5163e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca#endif
5263e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca#ifdef _WIN32
5363e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca#include <windows.h>
5463e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca#endif
5563e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca
56a2f28ceea22254f09ee37039eec873ccdf689e6cMatt Turner#if defined(HAVE_PTHREAD) || defined(_WIN32)
57a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu#ifndef THREADS
58a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu#define THREADS
59a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu#endif
60a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu#endif
61a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu
62b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner/*
63b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner * Error messages
64b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner */
65b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner#define INIT_TSD_ERROR "_glthread_: failed to allocate key for thread specific data"
66b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner#define GET_TSD_ERROR "_glthread_: failed to get thread specific data"
67b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner#define SET_TSD_ERROR "_glthread_: thread failed to set thread specific data"
68b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner
69b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner
70b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner/*
71b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner * Magic number to determine if a TSD object has been initialized.
72b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner * Kind of a hack but there doesn't appear to be a better cross-platform
73b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner * solution.
74b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner */
75b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner#define INIT_MAGIC 0xff8adc98
7663e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca
7763e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca#ifdef __cplusplus
7863e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonsecaextern "C" {
7963e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca#endif
8063e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca
8163e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca
82a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu/*
83a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu * POSIX threads. This should be your choice in the Unix world
84a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu * whenever possible.  When building with POSIX threads, be sure
85a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu * to enable any compiler flags which will cause the MT-safe
86a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu * libc (if one exists) to be used when linking, as well as any
87a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu * header macros for MT-safe errno, etc.  For Solaris, this is the -mt
88a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu * compiler flag.  On Solaris with gcc, use -D_REENTRANT to enable
89a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu * proper compiling for MT-safe libc etc.
90a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu */
91a2f28ceea22254f09ee37039eec873ccdf689e6cMatt Turner#if defined(HAVE_PTHREAD)
92a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu
93a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wustruct u_tsd {
94a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu   pthread_key_t key;
956549e721addc8fdf6b44450bf40ca14052a7745dJosé Fonseca   unsigned initMagic;
96a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu};
97a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu
98a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wutypedef pthread_mutex_t u_mutex;
99a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu
100a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu#define u_mutex_declare_static(name) \
101a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu   static u_mutex name = PTHREAD_MUTEX_INITIALIZER
102a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu
103a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu#define u_mutex_init(name)    pthread_mutex_init(&(name), NULL)
104a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu#define u_mutex_destroy(name) pthread_mutex_destroy(&(name))
105a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu#define u_mutex_lock(name)    (void) pthread_mutex_lock(&(name))
106a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu#define u_mutex_unlock(name)  (void) pthread_mutex_unlock(&(name))
107a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu
108b7a81b6e511c03876c852d049befa50079c74ec5Matt Turnerstatic INLINE unsigned long
109b7a81b6e511c03876c852d049befa50079c74ec5Matt Turneru_thread_self(void)
110b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner{
111b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner   return (unsigned long) pthread_self();
112b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner}
113b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner
114b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner
115b7a81b6e511c03876c852d049befa50079c74ec5Matt Turnerstatic INLINE void
116b7a81b6e511c03876c852d049befa50079c74ec5Matt Turneru_tsd_init(struct u_tsd *tsd)
117b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner{
118b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner   if (pthread_key_create(&tsd->key, NULL/*free*/) != 0) {
119b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner      perror(INIT_TSD_ERROR);
120b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner      exit(-1);
121b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner   }
122b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner   tsd->initMagic = INIT_MAGIC;
123b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner}
124b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner
125b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner
126b7a81b6e511c03876c852d049befa50079c74ec5Matt Turnerstatic INLINE void *
127b7a81b6e511c03876c852d049befa50079c74ec5Matt Turneru_tsd_get(struct u_tsd *tsd)
128b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner{
1296549e721addc8fdf6b44450bf40ca14052a7745dJosé Fonseca   if (tsd->initMagic != INIT_MAGIC) {
130b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner      u_tsd_init(tsd);
131b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner   }
132b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner   return pthread_getspecific(tsd->key);
133b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner}
134b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner
135b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner
136b7a81b6e511c03876c852d049befa50079c74ec5Matt Turnerstatic INLINE void
137b7a81b6e511c03876c852d049befa50079c74ec5Matt Turneru_tsd_set(struct u_tsd *tsd, void *ptr)
138b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner{
1396549e721addc8fdf6b44450bf40ca14052a7745dJosé Fonseca   if (tsd->initMagic != INIT_MAGIC) {
140b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner      u_tsd_init(tsd);
141b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner   }
142b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner   if (pthread_setspecific(tsd->key, ptr) != 0) {
143b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner      perror(SET_TSD_ERROR);
144b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner      exit(-1);
145b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner   }
146b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner}
147b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner
148a2f28ceea22254f09ee37039eec873ccdf689e6cMatt Turner#endif /* HAVE_PTHREAD */
149a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu
150a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu
151a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu/*
152a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu * Windows threads. Should work with Windows NT and 95.
153a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu * IMPORTANT: Link with multithreaded runtime library when THREADS are
154a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu * used!
155a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu */
156e3659329e0b91ea78afe32e231f2f75d3d728af9José Fonseca#ifdef WIN32
157a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu
158a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wustruct u_tsd {
159a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu   DWORD key;
1606549e721addc8fdf6b44450bf40ca14052a7745dJosé Fonseca   unsigned initMagic;
161a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu};
162a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu
163a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wutypedef CRITICAL_SECTION u_mutex;
164a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu
1655065d3327617977c93e5ced5eefafc8f62310012José Fonseca/* http://locklessinc.com/articles/pthreads_on_windows/ */
166a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu#define u_mutex_declare_static(name) \
167b531b01b707370df2cf013fc18c70eda62f5b4beJosé Fonseca   static u_mutex name = {(PCRITICAL_SECTION_DEBUG)-1, -1, 0, 0, 0, 0}
168a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu
169a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu#define u_mutex_init(name)    InitializeCriticalSection(&name)
170a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu#define u_mutex_destroy(name) DeleteCriticalSection(&name)
171a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu#define u_mutex_lock(name)    EnterCriticalSection(&name)
172a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu#define u_mutex_unlock(name)  LeaveCriticalSection(&name)
173a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu
174b7a81b6e511c03876c852d049befa50079c74ec5Matt Turnerstatic INLINE unsigned long
175b7a81b6e511c03876c852d049befa50079c74ec5Matt Turneru_thread_self(void)
176b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner{
177b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner   return GetCurrentThreadId();
178b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner}
179b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner
180b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner
181b7a81b6e511c03876c852d049befa50079c74ec5Matt Turnerstatic INLINE void
182b7a81b6e511c03876c852d049befa50079c74ec5Matt Turneru_tsd_init(struct u_tsd *tsd)
183b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner{
184b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner   tsd->key = TlsAlloc();
185b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner   if (tsd->key == TLS_OUT_OF_INDEXES) {
186b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner      perror(INIT_TSD_ERROR);
187b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner      exit(-1);
188b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner   }
189b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner   tsd->initMagic = INIT_MAGIC;
190b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner}
191b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner
192b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner
193b7a81b6e511c03876c852d049befa50079c74ec5Matt Turnerstatic INLINE void
194b7a81b6e511c03876c852d049befa50079c74ec5Matt Turneru_tsd_destroy(struct u_tsd *tsd)
195b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner{
196b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner   if (tsd->initMagic != INIT_MAGIC) {
197b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner      return;
198b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner   }
199b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner   TlsFree(tsd->key);
200b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner   tsd->initMagic = 0x0;
201b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner}
202b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner
203b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner
204b7a81b6e511c03876c852d049befa50079c74ec5Matt Turnerstatic INLINE void *
205b7a81b6e511c03876c852d049befa50079c74ec5Matt Turneru_tsd_get(struct u_tsd *tsd)
206b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner{
207b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner   if (tsd->initMagic != INIT_MAGIC) {
208b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner      u_tsd_init(tsd);
209b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner   }
210b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner   return TlsGetValue(tsd->key);
211b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner}
212b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner
213b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner
214b7a81b6e511c03876c852d049befa50079c74ec5Matt Turnerstatic INLINE void
215b7a81b6e511c03876c852d049befa50079c74ec5Matt Turneru_tsd_set(struct u_tsd *tsd, void *ptr)
216b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner{
217b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner   /* the following code assumes that the struct u_tsd has been initialized
218b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner      to zero at creation */
219b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner   if (tsd->initMagic != INIT_MAGIC) {
220b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner      u_tsd_init(tsd);
221b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner   }
222b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner   if (TlsSetValue(tsd->key, ptr) == 0) {
223b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner      perror(SET_TSD_ERROR);
224b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner      exit(-1);
225b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner   }
226b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner}
227b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner
228e3659329e0b91ea78afe32e231f2f75d3d728af9José Fonseca#endif /* WIN32 */
229a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu
230a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu
231a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu/*
232a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu * THREADS not defined
233a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu */
234a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu#ifndef THREADS
235a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu
236a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wustruct u_tsd {
2376549e721addc8fdf6b44450bf40ca14052a7745dJosé Fonseca   unsigned initMagic;
238a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu};
239a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu
240a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wutypedef unsigned u_mutex;
241a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu
242a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu#define u_mutex_declare_static(name)   static u_mutex name = 0
243a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu#define u_mutex_init(name)             (void) name
244a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu#define u_mutex_destroy(name)          (void) name
245a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu#define u_mutex_lock(name)             (void) name
246a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu#define u_mutex_unlock(name)           (void) name
247a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu
248b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner/*
249b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner * no-op functions
250b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner */
251b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner
252b7a81b6e511c03876c852d049befa50079c74ec5Matt Turnerstatic INLINE unsigned long
253b7a81b6e511c03876c852d049befa50079c74ec5Matt Turneru_thread_self(void)
254b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner{
255b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner   return 0;
256b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner}
257a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu
258a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu
259b7a81b6e511c03876c852d049befa50079c74ec5Matt Turnerstatic INLINE void
260b7a81b6e511c03876c852d049befa50079c74ec5Matt Turneru_tsd_init(struct u_tsd *tsd)
261b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner{
262b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner   (void) tsd;
263b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner}
264a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu
265a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu
266b7a81b6e511c03876c852d049befa50079c74ec5Matt Turnerstatic INLINE void *
267b7a81b6e511c03876c852d049befa50079c74ec5Matt Turneru_tsd_get(struct u_tsd *tsd)
268b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner{
269b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner   (void) tsd;
270b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner   return NULL;
271b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner}
272a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu
273a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu
274b7a81b6e511c03876c852d049befa50079c74ec5Matt Turnerstatic INLINE void
275b7a81b6e511c03876c852d049befa50079c74ec5Matt Turneru_tsd_set(struct u_tsd *tsd, void *ptr)
276b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner{
277b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner   (void) tsd;
278b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner   (void) ptr;
279b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner}
280b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner#endif /* THREADS */
281a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu
28263e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca
28363e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca#ifdef __cplusplus
28463e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca}
28563e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca#endif
28663e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca
287a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu#endif /* _U_THREAD_H_ */
288