u_thread.h revision b7a81b6e511c03876c852d049befa50079c74ec5
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 4963e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca#if defined(PTHREADS) 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 5663e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca#if defined(PTHREADS) || 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 */ 91a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu#if defined(PTHREADS) 92a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu 93a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wustruct u_tsd { 94a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu pthread_key_t key; 95a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu int 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{ 129b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner if (tsd->initMagic != (int) 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{ 139b7a81b6e511c03876c852d049befa50079c74ec5Matt Turner if (tsd->initMagic != (int) 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 148a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu#endif /* PTHREADS */ 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; 160a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu int 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 { 237a73c6540d9a7f6e26d8568ba2fc522cb865f0a6cChia-I Wu int 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