return cache;
}
+static Eina_Bool
+_evas_cache_image_free_cb(__UNUSED__ const Eina_Hash *hash, __UNUSED__ const void *key, void *data, void *fdata)
+{
+ Eina_List **delete_list = fdata;
+ *delete_list = eina_list_prepend(*delete_list, data);
+ return EINA_TRUE;
+}
+
EAPI void
evas_cache2_shutdown(Evas_Cache2 *cache)
{
+ Eina_List *delete_list;
+ Image_Entry *im;
+
+ while (cache->lru)
+ {
+ im = (Image_Entry *)cache->lru;
+ _evas_cache_image_entry_delete(cache, im);
+ }
+ /* This is mad, I am about to destroy image still alive, but we need to prevent leak. */
+ while (cache->dirty)
+ {
+ im = (Image_Entry *)cache->dirty;
+ _evas_cache_image_entry_delete(cache, im);
+ }
+
+ delete_list = NULL;
+ eina_hash_foreach(cache->activ, _evas_cache_image_free_cb, &delete_list);
+ while (delete_list)
+ {
+ _evas_cache_image_entry_delete(cache, eina_list_data_get(delete_list));
+ delete_list = eina_list_remove_list(delete_list, delete_list);
+ }
+
eina_hash_free(cache->activ);
eina_hash_free(cache->inactiv);
Image_Entry *ie = data;
Data_Entry *dentry = ie->data2;
const char *shmpath;
- int fd;
ie->load_rid = 0;
dentry->shm.mmap_size = msg->shm.mmap_size;
dentry->shm.image_size = msg->shm.image_size;
- fd = shm_open(shmpath, O_RDONLY, S_IRUSR);
- if (fd < 0)
+ dentry->shm.f = eina_file_open(shmpath, EINA_TRUE);
+ if (!dentry->shm.f)
{
free(dentry);
ie->data2 = NULL;
return;
}
- dentry->shm.data = mmap(NULL, dentry->shm.mmap_size, PROT_READ,
- MAP_SHARED, fd, dentry->shm.mmap_offset);
+ dentry->shm.data = eina_file_map_new(dentry->shm.f, EINA_FILE_WILLNEED,
+ dentry->shm.mmap_offset,
+ dentry->shm.mmap_size);
- if (dentry->shm.data == MAP_FAILED)
+ if (!dentry->shm.data)
{
+ eina_file_close(dentry->shm.f);
free(dentry);
ie->data2 = NULL;
}
- close(fd);
-
if (ie->data2)
{
ie->flags.loaded = EINA_TRUE;
if (ie->data2)
{
+ Data_Entry *dentry = ie->data2;
+ if (dentry->shm.data)
+ eina_file_map_free(dentry->shm.f, dentry->shm.data);
+ if (dentry->shm.f)
+ eina_file_close(dentry->shm.f);
free(ie->data2);
ie->data2 = NULL;
}
dentry = ie->data2;
+ if (dentry->shm.data)
+ eina_file_map_free(dentry->shm.f, dentry->shm.data);
+ if (dentry->shm.f)
+ eina_file_close(dentry->shm.f);
+
// if (dentry->shm.path)
// free(dentry->shm.path);
memset(&msg, 0, sizeof(msg));