eina: cleanup file destruction and reintroduce EINA_MAGIC use.

This commit is contained in:
Cedric Bail 2013-11-20 20:06:50 +09:00
parent 4096a18523
commit 0cfb40b7fb
4 changed files with 26 additions and 17 deletions

View File

@ -305,11 +305,6 @@ eina_file_real_close(Eina_File *file)
{ {
Eina_File_Map *map; 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) EINA_LIST_FREE(file->dead_map, map)
{ {
munmap(map->map, map->length); munmap(map->map, map->length);
@ -320,8 +315,6 @@ eina_file_real_close(Eina_File *file)
munmap(file->global_map, file->length); munmap(file->global_map, file->length);
if (file->fd != -1) close(file->fd); if (file->fd != -1) close(file->fd);
free(file);
} }
static void static void
@ -875,7 +868,7 @@ eina_file_open(const char *path, Eina_Bool shared)
{ {
file->delete_me = EINA_TRUE; file->delete_me = EINA_TRUE;
eina_hash_del(_eina_file_cache, file->filename, file); eina_hash_del(_eina_file_cache, file->filename, file);
eina_file_real_close(file); eina_file_clean_close(file);
file = NULL; file = NULL;
} }
@ -912,6 +905,8 @@ eina_file_open(const char *path, Eina_Bool shared)
n->shared = shared; n->shared = shared;
eina_lock_new(&n->lock); eina_lock_new(&n->lock);
eina_hash_direct_add(_eina_file_cache, n->filename, n); eina_hash_direct_add(_eina_file_cache, n->filename, n);
EINA_MAGIC_SET(n, EINA_FILE_MAGIC);
} }
else else
{ {

View File

@ -444,6 +444,21 @@ eina_file_dup(const Eina_File *f)
return file; 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 EAPI void
eina_file_close(Eina_File *file) 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); eina_hash_del(_eina_file_cache, file->filename, file);
// Backend specific file resource close eina_file_clean_close(file);
eina_file_real_close(file);
end: end:
eina_lock_release(&_eina_file_lock_cache); eina_lock_release(&_eina_file_lock_cache);
} }

View File

@ -24,11 +24,14 @@
#include "eina_lock.h" #include "eina_lock.h"
#include "eina_list.h" #include "eina_list.h"
#define EINA_FILE_MAGIC 0xFEEDBEEF
typedef struct _Eina_File_Map Eina_File_Map; typedef struct _Eina_File_Map Eina_File_Map;
typedef struct _Eina_Lines_Iterator Eina_Lines_Iterator; typedef struct _Eina_Lines_Iterator Eina_Lines_Iterator;
struct _Eina_File struct _Eina_File
{ {
EINA_MAGIC;
const char *filename; const char *filename;
Eina_Hash *map; Eina_Hash *map;
@ -121,6 +124,7 @@ struct _Eina_Lines_Iterator
Eina_Bool eina_file_path_relative(const char *path); Eina_Bool eina_file_path_relative(const char *path);
Eina_Tmpstr *eina_file_current_directory_get(const char *path, size_t len); Eina_Tmpstr *eina_file_current_directory_get(const char *path, size_t len);
char *eina_file_cleanup(Eina_Tmpstr *path); 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_real_close(Eina_File *file);
void eina_file_flush(Eina_File *file, unsigned long int length); void eina_file_flush(Eina_File *file, unsigned long int length);
void eina_file_common_map_free(Eina_File *file, void *map, void eina_file_common_map_free(Eina_File *file, void *map,

View File

@ -366,9 +366,6 @@ eina_file_real_close(Eina_File *file)
{ {
Eina_File_Map *map; Eina_File_Map *map;
eina_hash_free(file->rmap);
eina_hash_free(file->map);
EINA_LIST_FREE(file->dead_map, map) EINA_LIST_FREE(file->dead_map, map)
{ {
UnmapViewOfFile(map->map); UnmapViewOfFile(map->map);
@ -380,8 +377,6 @@ eina_file_real_close(Eina_File *file)
if (file->fm) CloseHandle(file->fm); if (file->fm) CloseHandle(file->fm);
if (file->handle) CloseHandle(file->handle); if (file->handle) CloseHandle(file->handle);
free(file);
} }
static void static void
@ -807,7 +802,7 @@ eina_file_open(const char *path, Eina_Bool shared)
{ {
file->delete_me = EINA_TRUE; file->delete_me = EINA_TRUE;
eina_hash_del(_eina_file_cache, file->filename, file); eina_hash_del(_eina_file_cache, file->filename, file);
eina_file_real_close(file); eina_file_clean_close(file);
file = NULL; file = NULL;
} }
@ -837,6 +832,8 @@ eina_file_open(const char *path, Eina_Bool shared)
n->shared = shared; n->shared = shared;
eina_lock_new(&n->lock); eina_lock_new(&n->lock);
eina_hash_direct_add(_eina_file_cache, n->filename, n); eina_hash_direct_add(_eina_file_cache, n->filename, n);
EINA_MAGIC_SET(n, EINA_FILE_MAGIC);
} }
else else
{ {