eina: cleanup file destruction and reintroduce EINA_MAGIC use.
authorCedric Bail <cedric.bail@samsung.com>
Wed, 20 Nov 2013 11:06:50 +0000 (20:06 +0900)
committerCedric Bail <cedric.bail@samsung.com>
Wed, 20 Nov 2013 11:08:44 +0000 (20:08 +0900)
src/lib/eina/eina_file.c
src/lib/eina/eina_file_common.c
src/lib/eina/eina_file_common.h
src/lib/eina/eina_file_win32.c

index 6d7ee56..1ae3681 100644 (file)
@@ -305,11 +305,6 @@ eina_file_real_close(Eina_File *file)
 {
    Eina_File_Map *map;
 
-   if (file->refcount != 0) return;
-
-   eina_hash_free(file->rmap);
-   eina_hash_free(file->map);
-
    EINA_LIST_FREE(file->dead_map, map)
      {
         munmap(map->map, map->length);
@@ -320,8 +315,6 @@ eina_file_real_close(Eina_File *file)
      munmap(file->global_map, file->length);
 
    if (file->fd != -1) close(file->fd);
-
-   free(file);
 }
 
 static void
@@ -875,7 +868,7 @@ 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_real_close(file);
+       eina_file_clean_close(file);
         file = NULL;
      }
 
@@ -912,6 +905,8 @@ eina_file_open(const char *path, Eina_Bool shared)
         n->shared = shared;
         eina_lock_new(&n->lock);
         eina_hash_direct_add(_eina_file_cache, n->filename, n);
+
+       EINA_MAGIC_SET(n, EINA_FILE_MAGIC);
      }
    else
      {
index 7f83c87..7952190 100644 (file)
@@ -444,6 +444,21 @@ eina_file_dup(const Eina_File *f)
    return file;
 }
 
+void
+eina_file_clean_close(Eina_File *file)
+{
+   // Generic destruction of the file
+   eina_hash_free(file->rmap); file->rmap = NULL;
+   eina_hash_free(file->map); file->map = NULL;
+
+   // Backend specific file resource close
+   eina_file_real_close(file);
+
+   // Final death
+   EINA_MAGIC_SET(file, 0);
+   free(file);   
+}
+
 EAPI void
 eina_file_close(Eina_File *file)
 {
@@ -461,9 +476,7 @@ eina_file_close(Eina_File *file)
 
    eina_hash_del(_eina_file_cache, file->filename, file);
 
-   // Backend specific file resource close
-   eina_file_real_close(file);
-
+   eina_file_clean_close(file);
  end:
    eina_lock_release(&_eina_file_lock_cache);
 }
index 0ac704d..62ad2b2 100644 (file)
 #include "eina_lock.h"
 #include "eina_list.h"
 
+#define EINA_FILE_MAGIC 0xFEEDBEEF
+
 typedef struct _Eina_File_Map Eina_File_Map;
 typedef struct _Eina_Lines_Iterator Eina_Lines_Iterator;
 
 struct _Eina_File
 {
+   EINA_MAGIC;
    const char *filename;
 
    Eina_Hash *map;
@@ -121,6 +124,7 @@ struct _Eina_Lines_Iterator
 Eina_Bool eina_file_path_relative(const char *path);
 Eina_Tmpstr *eina_file_current_directory_get(const char *path, size_t len);
 char *eina_file_cleanup(Eina_Tmpstr *path);
+void eina_file_clean_close(Eina_File *file);
 void eina_file_real_close(Eina_File *file);
 void eina_file_flush(Eina_File *file, unsigned long int length);
 void eina_file_common_map_free(Eina_File *file, void *map,
index cddf2da..7cb108d 100644 (file)
@@ -366,9 +366,6 @@ eina_file_real_close(Eina_File *file)
 {
    Eina_File_Map *map;
 
-   eina_hash_free(file->rmap);
-   eina_hash_free(file->map);
-
    EINA_LIST_FREE(file->dead_map, map)
      {
         UnmapViewOfFile(map->map);
@@ -380,8 +377,6 @@ eina_file_real_close(Eina_File *file)
 
    if (file->fm) CloseHandle(file->fm);
    if (file->handle) CloseHandle(file->handle);
-
-   free(file);
 }
 
 static void
@@ -807,7 +802,7 @@ 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_real_close(file);
+        eina_file_clean_close(file);
         file = NULL;
      }
 
@@ -837,6 +832,8 @@ eina_file_open(const char *path, Eina_Bool shared)
         n->shared = shared;
         eina_lock_new(&n->lock);
         eina_hash_direct_add(_eina_file_cache, n->filename, n);
+
+       EINA_MAGIC_SET(n, EINA_FILE_MAGIC);
      }
    else
      {