Enlightenment CVS committal

Author  : raster
Project : e17
Module  : libs/eet

Dir     : e17/libs/eet/src/lib


Modified Files:
        eet_lib.c 


Log Message:


cacheburst works again

===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/eet/src/lib/eet_lib.c,v
retrieving revision 1.48
retrieving revision 1.49
diff -u -3 -r1.48 -r1.49
--- eet_lib.c   3 Nov 2005 13:05:52 -0000       1.48
+++ eet_lib.c   3 Nov 2005 15:05:21 -0000       1.49
@@ -27,7 +27,8 @@
    FILE            *fp;
    Eet_File_Mode    mode;
 
-   int              writes_pending : 1;
+   unsigned char    writes_pending : 1;
+   unsigned char    delete_me_now : 1;
 
    Eet_File_Header *header;
 };
@@ -101,7 +102,10 @@
    for (i = 0; i < cache_num; i++)
      {
        /* if matches real path - return it */
-       if (eet_string_match(cache[i]->real_path, real_path)) return cache[i];
+       if (eet_string_match(cache[i]->real_path, real_path))
+         {
+            if (!cache[i]->delete_me_now) return cache[i];
+         }
      }
    /* not found */
    return NULL;
@@ -339,6 +343,24 @@
    ef->writes_pending = 0;
 }
 
