};
static Eina_Hash *_eina_file_cache = NULL;
-static Eina_List *_eina_file_cache_lru = NULL;
-static Eina_List *_eina_file_cache_delete = NULL;
static Eina_Lock _eina_file_lock_cache;
static int _eina_file_log_dom = -1;
static void
_eina_file_real_close(Eina_File *file)
{
- if (file->refcount != 0) return ;
+ if (file->refcount != 0) return;
eina_hash_free(file->rmap);
eina_hash_free(file->map);
Eina_Bool
eina_file_shutdown(void)
{
- Eina_File *f;
- Eina_List *l;
-
- EINA_LIST_FREE(_eina_file_cache_delete, f)
- _eina_file_real_close(f);
-
- EINA_LIST_FOREACH(_eina_file_cache_lru, l, f)
- eina_hash_del(_eina_file_cache, f->filename, f);
-
if (eina_hash_population(_eina_file_cache) > 0)
{
Eina_Iterator *it;
struct stat file_stat;
int fd;
int flags;
- Eina_Bool create = EINA_FALSE;
/*
FIXME: always open absolute path
eina_lock_take(&_eina_file_lock_cache);
file = eina_hash_find(_eina_file_cache, filename);
- if (file && (file->mtime != file_stat.st_mtime
- || file->length != (unsigned long long) file_stat.st_size
- || file->inode != file_stat.st_ino))
+ if ((file) &&
+ ((file->mtime != file_stat.st_mtime) ||
+ (file->length != (unsigned long long) file_stat.st_size) ||
+ (file->inode != file_stat.st_ino)))
+ // FIXME: handle sub-second resolution correctness
{
- create = EINA_TRUE;
-
- if (file->refcount == 0)
- {
- _eina_file_cache_lru = eina_list_remove(_eina_file_cache_lru, file);
- eina_hash_del(_eina_file_cache, file->filename, file);
-
- file = NULL;
- }
- else if (!file->delete_me)
- {
- file->delete_me = EINA_TRUE;
- _eina_file_cache_delete = eina_list_prepend(_eina_file_cache_delete, file);
- }
+ file->delete_me = EINA_TRUE;
+ eina_hash_del(_eina_file_cache, file->filename, file);
+ file = NULL;
}
- if (!file || create)
+ if (!file)
{
n = malloc(sizeof (Eina_File) + strlen(filename) + 1);
if (!n) goto on_error;
n->shared = shared;
n->delete_me = EINA_FALSE;
eina_lock_new(&n->lock);
-
- if (file) eina_hash_del(_eina_file_cache, filename, file);
eina_hash_direct_add(_eina_file_cache, n->filename, n);
}
else
{
close(fd);
-
n = file;
-
- if (n->refcount == 0)
- _eina_file_cache_lru = eina_list_remove(_eina_file_cache_lru, n);
}
-
eina_lock_take(&n->lock);
n->refcount++;
eina_lock_release(&n->lock);
file->refcount--;
eina_lock_release(&file->lock);
- if (file->refcount != 0) return ;
-
- if (file->delete_me)
- {
- _eina_file_cache_delete = eina_list_remove(_eina_file_cache_delete,
- file);
- _eina_file_real_close(file);
- }
- else
- {
- _eina_file_cache_lru = eina_list_prepend(_eina_file_cache_lru, file);
- }
+ if (file->refcount != 0) return;
+ eina_hash_del(_eina_file_cache, file->filename, file);
}
EAPI size_t