Enlightenment CVS committal

Author  : raster
Project : e17
Module  : libs/evas

Dir     : e17/libs/evas/src/lib/data


Modified Files:
        evas_stringshare.c 


Log Message:


remove 1 pointer overhead for stringshare (4 bytes or 8) and optimsie free
lookup a little.

amazingly stringshare is showing a double speedup over strdup/free on this p4.

===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/evas/src/lib/data/evas_stringshare.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -3 -r1.5 -r1.6
--- evas_stringshare.c  1 Dec 2005 01:01:17 -0000       1.5
+++ evas_stringshare.c  1 Dec 2005 03:47:14 -0000       1.6
@@ -11,24 +11,21 @@
 
 struct _Evas_Stringshare_El
 {
-   Evas_Stringshare_El *next, *prev;
+   Evas_Stringshare_El *next;
    int                  references;
 };
 
-static inline int _evas_stringshare_hash_gen(const char *str);
-
 static inline int
-_evas_stringshare_hash_gen(const char *str)
+_evas_stringshare_hash_gen(const char *str, int *len)
 {
    unsigned int hash_num = 0, i;
    const unsigned char *ptr;
 
-   if (!str) return 0;
-
    for (i = 0, ptr = (unsigned char *)str; *ptr; ptr++, i++)
      hash_num ^= ((int)(*ptr) | ((int)(*ptr) << 8)) >> (i % 8);
 
    hash_num &= 0xff;
+   *len = i;
    return (int)hash_num;
 }
 
@@ -57,23 +54,20 @@
 const char *
 evas_stringshare_add(const char *str)
 {
-   int hash_num;
+   int hash_num, slen;
    char *el_str;
-   Evas_Stringshare_El *el;
+   Evas_Stringshare_El *el, *pel = NULL;
 
-   hash_num = _evas_stringshare_hash_gen(str);
-   for (el = share.buckets[hash_num]; el; el = el->next)
+   hash_num = _evas_stringshare_hash_gen(str, &slen);
+   for (el = share.buckets[hash_num]; el; pel = el, el = el->next)
      {
        el_str = ((char *)el) + sizeof(Evas_Stringshare_El);
        if (!strcmp(el_str, str))
          {
-            if (el->prev)
+            if (pel)
               {
-                 el->prev->next = el->next;
-                 if (el->next) el->next->prev = el->prev;
-                 el->prev = NULL;
+                 pel->next = el->next;
                  el->next = share.buckets[hash_num];
-                 el->next->prev = el;
                  share.buckets[hash_num] = el;
               }
             el->references++;
@@ -81,13 +75,11 @@
             return el_str;
          }
      }
-   if (!(el = malloc(sizeof(Evas_Stringshare_El) + strlen(str) + 1))) return 
NULL;
+   if (!(el = malloc(sizeof(Evas_Stringshare_El) + slen + 1))) return NULL;
    el_str = ((char *)el) + sizeof(Evas_Stringshare_El);
    strcpy(el_str, str);
    el->references = 1;
-   el->prev = NULL;
    el->next = share.buckets[hash_num];
-   if (el->next) el->next->prev = el;
    share.buckets[hash_num] = el;
    return el_str;
 }
@@ -95,33 +87,29 @@
 void
 evas_stringshare_del(const char *str)
 {
-   int hash_num;
+   int hash_num, slen;
    char *el_str;
-   Evas_Stringshare_El *el;
+   Evas_Stringshare_El *el, *pel = NULL;
 
-   hash_num = _evas_stringshare_hash_gen(str);
-   for (el = share.buckets[hash_num]; el; el = el->next)
+   hash_num = _evas_stringshare_hash_gen(str, &slen);
+   for (el = share.buckets[hash_num]; el; pel = el, el = el->next)
      {
        el_str = ((char *)el) + sizeof(Evas_Stringshare_El);
-       if (!strcmp(el_str, str))
+       if (el_str == str)
          {
             el->references--;
             if (el->references == 0)
               {
-                 if (el->next) el->next->prev = el->prev;
-                 if (el->prev) el->prev->next = el->next;
+                 if (pel) pel->next = el->next;
                  else share.buckets[hash_num] = el->next;
                  free(el);
               }
             else
               {
-                 if (el->prev)
+                 if (pel)
                    {
-                      el->prev->next = el->next;
-                      if (el->next) el->next->prev = el->prev;
-                      el->prev = NULL;
+                      pel->next = el->next;
                       el->next = share.buckets[hash_num];
-                      el->next->prev = el;
                       share.buckets[hash_num] = el;
                    }
               }




-------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc. Do you grep through log files
for problems?  Stop!  Download the new AJAX search engine that makes
searching your log files as easy as surfing the  web.  DOWNLOAD SPLUNK!
http://ads.osdn.com/?ad_id=7637&alloc_id=16865&op=click
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to