cedric pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=0cfb40b7fb03a96973fe27542b4a5a739eca4386

commit 0cfb40b7fb03a96973fe27542b4a5a739eca4386
Author: Cedric Bail <cedric.b...@samsung.com>
Date:   Wed Nov 20 20:06:50 2013 +0900

    eina: cleanup file destruction and reintroduce EINA_MAGIC use.
---
 src/lib/eina/eina_file.c        | 11 +++--------
 src/lib/eina/eina_file_common.c | 19 ++++++++++++++++---
 src/lib/eina/eina_file_common.h |  4 ++++
 src/lib/eina/eina_file_win32.c  |  9 +++------
 4 files changed, 26 insertions(+), 17 deletions(-)

diff --git a/src/lib/eina/eina_file.c b/src/lib/eina/eina_file.c
index 6d7ee56..1ae3681 100644
--- a/src/lib/eina/eina_file.c
+++ b/src/lib/eina/eina_file.c
@@ -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
      {
diff --git a/src/lib/eina/eina_file_common.c b/src/lib/eina/eina_file_common.c
index 7f83c87..7952190 100644
--- a/src/lib/eina/eina_file_common.c
+++ b/src/lib/eina/eina_file_common.c
@@ -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);
 }
diff --git a/src/lib/eina/eina_file_common.h b/src/lib/eina/eina_file_common.h
index 0ac704d..62ad2b2 100644
--- a/src/lib/eina/eina_file_common.h
+++ b/src/lib/eina/eina_file_common.h
@@ -24,11 +24,14 @@
 #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,
diff --git a/src/lib/eina/eina_file_win32.c b/src/lib/eina/eina_file_win32.c
index cddf2da..7cb108d 100644
--- a/src/lib/eina/eina_file_win32.c
+++ b/src/lib/eina/eina_file_win32.c
@@ -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
      {

-- 


Reply via email to