/** * xmlDictFree: * @dict: the dictionnary * * Free the hash @dict and its contents. The userdata is * deallocated with @f if provided. */ void xmlDictFree(xmlDictPtr dict) { int i; xmlDictEntryPtr iter; xmlDictEntryPtr next; int inside_dict = 0; xmlDictStringsPtr pool, nextp; if (dict == NULL) return; if (!xmlDictInitialized) if (!xmlInitializeDict()) return; /* decrement the counter, it may be shared by a parser and docs */ xmlRMutexLock(xmlDictMutex); dict->ref_counter--; if (dict->ref_counter > 0) { xmlRMutexUnlock(xmlDictMutex); return; } xmlRMutexUnlock(xmlDictMutex); if (dict->subdict != NULL) { xmlDictFree(dict->subdict); } if (dict->dict) { for (i = 0; ((i < dict->size) && (dict->nbElems > 0)); i++) { iter = &(dict->dict[i]); if (iter->valid == 0) continue; inside_dict = 1; while (iter) { next = iter->next; if (!inside_dict) xmlFree(iter); dict->nbElems--; inside_dict = 0; iter = next; } inside_dict = 0; } xmlFree(dict->dict); } pool = dict->strings; while (pool != NULL) { nextp = pool->next; xmlFree(pool); pool = nextp; } xmlFreeRMutex(dict->mutex); xmlFree(dict); }
/** * xmlUnlockLibrary: * * xmlUnlockLibrary() is used to release a re-entrant lock on the libxml2 * library. */ XMLPUBFUNEXPORT void xmlUnlockLibrary(void) { #ifdef DEBUG_THREADS xmlGenericError(xmlGenericErrorContext, "xmlUnlockLibrary()\n"); #endif xmlRMutexUnlock(xmlLibraryLock); }
/** * xsltFreeLocales: * * Cleanup function for the locale support on shutdown */ void xsltFreeLocales(void) { #ifdef XSLT_LOCALE_WINAPI xmlRMutexLock(xsltLocaleMutex); xmlFree(xsltLocaleList); xsltLocaleList = NULL; xmlRMutexUnlock(xsltLocaleMutex); #endif }
/** * xmlDictReference: * @dict: the dictionary * * Increment the reference counter of a dictionary * * Returns 0 in case of success and -1 in case of error */ int xmlDictReference(xmlDictPtr dict) { if (!xmlDictInitialized) if (!__xmlInitializeDict()) return(-1); if (dict == NULL) return -1; xmlRMutexLock(xmlDictMutex); dict->ref_counter++; xmlRMutexUnlock(xmlDictMutex); return(0); }
int __xmlRandom(void) { int ret; if (xmlDictInitialized == 0) __xmlInitializeDict(); xmlRMutexLock(xmlDictMutex); #ifdef HAVE_RAND_R ret = rand_r(& rand_seed); #else ret = rand(); #endif xmlRMutexUnlock(xmlDictMutex); return(ret); }
static void xsltEnumSupportedLocales(void) { xmlRMutexLock(xsltLocaleMutex); if (xsltLocaleListSize <= 0) { size_t len; EnumSystemLocalesA(xsltCountSupportedLocales, LCID_SUPPORTED); len = xsltLocaleListSize * sizeof(xsltRFC1766Info); xsltLocaleList = xmlMalloc(len); memset(xsltLocaleList, 0, len); EnumSystemLocalesA(xsltIterateSupportedLocales, LCID_SUPPORTED); } xmlRMutexUnlock(xsltLocaleMutex); }
/** * __xmlInitializeDict: * * This function is not public * Do the dictionary mutex initialization. * this function is not thread safe, initialization should * normally be done once at setup when called from xmlOnceInit() * we may also land in this code if thread support is not compiled in * * Returns 0 if initialization was already done, and 1 if that * call led to the initialization */ int __xmlInitializeDict(void) { if (xmlDictInitialized) return(1); if ((xmlDictMutex = xmlNewRMutex()) == NULL) return(0); xmlRMutexLock(xmlDictMutex); #ifdef DICT_RANDOMIZATION #ifdef HAVE_RAND_R rand_seed = time(NULL); rand_r(& rand_seed); #else srand(time(NULL)); #endif #endif xmlDictInitialized = 1; xmlRMutexUnlock(xmlDictMutex); return(1); }