eina: fix the crash seen by some during rebuild.
authorCedric Bail <cedric.bail@samsung.com>
Thu, 21 Nov 2013 05:46:59 +0000 (14:46 +0900)
committerCedric Bail <cedric.bail@samsung.com>
Thu, 21 Nov 2013 05:49:08 +0000 (14:49 +0900)
Before this patch, we were unconditionnaly destroying the Eina_File if that one
did change on disk. We also make sure that we remove the right entry from the cache
if the file did change there.

src/lib/eina/eina_file.c
src/lib/eina/eina_file_common.c

index 1ae3681..ca2fe61 100644 (file)
@@ -868,7 +868,6 @@ eina_file_open(const char *path, Eina_Bool shared)
      {
         file->delete_me = EINA_TRUE;
         eina_hash_del(_eina_file_cache, file->filename, file);
-       eina_file_clean_close(file);
         file = NULL;
      }
 
index 7952190..f6ae3be 100644 (file)
@@ -463,6 +463,8 @@ EAPI void
 eina_file_close(Eina_File *file)
 {
    Eina_Bool leave = EINA_TRUE;
+   unsigned int length;
+   unsigned int key;
 
    EINA_SAFETY_ON_NULL_RETURN(file);
 
@@ -474,7 +476,14 @@ eina_file_close(Eina_File *file)
    eina_lock_release(&file->lock);
    if (leave) goto end;
 
-   eina_hash_del(_eina_file_cache, file->filename, file);
+   length = strlen(file->filename) + 1;
+   key = eina_hash_djb2(file->filename, length);
+   if (eina_hash_find_by_hash(_eina_file_cache,
+                              file->filename, length, key) == file)
+     {
+        eina_hash_del_by_key_hash(_eina_file_cache,
+                                  file->filename, length, key);
+     }
 
    eina_file_clean_close(file);
  end: