threads.c revision 60a4c356ee9ce5e9ccb23347c0381f0436192691
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> 29ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 30ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 31ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_WIN32_THREADS 32ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <windows.h> 33ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef HAVE_COMPILER_TLS 34ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <process.h> 35ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 36ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 37ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 38ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_BEOS_THREADS 39ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <OS.h> 40ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <TLS.h> 41ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 42ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 43ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(SOLARIS) 44ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <note.h> 45ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 46ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 47ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define DEBUG_THREADS */ 48ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 49ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 50ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 51ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int libxml_is_threaded = -1; 52ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef __GNUC__ 53ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef linux 54ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || (__GNUC__ > 3) 55ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectextern int pthread_once (pthread_once_t *__once_control, 56ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void (*__init_routine) (void)) 57ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __attribute((weak)); 58ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectextern void *pthread_getspecific (pthread_key_t __key) 59ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __attribute((weak)); 60ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectextern int pthread_setspecific (pthread_key_t __key, 61ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __const void *__pointer) 62ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __attribute((weak)); 63ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectextern int pthread_key_create (pthread_key_t *__key, 64ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void (*__destr_function) (void *)) 65ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __attribute((weak)); 6660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottextern int pthread_key_delete (pthread_key_t __key) 6760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott __attribute((weak)); 68ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectextern int pthread_mutex_init () 69ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __attribute((weak)); 70ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectextern int pthread_mutex_destroy () 71ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __attribute((weak)); 72ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectextern int pthread_mutex_lock () 73ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __attribute((weak)); 74ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectextern int pthread_mutex_unlock () 75ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __attribute((weak)); 76ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectextern int pthread_cond_init () 77ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __attribute((weak)); 7860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottextern int pthread_cond_destroy () 7960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott __attribute((weak)); 8060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottextern int pthread_cond_wait () 8160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott __attribute((weak)); 82ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectextern int pthread_equal () 83ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __attribute((weak)); 84ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectextern pthread_t pthread_self () 85ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __attribute((weak)); 86ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectextern int pthread_key_create () 87ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __attribute((weak)); 8860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottextern int pthread_key_delete () 8960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott __attribute((weak)); 90ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectextern int pthread_cond_signal () 91ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __attribute((weak)); 92ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 93ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* linux */ 94ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* __GNUC__ */ 95ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* HAVE_PTHREAD_H */ 96ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 97ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 98ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: this module still uses malloc/free and not xmlMalloc/xmlFree 99ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to avoid some crazyness since xmlMalloc/xmlFree may actually 100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * be hosted on allocated blocks needing them for the allocation ... 101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlMutex are a simple mutual exception locks 105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlMutex { 107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pthread_mutex_t lock; 109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_WIN32_THREADS 110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project HANDLE mutex; 111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_BEOS_THREADS 11260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott sem_id sem; 11360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott thread_id tid; 114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int empty; 116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRMutex are reentrant mutual exception locks 121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRMutex { 123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pthread_mutex_t lock; 12560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott unsigned int held; 12660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott unsigned int waiters; 12760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott pthread_t tid; 12860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott pthread_cond_t cv; 129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_WIN32_THREADS 130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CRITICAL_SECTION cs; 131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project unsigned int count; 132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_BEOS_THREADS 13360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlMutexPtr lock; 13460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott thread_id tid; 13560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott int32 count; 136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int empty; 138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 14060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This module still has some internal static data. 143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - xmlLibraryLock a global lock 144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - globalkey used for per-thread data 145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 14860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottstatic pthread_key_t globalkey; 14960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottstatic pthread_t mainthread; 150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic pthread_once_t once_control = PTHREAD_ONCE_INIT; 151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic pthread_mutex_t global_init_lock = PTHREAD_MUTEX_INITIALIZER; 152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_WIN32_THREADS 153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(HAVE_COMPILER_TLS) 154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic __declspec(thread) xmlGlobalState tlstate; 155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic __declspec(thread) int tlstate_inited = 0; 156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else /* HAVE_COMPILER_TLS */ 157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic DWORD globalkey = TLS_OUT_OF_INDEXES; 158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* HAVE_COMPILER_TLS */ 159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic DWORD mainthread; 16060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottstatic struct { 161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DWORD done; 162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DWORD control; 16360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott} run_once = { 0, 0}; 164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic volatile LPCRITICAL_SECTION global_init_lock = NULL; 16560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* endif HAVE_WIN32_THREADS */ 167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_BEOS_THREADS 168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint32 globalkey = 0; 169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectthread_id mainthread = 0; 170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint32 run_once_init = 0; 171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int32 global_init_lock = -1; 172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic vint32 global_init_count = 0; 173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 17560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottstatic xmlRMutexPtr xmlLibraryLock = NULL; 17660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_THREAD_ENABLED 178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlOnceInit(void); 179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNewMutex: 183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNewMutex() is used to allocate a libxml2 token struct for use in 185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * synchronizing access to data. 186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a new simple mutex pointer or NULL in case of error 188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlMutexPtr 190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNewMutex(void) 191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlMutexPtr tok; 193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((tok = malloc(sizeof(xmlMutex))) == NULL) 195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (libxml_is_threaded != 0) 19860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott pthread_mutex_init(&tok->lock, NULL); 199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_WIN32_THREADS 200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tok->mutex = CreateMutex(NULL, FALSE, NULL); 201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_BEOS_THREADS 20260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if ((tok->sem = create_sem(1, "xmlMutex")) < B_OK) { 20360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott free(tok); 20460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return NULL; 20560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 20660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott tok->tid = -1; 207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (tok); 209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFreeMutex: 213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @tok: the simple mutex 214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFreeMutex() is used to reclaim resources associated with a libxml2 token 216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * struct. 217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFreeMutex(xmlMutexPtr tok) 220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 22160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (tok == NULL) 22260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return; 223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (libxml_is_threaded != 0) 22660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott pthread_mutex_destroy(&tok->lock); 227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_WIN32_THREADS 228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project CloseHandle(tok->mutex); 229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_BEOS_THREADS 23060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott delete_sem(tok->sem); 231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project free(tok); 233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlMutexLock: 237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @tok: the simple mutex 238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlMutexLock() is used to lock a libxml2 token. 240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlMutexLock(xmlMutexPtr tok) 243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tok == NULL) 245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (libxml_is_threaded != 0) 24860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott pthread_mutex_lock(&tok->lock); 249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_WIN32_THREADS 250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project WaitForSingleObject(tok->mutex, INFINITE); 251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_BEOS_THREADS 25260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (acquire_sem(tok->sem) != B_NO_ERROR) { 253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_THREADS 25460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlGenericError(xmlGenericErrorContext, 25560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott "xmlMutexLock():BeOS:Couldn't aquire semaphore\n"); 25660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott exit(); 257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 25860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 25960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott tok->tid = find_thread(NULL); 260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlMutexUnlock: 266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @tok: the simple mutex 267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlMutexUnlock() is used to unlock a libxml2 token. 269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlMutexUnlock(xmlMutexPtr tok) 272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tok == NULL) 274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (libxml_is_threaded != 0) 27760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott pthread_mutex_unlock(&tok->lock); 278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_WIN32_THREADS 279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ReleaseMutex(tok->mutex); 280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_BEOS_THREADS 28160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (tok->tid == find_thread(NULL)) { 28260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott tok->tid = -1; 28360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott release_sem(tok->sem); 28460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlNewRMutex: 290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRNewMutex() is used to allocate a reentrant mutex for use in 292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * synchronizing access to data. token_r is a re-entrant lock and thus useful 293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * for synchronizing access to data structures that may be manipulated in a 294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * recursive fashion. 295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new reentrant mutex pointer or NULL in case of error 297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRMutexPtr 299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlNewRMutex(void) 300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRMutexPtr tok; 302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((tok = malloc(sizeof(xmlRMutex))) == NULL) 304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (libxml_is_threaded != 0) { 30760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott pthread_mutex_init(&tok->lock, NULL); 30860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott tok->held = 0; 30960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott tok->waiters = 0; 31060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott pthread_cond_init(&tok->cv, NULL); 311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_WIN32_THREADS 313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project InitializeCriticalSection(&tok->cs); 314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tok->count = 0; 315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_BEOS_THREADS 31660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if ((tok->lock = xmlNewMutex()) == NULL) { 31760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott free(tok); 31860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return NULL; 31960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 32060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott tok->count = 0; 321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (tok); 323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlFreeRMutex: 327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @tok: the reentrant mutex 328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRFreeMutex() is used to reclaim resources associated with a 330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * reentrant mutex. 331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlFreeRMutex(xmlRMutexPtr tok ATTRIBUTE_UNUSED) 334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tok == NULL) 336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (libxml_is_threaded != 0) { 33960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott pthread_mutex_destroy(&tok->lock); 34060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott pthread_cond_destroy(&tok->cv); 341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_WIN32_THREADS 343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DeleteCriticalSection(&tok->cs); 344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_BEOS_THREADS 34560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlFreeMutex(tok->lock); 346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project free(tok); 348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRMutexLock: 352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @tok: the reentrant mutex 353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRMutexLock() is used to lock a libxml2 token_r. 355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRMutexLock(xmlRMutexPtr tok) 358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tok == NULL) 360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (libxml_is_threaded == 0) 363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pthread_mutex_lock(&tok->lock); 366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tok->held) { 367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (pthread_equal(tok->tid, pthread_self())) { 368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tok->held++; 369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pthread_mutex_unlock(&tok->lock); 370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tok->waiters++; 373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (tok->held) 374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pthread_cond_wait(&tok->cv, &tok->lock); 375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tok->waiters--; 376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tok->tid = pthread_self(); 379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tok->held = 1; 380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pthread_mutex_unlock(&tok->lock); 381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_WIN32_THREADS 382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project EnterCriticalSection(&tok->cs); 383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ++tok->count; 384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_BEOS_THREADS 38560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (tok->lock->tid == find_thread(NULL)) { 38660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott tok->count++; 38760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return; 38860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } else { 38960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlMutexLock(tok->lock); 39060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott tok->count = 1; 39160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRMutexUnlock: 397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @tok: the reentrant mutex 398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRMutexUnlock() is used to unlock a libxml2 token_r. 400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRMutexUnlock(xmlRMutexPtr tok ATTRIBUTE_UNUSED) 403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tok == NULL) 405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (libxml_is_threaded == 0) 408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 40960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pthread_mutex_lock(&tok->lock); 411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tok->held--; 412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tok->held == 0) { 413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tok->waiters) 414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pthread_cond_signal(&tok->cv); 415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tok->tid = 0; 416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pthread_mutex_unlock(&tok->lock); 418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_WIN32_THREADS 41960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (!--tok->count) 42060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott LeaveCriticalSection(&tok->cs); 421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_BEOS_THREADS 42260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (tok->lock->tid == find_thread(NULL)) { 42360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott tok->count--; 42460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (tok->count == 0) { 42560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlMutexUnlock(tok->lock); 42660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 42760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return; 42860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGlobalInitMutexLock 434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Makes sure that the global initialization mutex is initialized and 436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * locks it. 437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project__xmlGlobalInitMutexLock(void) 440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Make sure the global init lock is initialized and then lock it. */ 442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* The mutex is statically initialized, so we just lock it. */ 444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pthread_mutex_lock(&global_init_lock); 445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_WIN32_THREADS 446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project LPCRITICAL_SECTION cs; 447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Create a new critical section */ 449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (global_init_lock == NULL) { 45060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott cs = malloc(sizeof(CRITICAL_SECTION)); 45160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (cs == NULL) { 45260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlGenericError(xmlGenericErrorContext, 45360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott "xmlGlobalInitMutexLock: out of memory\n"); 45460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return; 45560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 45660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott InitializeCriticalSection(cs); 457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 45860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott /* Swap it into the global_init_lock */ 459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef InterlockedCompareExchangePointer 46060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott InterlockedCompareExchangePointer(&global_init_lock, cs, NULL); 46160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#else /* Use older void* version */ 46260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott InterlockedCompareExchange((void **) &global_init_lock, 46360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (void *) cs, NULL); 464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* InterlockedCompareExchangePointer */ 465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 46660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott /* If another thread successfully recorded its critical 46760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * section in the global_init_lock then discard the one 46860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * allocated by this thread. */ 46960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (global_init_lock != cs) { 47060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott DeleteCriticalSection(cs); 47160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott free(cs); 47260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Lock the chosen critical section */ 476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project EnterCriticalSection(global_init_lock); 477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_BEOS_THREADS 478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int32 sem; 479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Allocate a new semaphore */ 481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sem = create_sem(1, "xmlGlobalinitMutex"); 482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (global_init_lock == -1) { 48460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (atomic_add(&global_init_count, 1) == 0) { 48560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott global_init_lock = sem; 48660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } else { 48760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott snooze(1); 48860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott atomic_add(&global_init_count, -1); 48960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* If another thread successfully recorded its critical 493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * section in the global_init_lock then discard the one 494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * allocated by this thread. */ 495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (global_init_lock != sem) 49660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott delete_sem(sem); 497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Acquire the chosen semaphore */ 499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (acquire_sem(global_init_lock) != B_NO_ERROR) { 500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_THREADS 50160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlGenericError(xmlGenericErrorContext, 50260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott "xmlGlobalInitMutexLock():BeOS:Couldn't acquire semaphore\n"); 50360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott exit(); 504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project__xmlGlobalInitMutexUnlock(void) 511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pthread_mutex_unlock(&global_init_lock); 514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_WIN32_THREADS 51560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (global_init_lock != NULL) { 51660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott LeaveCriticalSection(global_init_lock); 51760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_BEOS_THREADS 519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project release_sem(global_init_lock); 520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGlobalInitMutexDestroy 525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Makes sure that the global initialization mutex is destroyed before 527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * application termination. 528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 52960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottvoid 53060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott__xmlGlobalInitMutexDestroy(void) 531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 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 596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef 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 761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the current thread ID number 763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlGetThreadId(void) 766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (libxml_is_threaded == 0) 76960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return (0); 77060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return ((int) pthread_self()); 771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_WIN32_THREADS 772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return GetCurrentThreadId(); 773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_BEOS_THREADS 77460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return find_thread(NULL); 775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 77660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return ((int) 0); 777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlIsMainThread: 782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlIsMainThread() check whether the current thread is the main thread. 784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if the current thread is the main thread, 0 otherwise 786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlIsMainThread(void) 789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (libxml_is_threaded == -1) 792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlInitThreads(); 793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (libxml_is_threaded == 0) 79460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return (1); 795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pthread_once(&once_control, xmlOnceInit); 796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_WIN32_THREADS 79760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlOnceInit(); 798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_BEOS_THREADS 799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOnceInit(); 800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 80160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_THREADS 803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "xmlIsMainThread()\n"); 804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 80660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return (mainthread == pthread_self()); 807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_WIN32_THREADS 80860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return (mainthread == GetCurrentThreadId()); 809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#elif defined HAVE_BEOS_THREADS 81060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return (mainthread == find_thread(NULL)); 811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 81260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return (1); 813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlLockLibrary: 818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlLockLibrary() is used to take out a re-entrant lock on the libxml2 820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * library. 821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlLockLibrary(void) 824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_THREADS 826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "xmlLockLibrary()\n"); 827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRMutexLock(xmlLibraryLock); 829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlUnlockLibrary: 833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlUnlockLibrary() is used to release a re-entrant lock on the libxml2 835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * library. 836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlUnlockLibrary(void) 839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_THREADS 841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "xmlUnlockLibrary()\n"); 842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRMutexUnlock(xmlLibraryLock); 844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlInitThreads: 848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlInitThreads() is used to to initialize all the thread related 850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * data of the libxml2 library. 851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlInitThreads(void) 854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_THREADS 856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "xmlInitThreads()\n"); 857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(HAVE_WIN32_THREADS) && !defined(HAVE_COMPILER_TLS) && (!defined(LIBXML_STATIC) || defined(LIBXML_STATIC_FOR_DLL)) 859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project InitializeCriticalSection(&cleanup_helpers_cs); 860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (libxml_is_threaded == -1) { 863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((pthread_once != NULL) && 86460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (pthread_getspecific != NULL) && 86560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (pthread_setspecific != NULL) && 86660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (pthread_key_create != NULL) && 86760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (pthread_key_delete != NULL) && 86860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (pthread_mutex_init != NULL) && 86960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (pthread_mutex_destroy != NULL) && 87060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (pthread_mutex_lock != NULL) && 87160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (pthread_mutex_unlock != NULL) && 87260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (pthread_cond_init != NULL) && 87360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (pthread_cond_destroy != NULL) && 87460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (pthread_cond_wait != NULL) && 87560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (pthread_equal != NULL) && 87660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (pthread_self != NULL) && 87760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (pthread_cond_signal != NULL)) { 87860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott libxml_is_threaded = 1; 87960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* fprintf(stderr, "Running multithreaded\n"); */ 88160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } else { 88260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* fprintf(stderr, "Running without multithread\n"); */ 88460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott libxml_is_threaded = 0; 88560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlCleanupThreads: 892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlCleanupThreads() is used to to cleanup all the thread related 894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * data of the libxml2 library once processing has ended. 895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlCleanupThreads(void) 898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_THREADS 900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, "xmlCleanupThreads()\n"); 901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(HAVE_WIN32_THREADS) && !defined(HAVE_COMPILER_TLS) && (!defined(LIBXML_STATIC) || defined(LIBXML_STATIC_FOR_DLL)) 903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (globalkey != TLS_OUT_OF_INDEXES) { 90460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlGlobalStateCleanupHelperParams *p; 90560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 90660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott EnterCriticalSection(&cleanup_helpers_cs); 90760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott p = cleanup_helpers_head; 90860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott while (p != NULL) { 90960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlGlobalStateCleanupHelperParams *temp = p; 91060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 91160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott p = p->next; 91260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlFreeGlobalState(temp->memory); 91360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott free(temp); 91460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 91560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott cleanup_helpers_head = 0; 91660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott LeaveCriticalSection(&cleanup_helpers_cs); 91760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott TlsFree(globalkey); 91860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott globalkey = TLS_OUT_OF_INDEXES; 919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project DeleteCriticalSection(&cleanup_helpers_cs); 92160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#elif defined HAVE_PTHREAD_H 92260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if ((libxml_is_threaded) && (pthread_key_delete != NULL)) 92360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott pthread_key_delete(globalkey); 924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_THREAD_ENABLED 92860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlOnceInit 931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlOnceInit() is used to initialize the value of mainthread for use 933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in other routines. This function should only be called using 934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * pthread_once() in association with the once_control variable to ensure 935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * that the function is only called once. See man pthread_once for more 936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * details. 937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 93960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlOnceInit(void) 94060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott{ 941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_PTHREAD_H 942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (void) pthread_key_create(&globalkey, xmlFreeGlobalState); 943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mainthread = pthread_self(); 944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(HAVE_WIN32_THREADS) 947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!run_once.done) { 94860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (InterlockedIncrement(&run_once.control) == 1) { 949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if !defined(HAVE_COMPILER_TLS) 950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project globalkey = TlsAlloc(); 951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project mainthread = GetCurrentThreadId(); 953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project run_once.done = 1; 95460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } else { 955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Another thread is working; give up our slice and 956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * wait until they're done. */ 957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (!run_once.done) 958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project Sleep(0); 959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_BEOS_THREADS 96460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (atomic_add(&run_once_init, 1) == 0) { 96560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott globalkey = tls_allocate(); 96660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott tls_set(globalkey, NULL); 96760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott mainthread = find_thread(NULL); 96860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } else 96960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott atomic_add(&run_once_init, -1); 970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * DllMain: 976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @hinstDLL: handle to DLL instance 977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @fdwReason: Reason code for entry 978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @lpvReserved: generic pointer (depends upon reason code) 979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Entry point for Windows library. It is being used to free thread-specific 981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * storage. 982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns TRUE always 984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(HAVE_WIN32_THREADS) && !defined(HAVE_COMPILER_TLS) && (!defined(LIBXML_STATIC) || defined(LIBXML_STATIC_FOR_DLL)) 986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if defined(LIBXML_STATIC_FOR_DLL) 98760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottBOOL XMLCALL 98860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlDllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) 989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else 99060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottBOOL WINAPI 99160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottDllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) 992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 99460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott switch (fdwReason) { 99560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott case DLL_THREAD_DETACH: 99660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (globalkey != TLS_OUT_OF_INDEXES) { 99760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlGlobalState *globalval = NULL; 99860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlGlobalStateCleanupHelperParams *p = 99960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (xmlGlobalStateCleanupHelperParams *) 100060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott TlsGetValue(globalkey); 100160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott globalval = (xmlGlobalState *) (p ? p->memory : NULL); 100260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (globalval) { 100360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlFreeGlobalState(globalval); 100460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott TlsSetValue(globalkey, NULL); 100560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 100660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (p) { 100760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott EnterCriticalSection(&cleanup_helpers_cs); 100860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (p == cleanup_helpers_head) 100960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott cleanup_helpers_head = p->next; 101060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott else 101160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott p->prev->next = p->next; 101260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (p->next != NULL) 101360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott p->next->prev = p->prev; 101460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott LeaveCriticalSection(&cleanup_helpers_cs); 101560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott free(p); 101660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 1017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 101860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott break; 1019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return TRUE; 1021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define bottom_threads 1024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "elfgcchack.h" 1025