1ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * threads.c: set of generic threading related routines 3ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * See Copyright for the status of this software. 5ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Gary Pennington <Gary.Pennington@uk.sun.com> 7ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * daniel@veillard.com 8ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 9ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 10ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IN_LIBXML 11ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "libxml.h" 12ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 13ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <string.h> 14ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 15ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/threads.h> 16ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/globals.h> 17ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 18ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_SYS_TYPES_H 19ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <sys/types.h> 20ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 21ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_UNISTD_H 22ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <unistd.h> 23ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 24ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_STDLIB_H 25ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <stdlib.h> 26ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 27ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 28ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <pthread.h> 29df143a5041f03a22808b59c76698770b74692815Selim Gurun#elif defined HAVE_WIN32_THREADS 30ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <windows.h> 31ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef HAVE_COMPILER_TLS 32ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <process.h> 33ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 34ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 35ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 36ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_BEOS_THREADS 37ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <OS.h> 38ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <TLS.h> 39ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 40ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 41ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(SOLARIS) 42ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <note.h> 43ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 44ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 45ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define DEBUG_THREADS */ 46ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 47ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 48ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 49ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int libxml_is_threaded = -1; 50ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef __GNUC__ 51ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef linux 52ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || (__GNUC__ > 3) 53ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectextern int pthread_once (pthread_once_t *__once_control, 54ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void (*__init_routine) (void)) 55ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __attribute((weak)); 56ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectextern void *pthread_getspecific (pthread_key_t __key) 57ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __attribute((weak)); 58ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectextern int pthread_setspecific (pthread_key_t __key, 59ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __const void *__pointer) 60ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __attribute((weak)); 61ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectextern int pthread_key_create (pthread_key_t *__key, 62ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void (*__destr_function) (void *)) 63ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __attribute((weak)); 6460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottextern int pthread_key_delete (pthread_key_t __key) 6560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott __attribute((weak)); 66ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectextern int pthread_mutex_init () 67ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __attribute((weak)); 68ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectextern int pthread_mutex_destroy () 69ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __attribute((weak)); 70ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectextern int pthread_mutex_lock () 71ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __attribute((weak)); 72ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectextern int pthread_mutex_unlock () 73ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __attribute((weak)); 74ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectextern int pthread_cond_init () 75ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __attribute((weak)); 7660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottextern int pthread_cond_destroy () 7760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott __attribute((weak)); 7860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottextern int pthread_cond_wait () 7960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott __attribute((weak)); 80ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectextern int pthread_equal () 81ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __attribute((weak)); 82ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectextern pthread_t pthread_self () 83ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __attribute((weak)); 84ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectextern int pthread_key_create () 85ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __attribute((weak)); 8660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottextern int pthread_key_delete () 8760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott __attribute((weak)); 88ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectextern int pthread_cond_signal () 89ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __attribute((weak)); 90ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 91ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* linux */ 92ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* __GNUC__ */ 93ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* HAVE_PTHREAD_H */ 94ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 95ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 96ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: this module still uses malloc/free and not xmlMalloc/xmlFree 97ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to avoid some crazyness since xmlMalloc/xmlFree may actually 98ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * be hosted on allocated blocks needing them for the allocation ... 99ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlMutex are a simple mutual exception locks 103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlMutex { 105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pthread_mutex_t lock; 107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_WIN32_THREADS 108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project HANDLE mutex; 109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_BEOS_THREADS 11060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott sem_id sem; 11160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott thread_id tid; 112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int empty; 114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRMutex are reentrant mutual exception locks 119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRMutex { 121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pthread_mutex_t lock; 12360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott unsigned int held; 12460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott unsigned int waiters; 12560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott pthread_t tid; 12660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott pthread_cond_t cv; 127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_WIN32_THREADS 128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CRITICAL_SECTION cs; 129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned int count; 130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_BEOS_THREADS 13160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlMutexPtr lock; 13260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott thread_id tid; 13360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott int32 count; 134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int empty; 136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 13860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This module still has some internal static data. 141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - xmlLibraryLock a global lock 142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - globalkey used for per-thread data 143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 14660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottstatic pthread_key_t globalkey; 14760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottstatic pthread_t mainthread; 148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic pthread_once_t once_control = PTHREAD_ONCE_INIT; 149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic pthread_mutex_t global_init_lock = PTHREAD_MUTEX_INITIALIZER; 150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_WIN32_THREADS 151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(HAVE_COMPILER_TLS) 152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic __declspec(thread) xmlGlobalState tlstate; 153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic __declspec(thread) int tlstate_inited = 0; 154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else /* HAVE_COMPILER_TLS */ 155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic DWORD globalkey = TLS_OUT_OF_INDEXES; 156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* HAVE_COMPILER_TLS */ 157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic DWORD mainthread; 15860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottstatic struct { 159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DWORD done; 160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DWORD control; 16160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott} run_once = { 0, 0}; 162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic volatile LPCRITICAL_SECTION global_init_lock = NULL; 16360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* endif HAVE_WIN32_THREADS */ 165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_BEOS_THREADS 166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint32 globalkey = 0; 167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectthread_id mainthread = 0; 168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint32 run_once_init = 0; 169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int32 global_init_lock = -1; 170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic vint32 global_init_count = 0; 171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 17360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottstatic xmlRMutexPtr xmlLibraryLock = NULL; 17460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_THREAD_ENABLED 176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlOnceInit(void); 177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNewMutex: 181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNewMutex() is used to allocate a libxml2 token struct for use in 183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * synchronizing access to data. 184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a new simple mutex pointer or NULL in case of error 186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlMutexPtr 188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNewMutex(void) 189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlMutexPtr tok; 191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((tok = malloc(sizeof(xmlMutex))) == NULL) 193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (libxml_is_threaded != 0) 19660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott pthread_mutex_init(&tok->lock, NULL); 197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_WIN32_THREADS 198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tok->mutex = CreateMutex(NULL, FALSE, NULL); 199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_BEOS_THREADS 20060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if ((tok->sem = create_sem(1, "xmlMutex")) < B_OK) { 20160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott free(tok); 20260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return NULL; 20360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 20460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott tok->tid = -1; 205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (tok); 207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFreeMutex: 211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @tok: the simple mutex 212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFreeMutex() is used to reclaim resources associated with a libxml2 token 214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * struct. 215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFreeMutex(xmlMutexPtr tok) 218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 21960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (tok == NULL) 22060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return; 221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (libxml_is_threaded != 0) 22460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott pthread_mutex_destroy(&tok->lock); 225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_WIN32_THREADS 226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CloseHandle(tok->mutex); 227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_BEOS_THREADS 22860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott delete_sem(tok->sem); 229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project free(tok); 231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlMutexLock: 235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @tok: the simple mutex 236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlMutexLock() is used to lock a libxml2 token. 238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlMutexLock(xmlMutexPtr tok) 241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tok == NULL) 243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (libxml_is_threaded != 0) 24660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott pthread_mutex_lock(&tok->lock); 247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_WIN32_THREADS 248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project WaitForSingleObject(tok->mutex, INFINITE); 249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_BEOS_THREADS 25060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (acquire_sem(tok->sem) != B_NO_ERROR) { 251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_THREADS 25260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlGenericError(xmlGenericErrorContext, 25360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott "xmlMutexLock():BeOS:Couldn't aquire semaphore\n"); 25460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott exit(); 255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 25660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 25760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott tok->tid = find_thread(NULL); 258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlMutexUnlock: 264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @tok: the simple mutex 265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlMutexUnlock() is used to unlock a libxml2 token. 267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlMutexUnlock(xmlMutexPtr tok) 270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tok == NULL) 272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (libxml_is_threaded != 0) 27560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott pthread_mutex_unlock(&tok->lock); 276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_WIN32_THREADS 277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ReleaseMutex(tok->mutex); 278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_BEOS_THREADS 27960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (tok->tid == find_thread(NULL)) { 28060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott tok->tid = -1; 28160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott release_sem(tok->sem); 28260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNewRMutex: 288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRNewMutex() is used to allocate a reentrant mutex for use in 290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * synchronizing access to data. token_r is a re-entrant lock and thus useful 291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * for synchronizing access to data structures that may be manipulated in a 292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * recursive fashion. 293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new reentrant mutex pointer or NULL in case of error 295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRMutexPtr 297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNewRMutex(void) 298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRMutexPtr tok; 300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((tok = malloc(sizeof(xmlRMutex))) == NULL) 302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (libxml_is_threaded != 0) { 30560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott pthread_mutex_init(&tok->lock, NULL); 30660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott tok->held = 0; 30760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott tok->waiters = 0; 30860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott pthread_cond_init(&tok->cv, NULL); 309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_WIN32_THREADS 311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project InitializeCriticalSection(&tok->cs); 312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tok->count = 0; 313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_BEOS_THREADS 31460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if ((tok->lock = xmlNewMutex()) == NULL) { 31560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott free(tok); 31660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return NULL; 31760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 31860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott tok->count = 0; 319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (tok); 321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFreeRMutex: 325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @tok: the reentrant mutex 326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRFreeMutex() is used to reclaim resources associated with a 328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * reentrant mutex. 329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFreeRMutex(xmlRMutexPtr tok ATTRIBUTE_UNUSED) 332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tok == NULL) 334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (libxml_is_threaded != 0) { 33760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott pthread_mutex_destroy(&tok->lock); 33860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott pthread_cond_destroy(&tok->cv); 339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_WIN32_THREADS 341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DeleteCriticalSection(&tok->cs); 342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_BEOS_THREADS 34360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlFreeMutex(tok->lock); 344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project free(tok); 346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRMutexLock: 350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @tok: the reentrant mutex 351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRMutexLock() is used to lock a libxml2 token_r. 353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRMutexLock(xmlRMutexPtr tok) 356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tok == NULL) 358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (libxml_is_threaded == 0) 361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pthread_mutex_lock(&tok->lock); 364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tok->held) { 365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (pthread_equal(tok->tid, pthread_self())) { 366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tok->held++; 367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pthread_mutex_unlock(&tok->lock); 368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tok->waiters++; 371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (tok->held) 372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pthread_cond_wait(&tok->cv, &tok->lock); 373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tok->waiters--; 374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tok->tid = pthread_self(); 377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tok->held = 1; 378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pthread_mutex_unlock(&tok->lock); 379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_WIN32_THREADS 380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project EnterCriticalSection(&tok->cs); 381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ++tok->count; 382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_BEOS_THREADS 38360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (tok->lock->tid == find_thread(NULL)) { 38460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott tok->count++; 38560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return; 38660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } else { 38760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlMutexLock(tok->lock); 38860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott tok->count = 1; 38960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRMutexUnlock: 395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @tok: the reentrant mutex 396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRMutexUnlock() is used to unlock a libxml2 token_r. 398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRMutexUnlock(xmlRMutexPtr tok ATTRIBUTE_UNUSED) 401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tok == NULL) 403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (libxml_is_threaded == 0) 406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 40760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pthread_mutex_lock(&tok->lock); 409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tok->held--; 410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tok->held == 0) { 411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tok->waiters) 412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pthread_cond_signal(&tok->cv); 413df143a5041f03a22808b59c76698770b74692815Selim Gurun memset(&tok->tid, 0, sizeof(tok->tid)); 414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pthread_mutex_unlock(&tok->lock); 416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_WIN32_THREADS 41760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (!--tok->count) 41860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott LeaveCriticalSection(&tok->cs); 419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_BEOS_THREADS 42060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (tok->lock->tid == find_thread(NULL)) { 42160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott tok->count--; 42260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (tok->count == 0) { 42360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlMutexUnlock(tok->lock); 42460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 42560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return; 42660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGlobalInitMutexLock 432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Makes sure that the global initialization mutex is initialized and 434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * locks it. 435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project__xmlGlobalInitMutexLock(void) 438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Make sure the global init lock is initialized and then lock it. */ 440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* The mutex is statically initialized, so we just lock it. */ 442df143a5041f03a22808b59c76698770b74692815Selim Gurun if (pthread_mutex_lock) 443df143a5041f03a22808b59c76698770b74692815Selim Gurun pthread_mutex_lock(&global_init_lock); 444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_WIN32_THREADS 445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project LPCRITICAL_SECTION cs; 446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Create a new critical section */ 448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (global_init_lock == NULL) { 44960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott cs = malloc(sizeof(CRITICAL_SECTION)); 45060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (cs == NULL) { 45160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlGenericError(xmlGenericErrorContext, 45260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott "xmlGlobalInitMutexLock: out of memory\n"); 45360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return; 45460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 45560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott InitializeCriticalSection(cs); 456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 45760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott /* Swap it into the global_init_lock */ 458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef InterlockedCompareExchangePointer 45960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott InterlockedCompareExchangePointer(&global_init_lock, cs, NULL); 46060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#else /* Use older void* version */ 46160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott InterlockedCompareExchange((void **) &global_init_lock, 46260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (void *) cs, NULL); 463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* InterlockedCompareExchangePointer */ 464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 46560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott /* If another thread successfully recorded its critical 46660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * section in the global_init_lock then discard the one 46760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * allocated by this thread. */ 46860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (global_init_lock != cs) { 46960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott DeleteCriticalSection(cs); 47060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott free(cs); 47160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Lock the chosen critical section */ 475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project EnterCriticalSection(global_init_lock); 476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_BEOS_THREADS 477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int32 sem; 478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Allocate a new semaphore */ 480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sem = create_sem(1, "xmlGlobalinitMutex"); 481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (global_init_lock == -1) { 48360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (atomic_add(&global_init_count, 1) == 0) { 48460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott global_init_lock = sem; 48560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } else { 48660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott snooze(1); 48760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott atomic_add(&global_init_count, -1); 48860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* If another thread successfully recorded its critical 492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * section in the global_init_lock then discard the one 493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * allocated by this thread. */ 494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (global_init_lock != sem) 49560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott delete_sem(sem); 496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Acquire the chosen semaphore */ 498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (acquire_sem(global_init_lock) != B_NO_ERROR) { 499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_THREADS 50060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlGenericError(xmlGenericErrorContext, 50160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott "xmlGlobalInitMutexLock():BeOS:Couldn't acquire semaphore\n"); 50260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott exit(); 503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project__xmlGlobalInitMutexUnlock(void) 510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 512df143a5041f03a22808b59c76698770b74692815Selim Gurun if (pthread_mutex_unlock) 513df143a5041f03a22808b59c76698770b74692815Selim Gurun pthread_mutex_unlock(&global_init_lock); 514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_WIN32_THREADS 51560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (global_init_lock != NULL) { 51660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott LeaveCriticalSection(global_init_lock); 51760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_BEOS_THREADS 519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project release_sem(global_init_lock); 520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGlobalInitMutexDestroy 525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Makes sure that the global initialization mutex is destroyed before 527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * application termination. 528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 52960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottvoid 53060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott__xmlGlobalInitMutexDestroy(void) 531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 532df143a5041f03a22808b59c76698770b74692815Selim Gurun#ifdef HAVE_PTHREAD_H 533df143a5041f03a22808b59c76698770b74692815Selim Gurun#elif defined HAVE_WIN32_THREADS 53460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (global_init_lock != NULL) { 53560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott DeleteCriticalSection(global_init_lock); 53660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott free(global_init_lock); 53760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott global_init_lock = NULL; 538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Per thread global state handling * 545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_THREAD_ENABLED 549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef xmlLastError 550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#undef xmlLastError 551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 55260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFreeGlobalState: 555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @state: a thread global state 556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFreeGlobalState() is called when a thread terminates with a non-NULL 558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * global state. It is is used here to reclaim memory resources. 559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFreeGlobalState(void *state) 562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGlobalState *gs = (xmlGlobalState *) state; 564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* free any memory allocated in the thread's xmlLastError */ 566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlResetError(&(gs->xmlLastError)); 567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project free(state); 568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNewGlobalState: 572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNewGlobalState() allocates a global state. This structure is used to 574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * hold all data for use by a thread when supporting backwards compatibility 575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of libxml2 to pre-thread-safe behaviour. 576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly allocated xmlGlobalStatePtr or NULL in case of error 578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlGlobalStatePtr 580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNewGlobalState(void) 581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGlobalState *gs; 58360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project gs = malloc(sizeof(xmlGlobalState)); 58560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (gs == NULL) { 58660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlGenericError(xmlGenericErrorContext, 58760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott "xmlGetGlobalState: out of memory\n"); 58860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return (NULL); 58960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(gs, 0, sizeof(xmlGlobalState)); 592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlInitializeGlobalState(gs); 593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (gs); 594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_THREAD_ENABLED */ 596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 597df143a5041f03a22808b59c76698770b74692815Selim Gurun#ifdef HAVE_PTHREAD_H 598df143a5041f03a22808b59c76698770b74692815Selim Gurun#elif defined HAVE_WIN32_THREADS 599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if !defined(HAVE_COMPILER_TLS) 600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(LIBXML_STATIC) && !defined(LIBXML_STATIC_FOR_DLL) 60160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scotttypedef struct _xmlGlobalStateCleanupHelperParams { 602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project HANDLE thread; 603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *memory; 604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlGlobalStateCleanupHelperParams; 605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 60660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottstatic void XMLCDECL 60760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlGlobalStateCleanupHelper(void *p) 608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 60960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlGlobalStateCleanupHelperParams *params = 61060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (xmlGlobalStateCleanupHelperParams *) p; 611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project WaitForSingleObject(params->thread, INFINITE); 612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CloseHandle(params->thread); 613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeGlobalState(params->memory); 614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project free(params); 615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project _endthread(); 616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else /* LIBXML_STATIC && !LIBXML_STATIC_FOR_DLL */ 618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 61960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scotttypedef struct _xmlGlobalStateCleanupHelperParams { 620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *memory; 62160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott struct _xmlGlobalStateCleanupHelperParams *prev; 62260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott struct _xmlGlobalStateCleanupHelperParams *next; 623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlGlobalStateCleanupHelperParams; 624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 62560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottstatic xmlGlobalStateCleanupHelperParams *cleanup_helpers_head = NULL; 626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic CRITICAL_SECTION cleanup_helpers_cs; 627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXMLSTATIC && !LIBXML_STATIC_FOR_DLL */ 629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* HAVE_COMPILER_TLS */ 630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* HAVE_WIN32_THREADS */ 631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined HAVE_BEOS_THREADS 63360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGlobalStateCleanup: 636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: unused parameter 637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Used for Beos only 639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 64060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottvoid 64160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlGlobalStateCleanup(void *data) 642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 64360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott void *globalval = tls_get(globalkey); 64460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 64560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (globalval != NULL) 64660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlFreeGlobalState(globalval); 647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGetGlobalState: 652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGetGlobalState() is called to retrieve the global state for a thread. 654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the thread global state or NULL in case of error 656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlGlobalStatePtr 658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlGetGlobalState(void) 659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGlobalState *globalval; 662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (libxml_is_threaded == 0) 66460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return (NULL); 665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pthread_once(&once_control, xmlOnceInit); 667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((globalval = (xmlGlobalState *) 66960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott pthread_getspecific(globalkey)) == NULL) { 670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGlobalState *tsd = xmlNewGlobalState(); 67160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (tsd == NULL) 67260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(NULL); 673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pthread_setspecific(globalkey, tsd); 675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (tsd); 676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (globalval); 678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_WIN32_THREADS 679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(HAVE_COMPILER_TLS) 680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!tlstate_inited) { 68160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott tlstate_inited = 1; 68260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlInitializeGlobalState(&tlstate); 683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return &tlstate; 685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else /* HAVE_COMPILER_TLS */ 686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGlobalState *globalval; 68760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlGlobalStateCleanupHelperParams *p; 688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOnceInit(); 690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(LIBXML_STATIC) && !defined(LIBXML_STATIC_FOR_DLL) 69160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott globalval = (xmlGlobalState *) TlsGetValue(globalkey); 692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 69360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott p = (xmlGlobalStateCleanupHelperParams *) TlsGetValue(globalkey); 69460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott globalval = (xmlGlobalState *) (p ? p->memory : NULL); 695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (globalval == NULL) { 69760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlGlobalState *tsd = xmlNewGlobalState(); 69860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 69960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (tsd == NULL) 70060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(NULL); 70160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott p = (xmlGlobalStateCleanupHelperParams *) 70260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott malloc(sizeof(xmlGlobalStateCleanupHelperParams)); 70360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (p == NULL) { 70460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlGenericError(xmlGenericErrorContext, 70560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott "xmlGetGlobalState: out of memory\n"); 70660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlFreeGlobalState(tsd); 70760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(NULL); 70860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 70960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott p->memory = tsd; 710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(LIBXML_STATIC) && !defined(LIBXML_STATIC_FOR_DLL) 71160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott DuplicateHandle(GetCurrentProcess(), GetCurrentThread(), 71260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott GetCurrentProcess(), &p->thread, 0, TRUE, 71360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott DUPLICATE_SAME_ACCESS); 71460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott TlsSetValue(globalkey, tsd); 71560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott _beginthread(xmlGlobalStateCleanupHelper, 0, p); 716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 71760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott EnterCriticalSection(&cleanup_helpers_cs); 718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cleanup_helpers_head != NULL) { 719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cleanup_helpers_head->prev = p; 720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 72160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott p->next = cleanup_helpers_head; 72260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott p->prev = NULL; 72360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott cleanup_helpers_head = p; 72460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott TlsSetValue(globalkey, p); 72560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott LeaveCriticalSection(&cleanup_helpers_cs); 726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 72860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return (tsd); 729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (globalval); 731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* HAVE_COMPILER_TLS */ 732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_BEOS_THREADS 733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGlobalState *globalval; 734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOnceInit(); 736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 73760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if ((globalval = (xmlGlobalState *) tls_get(globalkey)) == NULL) { 738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGlobalState *tsd = xmlNewGlobalState(); 73960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (tsd == NULL) 74060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return (NULL); 741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tls_set(globalkey, tsd); 743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project on_exit_thread(xmlGlobalStateCleanup, NULL); 744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (tsd); 745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (globalval); 747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 74860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return (NULL); 749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Library wide thread interfaces * 755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGetThreadId: 760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGetThreadId() find the current thread ID number 762df143a5041f03a22808b59c76698770b74692815Selim Gurun * Note that this is likely to be broken on some platforms using pthreads 763df143a5041f03a22808b59c76698770b74692815Selim Gurun * as the specification doesn't mandate pthread_t to be an integer type 764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the current thread ID number 766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlGetThreadId(void) 769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 771df143a5041f03a22808b59c76698770b74692815Selim Gurun pthread_t id; 772df143a5041f03a22808b59c76698770b74692815Selim Gurun int ret; 773df143a5041f03a22808b59c76698770b74692815Selim Gurun 774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (libxml_is_threaded == 0) 77560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return (0); 776df143a5041f03a22808b59c76698770b74692815Selim Gurun id = pthread_self(); 777df143a5041f03a22808b59c76698770b74692815Selim Gurun /* horrible but preserves compat, see warning above */ 778df143a5041f03a22808b59c76698770b74692815Selim Gurun memcpy(&ret, &id, sizeof(ret)); 779df143a5041f03a22808b59c76698770b74692815Selim Gurun return (ret); 780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_WIN32_THREADS 781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return GetCurrentThreadId(); 782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_BEOS_THREADS 78360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return find_thread(NULL); 784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 78560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return ((int) 0); 786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlIsMainThread: 791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlIsMainThread() check whether the current thread is the main thread. 793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if the current thread is the main thread, 0 otherwise 795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlIsMainThread(void) 798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (libxml_is_threaded == -1) 801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlInitThreads(); 802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (libxml_is_threaded == 0) 80360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return (1); 804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pthread_once(&once_control, xmlOnceInit); 805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_WIN32_THREADS 80660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlOnceInit(); 807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_BEOS_THREADS 808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOnceInit(); 809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 81060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_THREADS 812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "xmlIsMainThread()\n"); 813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 815df143a5041f03a22808b59c76698770b74692815Selim Gurun return (pthread_equal(mainthread,pthread_self())); 816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_WIN32_THREADS 81760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return (mainthread == GetCurrentThreadId()); 818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_BEOS_THREADS 81960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return (mainthread == find_thread(NULL)); 820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 82160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return (1); 822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlLockLibrary: 827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlLockLibrary() is used to take out a re-entrant lock on the libxml2 829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * library. 830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlLockLibrary(void) 833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_THREADS 835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "xmlLockLibrary()\n"); 836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRMutexLock(xmlLibraryLock); 838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlUnlockLibrary: 842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlUnlockLibrary() is used to release a re-entrant lock on the libxml2 844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * library. 845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlUnlockLibrary(void) 848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_THREADS 850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "xmlUnlockLibrary()\n"); 851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRMutexUnlock(xmlLibraryLock); 853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlInitThreads: 857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlInitThreads() is used to to initialize all the thread related 859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * data of the libxml2 library. 860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlInitThreads(void) 863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (libxml_is_threaded == -1) { 866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((pthread_once != NULL) && 86760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (pthread_getspecific != NULL) && 86860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (pthread_setspecific != NULL) && 86960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (pthread_key_create != NULL) && 87060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (pthread_key_delete != NULL) && 87160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (pthread_mutex_init != NULL) && 87260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (pthread_mutex_destroy != NULL) && 87360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (pthread_mutex_lock != NULL) && 87460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (pthread_mutex_unlock != NULL) && 87560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (pthread_cond_init != NULL) && 87660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (pthread_cond_destroy != NULL) && 87760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (pthread_cond_wait != NULL) && 87860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (pthread_equal != NULL) && 87960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (pthread_self != NULL) && 88060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (pthread_cond_signal != NULL)) { 88160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott libxml_is_threaded = 1; 88260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* fprintf(stderr, "Running multithreaded\n"); */ 88460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } else { 88560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* fprintf(stderr, "Running without multithread\n"); */ 88760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott libxml_is_threaded = 0; 88860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 890df143a5041f03a22808b59c76698770b74692815Selim Gurun#elif defined(HAVE_WIN32_THREADS) && !defined(HAVE_COMPILER_TLS) && (!defined(LIBXML_STATIC) || defined(LIBXML_STATIC_FOR_DLL)) 891df143a5041f03a22808b59c76698770b74692815Selim Gurun InitializeCriticalSection(&cleanup_helpers_cs); 892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlCleanupThreads: 897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlCleanupThreads() is used to to cleanup all the thread related 899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * data of the libxml2 library once processing has ended. 900df143a5041f03a22808b59c76698770b74692815Selim Gurun * 901df143a5041f03a22808b59c76698770b74692815Selim Gurun * WARNING: if your application is multithreaded or has plugin support 902df143a5041f03a22808b59c76698770b74692815Selim Gurun * calling this may crash the application if another thread or 903df143a5041f03a22808b59c76698770b74692815Selim Gurun * a plugin is still using libxml2. It's sometimes very hard to 904df143a5041f03a22808b59c76698770b74692815Selim Gurun * guess if libxml2 is in use in the application, some libraries 905df143a5041f03a22808b59c76698770b74692815Selim Gurun * or plugins may use it without notice. In case of doubt abstain 906df143a5041f03a22808b59c76698770b74692815Selim Gurun * from calling this function or do it just before calling exit() 907df143a5041f03a22808b59c76698770b74692815Selim Gurun * to avoid leak reports from valgrind ! 908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlCleanupThreads(void) 911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_THREADS 913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "xmlCleanupThreads()\n"); 914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 915df143a5041f03a22808b59c76698770b74692815Selim Gurun#ifdef HAVE_PTHREAD_H 916df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((libxml_is_threaded) && (pthread_key_delete != NULL)) 917df143a5041f03a22808b59c76698770b74692815Selim Gurun pthread_key_delete(globalkey); 918df143a5041f03a22808b59c76698770b74692815Selim Gurun#elif defined(HAVE_WIN32_THREADS) && !defined(HAVE_COMPILER_TLS) && (!defined(LIBXML_STATIC) || defined(LIBXML_STATIC_FOR_DLL)) 919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (globalkey != TLS_OUT_OF_INDEXES) { 92060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlGlobalStateCleanupHelperParams *p; 92160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 92260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott EnterCriticalSection(&cleanup_helpers_cs); 92360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott p = cleanup_helpers_head; 92460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott while (p != NULL) { 92560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlGlobalStateCleanupHelperParams *temp = p; 92660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 92760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott p = p->next; 92860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlFreeGlobalState(temp->memory); 92960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott free(temp); 93060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 93160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott cleanup_helpers_head = 0; 93260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott LeaveCriticalSection(&cleanup_helpers_cs); 93360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott TlsFree(globalkey); 93460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott globalkey = TLS_OUT_OF_INDEXES; 935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DeleteCriticalSection(&cleanup_helpers_cs); 937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_THREAD_ENABLED 94160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlOnceInit 944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlOnceInit() is used to initialize the value of mainthread for use 946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in other routines. This function should only be called using 947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * pthread_once() in association with the once_control variable to ensure 948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * that the function is only called once. See man pthread_once for more 949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * details. 950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 95260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlOnceInit(void) 95360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott{ 954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (void) pthread_key_create(&globalkey, xmlFreeGlobalState); 956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mainthread = pthread_self(); 957df143a5041f03a22808b59c76698770b74692815Selim Gurun#elif defined(HAVE_WIN32_THREADS) 958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!run_once.done) { 95960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (InterlockedIncrement(&run_once.control) == 1) { 960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if !defined(HAVE_COMPILER_TLS) 961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project globalkey = TlsAlloc(); 962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mainthread = GetCurrentThreadId(); 964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project run_once.done = 1; 96560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } else { 966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Another thread is working; give up our slice and 967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * wait until they're done. */ 968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (!run_once.done) 969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project Sleep(0); 970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 972df143a5041f03a22808b59c76698770b74692815Selim Gurun#elif defined HAVE_BEOS_THREADS 97360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (atomic_add(&run_once_init, 1) == 0) { 97460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott globalkey = tls_allocate(); 97560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott tls_set(globalkey, NULL); 97660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott mainthread = find_thread(NULL); 97760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } else 97860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott atomic_add(&run_once_init, -1); 979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * DllMain: 985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @hinstDLL: handle to DLL instance 986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @fdwReason: Reason code for entry 987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @lpvReserved: generic pointer (depends upon reason code) 988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Entry point for Windows library. It is being used to free thread-specific 990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * storage. 991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns TRUE always 993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 994df143a5041f03a22808b59c76698770b74692815Selim Gurun#ifdef HAVE_PTHREAD_H 995df143a5041f03a22808b59c76698770b74692815Selim Gurun#elif defined(HAVE_WIN32_THREADS) && !defined(HAVE_COMPILER_TLS) && (!defined(LIBXML_STATIC) || defined(LIBXML_STATIC_FOR_DLL)) 996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(LIBXML_STATIC_FOR_DLL) 99760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottBOOL XMLCALL 99860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlDllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) 999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 100060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottBOOL WINAPI 100160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottDllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) 1002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 100460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott switch (fdwReason) { 100560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott case DLL_THREAD_DETACH: 100660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (globalkey != TLS_OUT_OF_INDEXES) { 100760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlGlobalState *globalval = NULL; 100860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlGlobalStateCleanupHelperParams *p = 100960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (xmlGlobalStateCleanupHelperParams *) 101060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott TlsGetValue(globalkey); 101160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott globalval = (xmlGlobalState *) (p ? p->memory : NULL); 101260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (globalval) { 101360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlFreeGlobalState(globalval); 101460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott TlsSetValue(globalkey, NULL); 101560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 101660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (p) { 101760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott EnterCriticalSection(&cleanup_helpers_cs); 101860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (p == cleanup_helpers_head) 101960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott cleanup_helpers_head = p->next; 102060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott else 102160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott p->prev->next = p->next; 102260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (p->next != NULL) 102360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott p->next->prev = p->prev; 102460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott LeaveCriticalSection(&cleanup_helpers_cs); 102560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott free(p); 102660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 1027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 102860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott break; 1029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return TRUE; 1031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define bottom_threads 1034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "elfgcchack.h" 1035