Enlightenment CVS committal

Author  : raster
Project : e17
Module  : libs/evas

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


Modified Files:
        evas_stringshare.c 


Log Message:


less overhead per string for stringshare (overhead right now is 2 pointers, 1
int (ie 12 bytes on 32bit, 20 bytes on 64bit systems). this removes 2 ptrs of
overhead (8 or 16 bytes) compared to before.

===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/evas/src/lib/data/evas_stringshare.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -3 -r1.1 -r1.2
--- evas_stringshare.c  28 Nov 2005 15:18:00 -0000      1.1
+++ evas_stringshare.c  29 Nov 2005 03:01:56 -0000      1.2
@@ -11,9 +11,8 @@
 
 struct _Evas_Stringshare_El
 {
-   Evas_Object_List  _list_data;
-   char             *str;
-   int               references;
+   int                  references;
+   Evas_Stringshare_El *next, *prev;
 };
 
 static inline int _evas_stringshare_hash_gen(const char *str);
@@ -59,55 +58,69 @@
 evas_stringshare_add(const char *str)
 {
    int hash_num;
+   char *el_str;
    Evas_Stringshare_El *el;
-   Evas_Object_List *l;
 
    hash_num = _evas_stringshare_hash_gen(str);
-   for (l = share.buckets[hash_num]; l; l = l->next)
+   for (el = share.buckets[hash_num]; el; el = el->next)
      {
-       el = (Evas_Stringshare_El *)l;
-       if (!strcmp(el->str, str))
+       el_str = ((char *)el) + sizeof(Evas_Stringshare_El);
+       if (!strcmp(el_str, str))
          {
-            if (l != share.buckets[hash_num])
+            if (el->prev)
               {
-                 share.buckets[hash_num] = 
evas_object_list_remove(share.buckets[hash_num], el);
-                 share.buckets[hash_num] = 
evas_object_list_prepend(share.buckets[hash_num], el);
+                 el->prev->next = el->next;
+                 if (el->next) el->next->prev = el->prev;
+                 el->prev = NULL;
+                 el->next = share.buckets[hash_num];
+                 share.buckets[hash_num] = el;
               }
             el->references++;
-            return el->str;
+            return el_str;
          }
      }
-   if (!(el = malloc(sizeof(struct _Evas_Stringshare_El) + strlen(str) + 1))) 
return NULL;
-   el->str = ((unsigned char *)el) + sizeof(struct _Evas_Stringshare_El);
-   strcpy(el->str, str);
+   if (!(el = malloc(sizeof(Evas_Stringshare_El) + strlen(str) + 1))) return 
NULL;
+   el_str = ((char *)el) + sizeof(Evas_Stringshare_El);
+   strcpy(el_str, str);
    el->references = 1;
-   share.buckets[hash_num] = evas_object_list_prepend(share.buckets[hash_num], 
el);
-   return el->str;
+   el->prev = NULL;
+   el->next = share.buckets[hash_num];
+   share.buckets[hash_num] = el;
+   return el_str;
 }
 
 void
 evas_stringshare_del(const char *str)
 {
    int hash_num;
+   char *el_str;
    Evas_Stringshare_El *el;
-   Evas_Object_List *l;
 
    hash_num = _evas_stringshare_hash_gen(str);
-   for (l = share.buckets[hash_num]; l; l = l->next)
+   for (el = share.buckets[hash_num]; el; el = el->next)
      {
-       el = (Evas_Stringshare_El *)l;
-       if (!strcmp(el->str, str))
+       el_str = ((char *)el) + sizeof(Evas_Stringshare_El);
+       if (!strcmp(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;
+                 else share.buckets[hash_num] = el->next;
                  share.buckets[hash_num] = 
evas_object_list_remove(share.buckets[hash_num], el);
                  free(el);
               }
             else
               {
-                 share.buckets[hash_num] = 
evas_object_list_remove(share.buckets[hash_num], el);
-                 share.buckets[hash_num] = 
evas_object_list_prepend(share.buckets[hash_num], el);
+                 if (el->prev)
+                   {
+                      el->prev->next = el->next;
+                      if (el->next) el->next->prev = el->prev;
+                      el->prev = NULL;
+                      el->next = share.buckets[hash_num];
+                      share.buckets[hash_num] = el;
+                   }
               }
             return;
          }




-------------------------------------------------------
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