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; 14994442ad4107000e6d49f9b85a46a591495a57632Selim Gurunstatic pthread_once_t once_control_init = PTHREAD_ONCE_INIT; 150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic pthread_mutex_t global_init_lock = PTHREAD_MUTEX_INITIALIZER; 151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_WIN32_THREADS 152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(HAVE_COMPILER_TLS) 153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic __declspec(thread) xmlGlobalState tlstate; 154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic __declspec(thread) int tlstate_inited = 0; 155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else /* HAVE_COMPILER_TLS */ 156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic DWORD globalkey = TLS_OUT_OF_INDEXES; 157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* HAVE_COMPILER_TLS */ 158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic DWORD mainthread; 15960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottstatic struct { 160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DWORD done; 161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DWORD control; 16260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott} run_once = { 0, 0}; 163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic volatile LPCRITICAL_SECTION global_init_lock = NULL; 16460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* endif HAVE_WIN32_THREADS */ 166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_BEOS_THREADS 167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint32 globalkey = 0; 168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectthread_id mainthread = 0; 169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint32 run_once_init = 0; 170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int32 global_init_lock = -1; 171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic vint32 global_init_count = 0; 172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 17460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottstatic xmlRMutexPtr xmlLibraryLock = NULL; 17560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_THREAD_ENABLED 177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlOnceInit(void); 178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNewMutex: 182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNewMutex() is used to allocate a libxml2 token struct for use in 184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * synchronizing access to data. 185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a new simple mutex pointer or NULL in case of error 187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlMutexPtr 189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNewMutex(void) 190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlMutexPtr tok; 192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((tok = malloc(sizeof(xmlMutex))) == NULL) 194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (libxml_is_threaded != 0) 19760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott pthread_mutex_init(&tok->lock, NULL); 198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_WIN32_THREADS 199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tok->mutex = CreateMutex(NULL, FALSE, NULL); 200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_BEOS_THREADS 20160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if ((tok->sem = create_sem(1, "xmlMutex")) < B_OK) { 20260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott free(tok); 20360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return NULL; 20460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 20560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott tok->tid = -1; 206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (tok); 208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFreeMutex: 212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @tok: the simple mutex 213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFreeMutex() is used to reclaim resources associated with a libxml2 token 215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * struct. 216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFreeMutex(xmlMutexPtr tok) 219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 22060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (tok == NULL) 22160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return; 222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (libxml_is_threaded != 0) 22560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott pthread_mutex_destroy(&tok->lock); 226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_WIN32_THREADS 227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CloseHandle(tok->mutex); 228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_BEOS_THREADS 22960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott delete_sem(tok->sem); 230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project free(tok); 232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlMutexLock: 236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @tok: the simple mutex 237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlMutexLock() is used to lock a libxml2 token. 239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlMutexLock(xmlMutexPtr tok) 242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tok == NULL) 244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (libxml_is_threaded != 0) 24760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott pthread_mutex_lock(&tok->lock); 248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_WIN32_THREADS 249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project WaitForSingleObject(tok->mutex, INFINITE); 250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_BEOS_THREADS 25160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (acquire_sem(tok->sem) != B_NO_ERROR) { 252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_THREADS 25360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlGenericError(xmlGenericErrorContext, 25460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott "xmlMutexLock():BeOS:Couldn't aquire semaphore\n"); 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. */ 44294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if (pthread_mutex_lock != NULL) 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"); 502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project__xmlGlobalInitMutexUnlock(void) 509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 51194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if (pthread_mutex_unlock != NULL) 512df143a5041f03a22808b59c76698770b74692815Selim Gurun pthread_mutex_unlock(&global_init_lock); 513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_WIN32_THREADS 51460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (global_init_lock != NULL) { 51560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott LeaveCriticalSection(global_init_lock); 51660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_BEOS_THREADS 518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project release_sem(global_init_lock); 519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGlobalInitMutexDestroy 524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Makes sure that the global initialization mutex is destroyed before 526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * application termination. 527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 52860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottvoid 52960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott__xmlGlobalInitMutexDestroy(void) 530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 531df143a5041f03a22808b59c76698770b74692815Selim Gurun#ifdef HAVE_PTHREAD_H 532df143a5041f03a22808b59c76698770b74692815Selim Gurun#elif defined HAVE_WIN32_THREADS 53360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (global_init_lock != NULL) { 53460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott DeleteCriticalSection(global_init_lock); 53560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott free(global_init_lock); 53660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott global_init_lock = NULL; 537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Per thread global state handling * 544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_THREAD_ENABLED 548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef xmlLastError 549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#undef xmlLastError 550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 55160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFreeGlobalState: 554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @state: a thread global state 555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFreeGlobalState() is called when a thread terminates with a non-NULL 557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * global state. It is is used here to reclaim memory resources. 558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFreeGlobalState(void *state) 561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGlobalState *gs = (xmlGlobalState *) state; 563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* free any memory allocated in the thread's xmlLastError */ 565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlResetError(&(gs->xmlLastError)); 566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project free(state); 567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNewGlobalState: 571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNewGlobalState() allocates a global state. This structure is used to 573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * hold all data for use by a thread when supporting backwards compatibility 574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of libxml2 to pre-thread-safe behaviour. 575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly allocated xmlGlobalStatePtr or NULL in case of error 577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlGlobalStatePtr 579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNewGlobalState(void) 580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGlobalState *gs; 58260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project gs = malloc(sizeof(xmlGlobalState)); 58460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (gs == NULL) { 58560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlGenericError(xmlGenericErrorContext, 58660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott "xmlGetGlobalState: out of memory\n"); 58760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return (NULL); 58860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(gs, 0, sizeof(xmlGlobalState)); 591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlInitializeGlobalState(gs); 592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (gs); 593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_THREAD_ENABLED */ 595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 596df143a5041f03a22808b59c76698770b74692815Selim Gurun#ifdef HAVE_PTHREAD_H 597df143a5041f03a22808b59c76698770b74692815Selim Gurun#elif defined HAVE_WIN32_THREADS 598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if !defined(HAVE_COMPILER_TLS) 599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(LIBXML_STATIC) && !defined(LIBXML_STATIC_FOR_DLL) 60060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scotttypedef struct _xmlGlobalStateCleanupHelperParams { 601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project HANDLE thread; 602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *memory; 603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlGlobalStateCleanupHelperParams; 604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 60560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottstatic void XMLCDECL 60660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlGlobalStateCleanupHelper(void *p) 607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 60860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlGlobalStateCleanupHelperParams *params = 60960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (xmlGlobalStateCleanupHelperParams *) p; 610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project WaitForSingleObject(params->thread, INFINITE); 611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CloseHandle(params->thread); 612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeGlobalState(params->memory); 613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project free(params); 614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project _endthread(); 615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else /* LIBXML_STATIC && !LIBXML_STATIC_FOR_DLL */ 617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 61860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scotttypedef struct _xmlGlobalStateCleanupHelperParams { 619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *memory; 62060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott struct _xmlGlobalStateCleanupHelperParams *prev; 62160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott struct _xmlGlobalStateCleanupHelperParams *next; 622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlGlobalStateCleanupHelperParams; 623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 62460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottstatic xmlGlobalStateCleanupHelperParams *cleanup_helpers_head = NULL; 625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic CRITICAL_SECTION cleanup_helpers_cs; 626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXMLSTATIC && !LIBXML_STATIC_FOR_DLL */ 628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* HAVE_COMPILER_TLS */ 629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* HAVE_WIN32_THREADS */ 630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined HAVE_BEOS_THREADS 63260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGlobalStateCleanup: 635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data: unused parameter 636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Used for Beos only 638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 63960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottvoid 64060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlGlobalStateCleanup(void *data) 641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 64260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott void *globalval = tls_get(globalkey); 64360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 64460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (globalval != NULL) 64560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlFreeGlobalState(globalval); 646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGetGlobalState: 651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGetGlobalState() is called to retrieve the global state for a thread. 653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the thread global state or NULL in case of error 655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlGlobalStatePtr 657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlGetGlobalState(void) 658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGlobalState *globalval; 661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (libxml_is_threaded == 0) 66360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return (NULL); 664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pthread_once(&once_control, xmlOnceInit); 666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((globalval = (xmlGlobalState *) 66860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott pthread_getspecific(globalkey)) == NULL) { 669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGlobalState *tsd = xmlNewGlobalState(); 67060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (tsd == NULL) 67160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(NULL); 672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pthread_setspecific(globalkey, tsd); 674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (tsd); 675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (globalval); 677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_WIN32_THREADS 678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(HAVE_COMPILER_TLS) 679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!tlstate_inited) { 68060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott tlstate_inited = 1; 68160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlInitializeGlobalState(&tlstate); 682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return &tlstate; 684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else /* HAVE_COMPILER_TLS */ 685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGlobalState *globalval; 68660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlGlobalStateCleanupHelperParams *p; 687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOnceInit(); 689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(LIBXML_STATIC) && !defined(LIBXML_STATIC_FOR_DLL) 69060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott globalval = (xmlGlobalState *) TlsGetValue(globalkey); 691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 69260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott p = (xmlGlobalStateCleanupHelperParams *) TlsGetValue(globalkey); 69360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott globalval = (xmlGlobalState *) (p ? p->memory : NULL); 694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (globalval == NULL) { 69660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlGlobalState *tsd = xmlNewGlobalState(); 69760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 69860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (tsd == NULL) 69960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(NULL); 70060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott p = (xmlGlobalStateCleanupHelperParams *) 70160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott malloc(sizeof(xmlGlobalStateCleanupHelperParams)); 70260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (p == NULL) { 70360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlGenericError(xmlGenericErrorContext, 70460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott "xmlGetGlobalState: out of memory\n"); 70560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlFreeGlobalState(tsd); 70660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return(NULL); 70760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 70860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott p->memory = tsd; 709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(LIBXML_STATIC) && !defined(LIBXML_STATIC_FOR_DLL) 71060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott DuplicateHandle(GetCurrentProcess(), GetCurrentThread(), 71160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott GetCurrentProcess(), &p->thread, 0, TRUE, 71260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott DUPLICATE_SAME_ACCESS); 71360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott TlsSetValue(globalkey, tsd); 71460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott _beginthread(xmlGlobalStateCleanupHelper, 0, p); 715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 71660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott EnterCriticalSection(&cleanup_helpers_cs); 717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cleanup_helpers_head != NULL) { 718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cleanup_helpers_head->prev = p; 719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 72060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott p->next = cleanup_helpers_head; 72160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott p->prev = NULL; 72260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott cleanup_helpers_head = p; 72360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott TlsSetValue(globalkey, p); 72460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott LeaveCriticalSection(&cleanup_helpers_cs); 725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 72760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return (tsd); 728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (globalval); 730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* HAVE_COMPILER_TLS */ 731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_BEOS_THREADS 732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGlobalState *globalval; 733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOnceInit(); 735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 73660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if ((globalval = (xmlGlobalState *) tls_get(globalkey)) == NULL) { 737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGlobalState *tsd = xmlNewGlobalState(); 73860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (tsd == NULL) 73960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return (NULL); 740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tls_set(globalkey, tsd); 742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project on_exit_thread(xmlGlobalStateCleanup, NULL); 743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (tsd); 744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (globalval); 746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 74760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return (NULL); 748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Library wide thread interfaces * 754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGetThreadId: 759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGetThreadId() find the current thread ID number 761df143a5041f03a22808b59c76698770b74692815Selim Gurun * Note that this is likely to be broken on some platforms using pthreads 762df143a5041f03a22808b59c76698770b74692815Selim Gurun * as the specification doesn't mandate pthread_t to be an integer type 763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the current thread ID number 765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlGetThreadId(void) 768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 770df143a5041f03a22808b59c76698770b74692815Selim Gurun pthread_t id; 771df143a5041f03a22808b59c76698770b74692815Selim Gurun int ret; 772df143a5041f03a22808b59c76698770b74692815Selim Gurun 773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (libxml_is_threaded == 0) 77460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return (0); 775df143a5041f03a22808b59c76698770b74692815Selim Gurun id = pthread_self(); 776df143a5041f03a22808b59c76698770b74692815Selim Gurun /* horrible but preserves compat, see warning above */ 777df143a5041f03a22808b59c76698770b74692815Selim Gurun memcpy(&ret, &id, sizeof(ret)); 778df143a5041f03a22808b59c76698770b74692815Selim Gurun return (ret); 779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_WIN32_THREADS 780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return GetCurrentThreadId(); 781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_BEOS_THREADS 78260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return find_thread(NULL); 783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 78460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return ((int) 0); 785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlIsMainThread: 790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlIsMainThread() check whether the current thread is the main thread. 792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if the current thread is the main thread, 0 otherwise 794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlIsMainThread(void) 797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (libxml_is_threaded == -1) 800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlInitThreads(); 801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (libxml_is_threaded == 0) 80260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return (1); 803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pthread_once(&once_control, xmlOnceInit); 804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_WIN32_THREADS 80560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlOnceInit(); 806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_BEOS_THREADS 807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOnceInit(); 808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 80960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_THREADS 811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "xmlIsMainThread()\n"); 812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 814df143a5041f03a22808b59c76698770b74692815Selim Gurun return (pthread_equal(mainthread,pthread_self())); 815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_WIN32_THREADS 81660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return (mainthread == GetCurrentThreadId()); 817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_BEOS_THREADS 81860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return (mainthread == find_thread(NULL)); 819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 82060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return (1); 821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlLockLibrary: 826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlLockLibrary() is used to take out a re-entrant lock on the libxml2 828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * library. 829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlLockLibrary(void) 832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_THREADS 834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "xmlLockLibrary()\n"); 835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRMutexLock(xmlLibraryLock); 837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlUnlockLibrary: 841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlUnlockLibrary() is used to release a re-entrant lock on the libxml2 843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * library. 844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlUnlockLibrary(void) 847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_THREADS 849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "xmlUnlockLibrary()\n"); 850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRMutexUnlock(xmlLibraryLock); 852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlInitThreads: 856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlInitThreads() is used to to initialize all the thread related 858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * data of the libxml2 library. 859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlInitThreads(void) 862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (libxml_is_threaded == -1) { 865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((pthread_once != NULL) && 86660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (pthread_getspecific != NULL) && 86760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (pthread_setspecific != NULL) && 86860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (pthread_key_create != NULL) && 86960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (pthread_key_delete != NULL) && 87060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (pthread_mutex_init != NULL) && 87160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (pthread_mutex_destroy != NULL) && 87260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (pthread_mutex_lock != NULL) && 87360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (pthread_mutex_unlock != NULL) && 87460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (pthread_cond_init != NULL) && 87560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (pthread_cond_destroy != NULL) && 87660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (pthread_cond_wait != NULL) && 87760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (pthread_equal != NULL) && 87860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (pthread_self != NULL) && 87960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (pthread_cond_signal != NULL)) { 88060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott libxml_is_threaded = 1; 88160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* fprintf(stderr, "Running multithreaded\n"); */ 88360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } else { 88460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* fprintf(stderr, "Running without multithread\n"); */ 88660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott libxml_is_threaded = 0; 88760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 889df143a5041f03a22808b59c76698770b74692815Selim Gurun#elif defined(HAVE_WIN32_THREADS) && !defined(HAVE_COMPILER_TLS) && (!defined(LIBXML_STATIC) || defined(LIBXML_STATIC_FOR_DLL)) 890df143a5041f03a22808b59c76698770b74692815Selim Gurun InitializeCriticalSection(&cleanup_helpers_cs); 891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlCleanupThreads: 896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlCleanupThreads() is used to to cleanup all the thread related 898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * data of the libxml2 library once processing has ended. 899df143a5041f03a22808b59c76698770b74692815Selim Gurun * 900df143a5041f03a22808b59c76698770b74692815Selim Gurun * WARNING: if your application is multithreaded or has plugin support 901df143a5041f03a22808b59c76698770b74692815Selim Gurun * calling this may crash the application if another thread or 902df143a5041f03a22808b59c76698770b74692815Selim Gurun * a plugin is still using libxml2. It's sometimes very hard to 903df143a5041f03a22808b59c76698770b74692815Selim Gurun * guess if libxml2 is in use in the application, some libraries 904df143a5041f03a22808b59c76698770b74692815Selim Gurun * or plugins may use it without notice. In case of doubt abstain 905df143a5041f03a22808b59c76698770b74692815Selim Gurun * from calling this function or do it just before calling exit() 906df143a5041f03a22808b59c76698770b74692815Selim Gurun * to avoid leak reports from valgrind ! 907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlCleanupThreads(void) 910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_THREADS 912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "xmlCleanupThreads()\n"); 913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 914df143a5041f03a22808b59c76698770b74692815Selim Gurun#ifdef HAVE_PTHREAD_H 915df143a5041f03a22808b59c76698770b74692815Selim Gurun if ((libxml_is_threaded) && (pthread_key_delete != NULL)) 916df143a5041f03a22808b59c76698770b74692815Selim Gurun pthread_key_delete(globalkey); 91794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun once_control = once_control_init; 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(); 95794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun __xmlInitializeDict(); 958df143a5041f03a22808b59c76698770b74692815Selim Gurun#elif defined(HAVE_WIN32_THREADS) 959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!run_once.done) { 96060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (InterlockedIncrement(&run_once.control) == 1) { 961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if !defined(HAVE_COMPILER_TLS) 962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project globalkey = TlsAlloc(); 963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mainthread = GetCurrentThreadId(); 96594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun __xmlInitializeDict(); 966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project run_once.done = 1; 96760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } else { 968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Another thread is working; give up our slice and 969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * wait until they're done. */ 970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (!run_once.done) 971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project Sleep(0); 972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 974df143a5041f03a22808b59c76698770b74692815Selim Gurun#elif defined HAVE_BEOS_THREADS 97560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (atomic_add(&run_once_init, 1) == 0) { 97660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott globalkey = tls_allocate(); 97760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott tls_set(globalkey, NULL); 97860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott mainthread = find_thread(NULL); 97994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun __xmlInitializeDict(); 98060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } else 98160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott atomic_add(&run_once_init, -1); 982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * DllMain: 988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @hinstDLL: handle to DLL instance 989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @fdwReason: Reason code for entry 990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @lpvReserved: generic pointer (depends upon reason code) 991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Entry point for Windows library. It is being used to free thread-specific 993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * storage. 994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns TRUE always 996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 997df143a5041f03a22808b59c76698770b74692815Selim Gurun#ifdef HAVE_PTHREAD_H 998df143a5041f03a22808b59c76698770b74692815Selim Gurun#elif defined(HAVE_WIN32_THREADS) && !defined(HAVE_COMPILER_TLS) && (!defined(LIBXML_STATIC) || defined(LIBXML_STATIC_FOR_DLL)) 999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(LIBXML_STATIC_FOR_DLL) 100060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottBOOL XMLCALL 100160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlDllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) 1002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 100360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottBOOL WINAPI 100460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottDllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) 1005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 100760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott switch (fdwReason) { 100860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott case DLL_THREAD_DETACH: 100960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (globalkey != TLS_OUT_OF_INDEXES) { 101060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlGlobalState *globalval = NULL; 101160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlGlobalStateCleanupHelperParams *p = 101260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (xmlGlobalStateCleanupHelperParams *) 101360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott TlsGetValue(globalkey); 101460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott globalval = (xmlGlobalState *) (p ? p->memory : NULL); 101560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (globalval) { 101660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlFreeGlobalState(globalval); 101760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott TlsSetValue(globalkey, NULL); 101860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 101960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (p) { 102060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott EnterCriticalSection(&cleanup_helpers_cs); 102160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (p == cleanup_helpers_head) 102260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott cleanup_helpers_head = p->next; 102360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott else 102460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott p->prev->next = p->next; 102560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (p->next != NULL) 102660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott p->next->prev = p->prev; 102760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott LeaveCriticalSection(&cleanup_helpers_cs); 102860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott free(p); 102960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 1030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 103160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott break; 1032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return TRUE; 1034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define bottom_threads 1037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "elfgcchack.h" 1038