Edit

kc3-lang/libxml2/optim/hash_dict.patch

Branch :

  • Show log

    Commit

  • Author : Daniel Veillard
    Date : 2004-02-24 18:10:38
    Hash : 752b4f9c
    Message : Notes on optimization, Daniel

  • optim/hash_dict.patch
  • Index: hash.c
    ===================================================================
    RCS file: /cvs/gnome/gnome-xml/hash.c,v
    retrieving revision 1.30
    diff -u -r1.30 hash.c
    --- hash.c	29 Oct 2003 11:18:37 -0000	1.30
    +++ hash.c	24 Feb 2004 17:18:42 -0000
    @@ -26,6 +26,7 @@
     #include <libxml/xmlmemory.h>
     #include <libxml/xmlerror.h>
     #include <libxml/globals.h>
    +#include <libxml/dict.h>
     
     #define MAX_HASH_LEN 8
     
    @@ -38,9 +39,9 @@
     typedef xmlHashEntry *xmlHashEntryPtr;
     struct _xmlHashEntry {
         struct _xmlHashEntry *next;
    -    xmlChar *name;
    -    xmlChar *name2;
    -    xmlChar *name3;
    +    const xmlChar *name;
    +    const xmlChar *name2;
    +    const xmlChar *name3;
         void *payload;
         int valid;
     };
    @@ -52,6 +53,7 @@
         struct _xmlHashEntry *table;
         int size;
         int nbElems;
    +    xmlDictPtr dict;
     };
     
     /*
    @@ -143,12 +145,16 @@
     xmlHashTablePtr
     xmlHashCreate(int size) {
         xmlHashTablePtr table;
    +    xmlDictPtr dict;
       
         if (size <= 0)
             size = 256;
       
    +    dict = xmlDictCreate();
    +    if (dict == NULL) return(NULL);
         table = xmlMalloc(sizeof(xmlHashTable));
         if (table) {
    +        table->dict = dict;
             table->size = size;
     	table->nbElems = 0;
             table->table = xmlMalloc(size * sizeof(xmlHashEntry));
    @@ -158,6 +164,7 @@
             }
             xmlFree(table);
         }
    +    xmlDictFree(dict);
         return(NULL);
     }
     
    @@ -282,12 +289,6 @@
     		next = iter->next;
     		if ((f != NULL) && (iter->payload != NULL))
     		    f(iter->payload, iter->name);
    -		if (iter->name)
    -		    xmlFree(iter->name);
    -		if (iter->name2)
    -		    xmlFree(iter->name2);
    -		if (iter->name3)
    -		    xmlFree(iter->name3);
     		iter->payload = NULL;
     		if (!inside_table)
     		    xmlFree(iter);
    @@ -299,6 +300,7 @@
     	}
     	xmlFree(table->table);
         }
    +    xmlDictFree(table->dict);
         xmlFree(table);
     }
     
    @@ -465,6 +467,9 @@
     
         if ((table == NULL) || name == NULL)
     	return(-1);
    +    if (name) name = xmlDictLookup(table->dict, name, -1);
    +    if (name2) name2 = xmlDictLookup(table->dict, name2, -1);
    +    if (name3) name3 = xmlDictLookup(table->dict, name3, -1);
     
         /*
          * Check for duplicate and insertion location.
    @@ -475,15 +480,15 @@
         } else {
     	for (insert = &(table->table[key]); insert->next != NULL;
     	     insert = insert->next) {
    -	    if ((xmlStrEqual(insert->name, name)) &&
    -		(xmlStrEqual(insert->name2, name2)) &&
    -		(xmlStrEqual(insert->name3, name3)))
    +	    if ((insert->name == name) &&
    +		(insert->name2 == name2) &&
    +		(insert->name3 == name3))
     		return(-1);
     	    len++;
     	}
    -	if ((xmlStrEqual(insert->name, name)) &&
    -	    (xmlStrEqual(insert->name2, name2)) &&
    -	    (xmlStrEqual(insert->name3, name3)))
    +	if ((insert->name == name) &&
    +	    (insert->name2 == name2) &&
    +	    (insert->name3 == name3))
     	    return(-1);
         }
     
    @@ -495,9 +500,9 @@
     	     return(-1);
         }
     
    -    entry->name = xmlStrdup(name);
    -    entry->name2 = xmlStrdup(name2);
    -    entry->name3 = xmlStrdup(name3);
    +    entry->name = name;
    +    entry->name2 = name2;
    +    entry->name3 = name3;
         entry->payload = userdata;
         entry->next = NULL;
         entry->valid = 1;
    @@ -539,6 +544,9 @@
     
         if ((table == NULL) || name == NULL)
     	return(-1);
    +    if (name) name = xmlDictLookup(table->dict, name, -1);
    +    if (name2) name2 = xmlDictLookup(table->dict, name2, -1);
    +    if (name3) name3 = xmlDictLookup(table->dict, name3, -1);
     
         /*
          * Check for duplicate and insertion location.
    @@ -549,18 +557,18 @@
         } else {
     	for (insert = &(table->table[key]); insert->next != NULL;
     	     insert = insert->next) {
    -	    if ((xmlStrEqual(insert->name, name)) &&
    -		(xmlStrEqual(insert->name2, name2)) &&
    -		(xmlStrEqual(insert->name3, name3))) {
    +	    if ((insert->name == name) &&
    +		(insert->name2 == name2) &&
    +		(insert->name3 == name3)) {
     		if (f)
     		    f(insert->payload, insert->name);
     		insert->payload = userdata;
     		return(0);
     	    }
     	}
    -	if ((xmlStrEqual(insert->name, name)) &&
    -	    (xmlStrEqual(insert->name2, name2)) &&
    -	    (xmlStrEqual(insert->name3, name3))) {
    +	if ((insert->name == name) &&
    +	    (insert->name2 == name2) &&
    +	    (insert->name3 == name3)) {
     	    if (f)
     		f(insert->payload, insert->name);
     	    insert->payload = userdata;
    @@ -576,9 +584,9 @@
     	     return(-1);
         }
     
    -    entry->name = xmlStrdup(name);
    -    entry->name2 = xmlStrdup(name2);
    -    entry->name3 = xmlStrdup(name3);
    +    entry->name = name;
    +    entry->name2 = name2;
    +    entry->name3 = name3;
         entry->payload = userdata;
         entry->next = NULL;
         entry->valid = 1;
    @@ -615,10 +623,13 @@
         key = xmlHashComputeKey(table, name, name2, name3);
         if (table->table[key].valid == 0)
     	return(NULL);
    +    if (name) name = xmlDictLookup(table->dict, name, -1);
    +    if (name2) name2 = xmlDictLookup(table->dict, name2, -1);
    +    if (name3) name3 = xmlDictLookup(table->dict, name3, -1);
         for (entry = &(table->table[key]); entry != NULL; entry = entry->next) {
    -	if ((xmlStrEqual(entry->name, name)) &&
    -	    (xmlStrEqual(entry->name2, name2)) &&
    -	    (xmlStrEqual(entry->name3, name3)))
    +	if ((entry->name == name) &&
    +	    (entry->name2 == name2) &&
    +	    (entry->name3 == name3))
     	    return(entry->payload);
         }
         return(NULL);
    @@ -774,6 +785,9 @@
         if (f == NULL)
     	return;
     
    +    if (name) name = xmlDictLookup(table->dict, name, -1);
    +    if (name2) name2 = xmlDictLookup(table->dict, name2, -1);
    +    if (name3) name3 = xmlDictLookup(table->dict, name3, -1);
         if (table->table) {
     	for(i = 0; i < table->size; i++) {
     	    if (table->table[i].valid == 0)
    @@ -781,9 +795,9 @@
     	    iter = &(table->table[i]);
     	    while (iter) {
     		next = iter->next;
    -		if (((name == NULL) || (xmlStrEqual(name, iter->name))) &&
    -		    ((name2 == NULL) || (xmlStrEqual(name2, iter->name2))) &&
    -		    ((name3 == NULL) || (xmlStrEqual(name3, iter->name3))) &&
    +		if (((name == NULL) || (name == iter->name)) &&
    +		    ((name2 == NULL) || (name2 == iter->name2)) &&
    +		    ((name3 == NULL) || (name3 == iter->name3)) &&
     		    (iter->payload != NULL)) {
     		    f(iter->payload, data, iter->name,
     		      iter->name2, iter->name3);
    @@ -913,19 +927,16 @@
         if (table->table[key].valid == 0) {
             return(-1);
         } else {
    +	if (name) name = xmlDictLookup(table->dict, name, -1);
    +	if (name2) name2 = xmlDictLookup(table->dict, name2, -1);
    +	if (name3) name3 = xmlDictLookup(table->dict, name3, -1);
             for (entry = &(table->table[key]); entry != NULL; entry = entry->next) {
    -            if (xmlStrEqual(entry->name, name) &&
    -                    xmlStrEqual(entry->name2, name2) &&
    -                    xmlStrEqual(entry->name3, name3)) {
    +            if ((entry->name == name) &&
    +		(entry->name2 == name2) &&
    +		(entry->name3 == name3)) {
                     if ((f != NULL) && (entry->payload != NULL))
                         f(entry->payload, entry->name);
                     entry->payload = NULL;
    -                if(entry->name)
    -                    xmlFree(entry->name);
    -                if(entry->name2)
    -                    xmlFree(entry->name2);
    -                if(entry->name3)
    -                    xmlFree(entry->name3);
                     if(prev) {
                         prev->next = entry->next;
     		    xmlFree(entry);
    Index: include/libxml/hash.h
    ===================================================================
    RCS file: /cvs/gnome/gnome-xml/include/libxml/hash.h,v
    retrieving revision 1.15
    diff -u -r1.15 hash.h
    --- include/libxml/hash.h	20 Nov 2003 11:59:07 -0000	1.15
    +++ include/libxml/hash.h	24 Feb 2004 17:18:42 -0000
    @@ -42,7 +42,7 @@
      *
      * Callback to free data from a hash.
      */
    -typedef void (*xmlHashDeallocator)(void *payload, xmlChar *name);
    +typedef void (*xmlHashDeallocator)(void *payload, const xmlChar *name);
     /**
      * xmlHashCopier:
      * @payload:  the data in the hash