diff options
Diffstat (limited to 'src/lib/eina_file.c')
-rw-r--r-- | src/lib/eina_file.c | 14 |
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); } |