summaryrefslogtreecommitdiff
path: root/src/lib/eina_file.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/eina_file.c')
-rw-r--r--src/lib/eina_file.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/src/lib/eina_file.c b/src/lib/eina_file.c
index 68a6cce..7fe6bb0 100644
--- a/src/lib/eina_file.c
+++ b/src/lib/eina_file.c
@@ -988,7 +988,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_real_close(file);
file = NULL;
}
@@ -1050,18 +1049,23 @@ eina_file_open(const char *path, Eina_Bool shared)
EAPI void
eina_file_close(Eina_File *file)
{
+ Eina_Bool leave = EINA_TRUE;
+
EINA_SAFETY_ON_NULL_RETURN(file);
+ eina_lock_take(&_eina_file_lock_cache);
+
eina_lock_take(&file->lock);
file->refcount--;
+ if (file->refcount == 0) leave = EINA_FALSE;
eina_lock_release(&file->lock);
+ if (leave) goto end;
- if (file->refcount != 0) return;
- eina_lock_take(&_eina_file_lock_cache);
-
- eina_hash_del(_eina_file_cache, file->filename, file);
+ if (eina_hash_find(_eina_file_cache, file->filename) == file)
+ eina_hash_del(_eina_file_cache, file->filename, file);
_eina_file_real_close(file);
+ end:
eina_lock_release(&_eina_file_lock_cache);
}