+int
+eet_init(void)
+{
+   return ++eet_initcount;
+}
+
+int
+eet_shutdown(void)
+{
+   if (--eet_initcount == 0)
+     {
+       eet_cacheburst(0);
+       _eet_memfile_shutdown();
+     }
+
+   return eet_initcount;
+}
+
 void
 eet_cacheburst(int on)
 {
@@ -414,9 +436,21 @@
    /* find the current file handle in cache*/
    ef = NULL;
    if (mode == EET_FILE_MODE_READ)
-     ef = eet_cache_find(buf, eet_readers, eet_readers_num);
+     {
+       ef = eet_cache_find(buf, eet_writers, eet_writers_num);
+       if (ef)
+         {
+            eet_flush(ef);
+            ef->delete_me_now = 1;
+         }
+       ef = eet_cache_find(buf, eet_readers, eet_readers_num);
+     }
    else if ((mode == EET_FILE_MODE_WRITE) || (mode == 
EET_FILE_MODE_READ_WRITE))
-     ef = eet_cache_find(buf, eet_writers, eet_writers_num);
+     {
+       ef = eet_cache_find(buf, eet_readers, eet_readers_num);
+       if (ef) ef->delete_me_now = 1;
+       ef = eet_cache_find(buf, eet_writers, eet_writers_num);
+     }
    /* we found one */
    if (ef)
      {
@@ -447,6 +481,7 @@
      }
    else
      {
+       ef->delete_me_now = 1;
        eet_close(ef);
        return NULL;
      }
@@ -454,6 +489,7 @@
    /* if we can't open - bail out */
    if (!ef->fp)
      {
+       ef->delete_me_now = 1;
        eet_close(ef);
        return NULL;
      }
@@ -494,12 +530,14 @@
        /* we cant have <= 0 values here - invalid */
        if ((num_entries <= 0) || (byte_entries <= 0))
          {
+            ef->delete_me_now = 1;
             eet_close(ef);
             return NULL;
          }
        /* we can't have more entires than minimum bytes for those! invalid! */
        if ((num_entries * 20) > byte_entries)
          {
+            ef->delete_me_now = 1;
             eet_close(ef);
             return NULL;
          }
@@ -507,6 +545,7 @@
        dyn_buf = malloc(byte_entries);
        if (!dyn_buf)
          {
+            ef->delete_me_now = 1;
             eet_close(ef);
             return NULL;
          }
@@ -514,6 +553,7 @@
        ef->header = calloc(1, sizeof(Eet_File_Header));
        if (!ef->header)
          {
+            ef->delete_me_now = 1;
             free(dyn_buf);
             eet_close(ef);
             return NULL;
@@ -523,6 +563,7 @@
        ef->header->directory = calloc(1, sizeof(Eet_File_Directory));
        if (!ef->header->directory)
          {
+            ef->delete_me_now = 1;
             free(dyn_buf);
             eet_close(ef);
             return NULL;
@@ -533,6 +574,7 @@
        ef->header->directory->nodes = calloc(1, sizeof(Eet_File_Node *) * (1 
<< ef->header->directory->size));
        if (!ef->header->directory->nodes)
          {
+            ef->delete_me_now = 1;
             free(dyn_buf);
             eet_close(ef);
             return NULL;
@@ -541,6 +583,7 @@
        count = fread(dyn_buf, byte_entries, 1, ef->fp);
        if (count != 1)
          {
+            ef->delete_me_now = 1;
             free(dyn_buf);
             eet_close(ef);
             return NULL;
@@ -564,6 +607,7 @@
             /* dynamic block buffer before we finished scanning dir entries */
             if (p >= (dyn_buf + byte_entries))
               {
+                 ef->delete_me_now = 1;
                  free(dyn_buf);
                  eet_close(ef);
                  return NULL;
@@ -594,6 +638,7 @@
             /* invalid name_size */
             if (name_size <= 0)
               {
+                 ef->delete_me_now = 1;
                  free(dyn_buf);
                  eet_close(ef);
                  return NULL;
@@ -601,6 +646,7 @@
             /* reading name would mean falling off end of dyn_buf - invalid */
             if ((p + 16 + name_size) > (dyn_buf + byte_entries))
               {
+                 ef->delete_me_now = 1;
                  free(dyn_buf);
                  eet_close(ef);
                  return NULL;
@@ -609,6 +655,7 @@
             name = malloc(name_size + 1);
             if (!name)
               {
+                 ef->delete_me_now = 1;
                  free(dyn_buf);
                  eet_close(ef);
                  return NULL;
@@ -621,6 +668,7 @@
             efn = calloc(1, sizeof(Eet_File_Node));
             if (!efn)
               {
+                 ef->delete_me_now = 1;
                  free(dyn_buf);
                  eet_close(ef);
                  return NULL;
@@ -676,10 +724,13 @@
      }
 
    /* add to cache */
-   if (ef->mode == EET_FILE_MODE_READ)
-     eet_cache_add(ef, &eet_readers, &eet_readers_num, &eet_readers_alloc);
-   else if ((ef->mode == EET_FILE_MODE_WRITE) || (ef->mode == 
EET_FILE_MODE_READ_WRITE))
-     eet_cache_add(ef, &eet_writers, &eet_writers_num, &eet_writers_alloc);
+   if (ef->references == 1)
+     {
+       if (ef->mode == EET_FILE_MODE_READ)
+         eet_cache_add(ef, &eet_readers, &eet_readers_num, &eet_readers_alloc);
+       else if ((ef->mode == EET_FILE_MODE_WRITE) || (ef->mode == 
EET_FILE_MODE_READ_WRITE))
+         eet_cache_add(ef, &eet_writers, &eet_writers_num, &eet_writers_alloc);
+     }
    return ef;
 }
 
@@ -702,9 +753,12 @@
    /* deref */
    ef->references--;
    /* if its still referenced - dont go any further */
-   if (ef->references != 0) return;
+   if (ef->references > 0) return;
    /* if we are in cacheburst mode - dont free it - leave it in cache */
-   if (eet_cacheburst_mode) return;
+   if (eet_cacheburst_mode)
+     {
+       if (!ef->delete_me_now) return;
+     }
    /* remove from cache */
    if (ef->mode == EET_FILE_MODE_READ)
      eet_cache_del(ef, &eet_readers, &eet_readers_num, &eet_readers_alloc);
@@ -1127,16 +1181,3 @@
 
    return ret;
 }
-
-int eet_init(void)
-{
-   return ++eet_initcount;
-}
-
-int eet_shutdown(void)
-{
-   if (--eet_initcount == 0)
-      _eet_memfile_shutdown();
-
-   return eet_initcount;
-}




-------------------------------------------------------
SF.Net email is sponsored by:
Tame your development challenges with Apache's Geronimo App Server. Download
it for free - -and be entered to win a 42" plasma tv or your very own
Sony(tm)PSP.  Click here to play: http://sourceforge.net/geronimo.php
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to