diff options
author | Daniel Veillard <veillard@src.gnome.org> | 2005-01-21 23:53:26 +0000 |
---|---|---|
committer | Daniel Veillard <veillard@src.gnome.org> | 2005-01-21 23:53:26 +0000 |
commit | 1441251f851f011cd34edaff9095374d5e6f7b14 (patch) | |
tree | 7ccb5db8ea516bcc7fb667c3fbceb6bce31baf4b /dict.c | |
parent | 1bb16a188852d9cdca9ac99ee41c2ccc84cf0fd0 (diff) | |
download | libxml2-1441251f851f011cd34edaff9095374d5e6f7b14.tar.gz |
a single lock version mostly avoid the cost penalty of the lock in case of
* dict.c parser.c include/libxml/dict.h: a single lock version
mostly avoid the cost penalty of the lock in case of low
parallelism, so applying that version instead.
Daniel
Diffstat (limited to 'dict.c')
-rw-r--r-- | dict.c | 68 |
1 files changed, 62 insertions, 6 deletions
@@ -71,6 +71,50 @@ struct _xmlDict { }; /* + * A mutex for modifying the reference counter for shared + * dictionaries. + */ +static xmlRMutexPtr xmlDictMutex = NULL; + +/* + * Whether the dictionary mutex was initialized. + */ +static int xmlDictInitialized = 0; + +/** + * xmlInitializeCatalog: + * + * Do the dictionary mutex initialization. + * this function is not thread safe, initialization should + * preferably be done once at startup + */ +static int xmlInitializeDict() { + if (xmlDictInitialized) + return(1); + + if ((xmlDictMutex = xmlNewRMutex()) == NULL) + return(0); + + xmlDictInitialized = 1; + return(1); +} + +/** + * xmlCatalogCleanup: + * + * Free the dictionary mutex. + */ +void +xmlDictCleanup(void) { + if (!xmlDictInitialized) + return; + + xmlFreeRMutex(xmlDictMutex); + + xmlDictInitialized = 0; +} + +/* * xmlDictAddString: * @dict: the dictionnary * @name: the name of the userdata @@ -278,7 +322,11 @@ xmlDictComputeQKey(const xmlChar *prefix, const xmlChar *name, int len) xmlDictPtr xmlDictCreate(void) { xmlDictPtr dict; - + + if (!xmlDictInitialized) + if (!xmlInitializeDict()) + return(NULL); + dict = xmlMalloc(sizeof(xmlDict)); if (dict) { dict->ref_counter = 1; @@ -332,10 +380,14 @@ xmlDictCreateSub(xmlDictPtr sub) { */ int xmlDictReference(xmlDictPtr dict) { + if (!xmlDictInitialized) + if (!xmlInitializeDict()) + return(-1); + if (dict == NULL) return -1; - xmlRMutexLock(dict->mutex); + xmlRMutexLock(xmlDictMutex); dict->ref_counter++; - xmlRMutexUnlock(dict->mutex); + xmlRMutexUnlock(xmlDictMutex); return(0); } @@ -451,15 +503,19 @@ xmlDictFree(xmlDictPtr dict) { if (dict == NULL) return; + if (!xmlDictInitialized) + if (!xmlInitializeDict()) + return; + /* decrement the counter, it may be shared by a parser and docs */ - xmlRMutexLock(dict->mutex); + xmlRMutexLock(xmlDictMutex); dict->ref_counter--; if (dict->ref_counter > 0) { - xmlRMutexUnlock(dict->mutex); + xmlRMutexUnlock(xmlDictMutex); return; } - xmlRMutexUnlock(dict->mutex); + xmlRMutexUnlock(xmlDictMutex); if (dict->subdict != NULL) { xmlDictFree(dict->subdict); |