/** * xmlDictCreate: * * Create a new dictionary * * Returns the newly created dictionnary, or NULL if an error occured. */ xmlDictPtr xmlDictCreate(void) { xmlDictPtr dict; if (!xmlDictInitialized) if (!xmlInitializeDict()) return(NULL); dict = (xmlDict*) xmlMalloc(sizeof(xmlDict)); if (dict) { dict->ref_counter = 1; dict->size = MIN_DICT_SIZE; dict->nbElems = 0; dict->dict = (xmlDictEntry*) xmlMalloc(MIN_DICT_SIZE * sizeof(xmlDictEntry)); dict->strings = NULL; dict->subdict = NULL; if (dict->dict) { if ((dict->mutex = xmlNewRMutex()) != NULL) { memset(dict->dict, 0, MIN_DICT_SIZE * sizeof(xmlDictEntry)); return(dict); } xmlFree(dict->dict); } xmlFree(dict); } return(NULL); }
/** * xmlInitializeDict: * * Do the dictionary mutex initialization. * this function is not thread safe, initialization should * preferably be done once at startup */ static int xmlInitializeDict(void) { if (xmlDictInitialized) return(1); if ((xmlDictMutex = xmlNewRMutex()) == NULL) return(0); xmlDictInitialized = 1; return(1); }
/** * __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); }