//#define CACHEDUMP 1
-#ifdef EVAS_CSERVE2
+#ifdef EVAS_CSERVE
// FIXME: cache server and threaded preload clash badly atm - disable
-#undef BUILD_ASYNC_PRELOAD
+//#undef BUILD_ASYNC_PRELOAD
#endif
#ifdef BUILD_ASYNC_PRELOAD
_evas_cache_image_lru_nodata_del(im);
im->flags.dirty = 1;
im->flags.cached = 1;
+#ifdef EVAS_FRAME_QUEUING
+ LKL(im->cache->lock);
+#endif
im->cache->dirty = eina_inlist_prepend(im->cache->dirty, EINA_INLIST_GET(im));
+#ifdef EVAS_FRAME_QUEUING
+ LKU(im->cache->lock);
+#endif
if (im->cache_key)
{
eina_stringshare_del(im->cache_key);
if (!im->flags.dirty) return;
im->flags.dirty = 0;
im->flags.cached = 0;
+#ifdef EVAS_FRAME_QUEUING
+ LKL(im->cache->lock);
+#endif
im->cache->dirty = eina_inlist_remove(im->cache->dirty, EINA_INLIST_GET(im));
+#ifdef EVAS_FRAME_QUEUING
+ LKU(im->cache->lock);
+#endif
}
static void
if (!im->cache_key) return;
im->flags.activ = 1;
im->flags.cached = 1;
+#ifdef EVAS_FRAME_QUEUING
+ LKL(im->cache->lock);
+#endif
eina_hash_direct_add(im->cache->activ, im->cache_key, im);
+#ifdef EVAS_FRAME_QUEUING
+ LKU(im->cache->lock);
+#endif
}
static void
if (!im->cache_key) return;
im->flags.activ = 0;
im->flags.cached = 0;
+#ifdef EVAS_FRAME_QUEUING
+ LKL(im->cache->lock);
+#endif
eina_hash_del(im->cache->activ, im->cache_key, im);
+#ifdef EVAS_FRAME_QUEUING
+ LKU(im->cache->lock);
+#endif
}
static void
if (!im->cache_key) return;
im->flags.lru = 1;
im->flags.cached = 1;
+#ifdef EVAS_FRAME_QUEUING
+ LKL(im->cache->lock);
+#endif
eina_hash_direct_add(im->cache->inactiv, im->cache_key, im);
im->cache->lru = eina_inlist_prepend(im->cache->lru, EINA_INLIST_GET(im));
im->cache->usage += im->cache->func.mem_size_get(im);
+#ifdef EVAS_FRAME_QUEUING
+ LKU(im->cache->lock);
+#endif
}
static void
if (!im->cache_key) return;
im->flags.lru = 0;
im->flags.cached = 0;
+#ifdef EVAS_FRAME_QUEUING
+ LKL(im->cache->lock);
+#endif
eina_hash_del(im->cache->inactiv, im->cache_key, im);
im->cache->lru = eina_inlist_remove(im->cache->lru, EINA_INLIST_GET(im));
im->cache->usage -= im->cache->func.mem_size_get(im);
+#ifdef EVAS_FRAME_QUEUING
+ LKU(im->cache->lock);
+#endif
}
static void
_evas_cache_image_lru_del(im);
im->flags.lru = 1;
im->flags.cached = 1;
+#ifdef EVAS_FRAME_QUEUING
+ LKL(im->cache->lock);
+#endif
im->cache->lru_nodata = eina_inlist_prepend(im->cache->lru_nodata, EINA_INLIST_GET(im));
+#ifdef EVAS_FRAME_QUEUING
+ LKU(im->cache->lock);
+#endif
}
static void
if (!im->flags.lru_nodata) return;
im->flags.lru = 0;
im->flags.cached = 0;
+#ifdef EVAS_FRAME_QUEUING
+ LKL(im->cache->lock);
+#endif
im->cache->lru_nodata = eina_inlist_remove(im->cache->lru_nodata, EINA_INLIST_GET(im));
+#ifdef EVAS_FRAME_QUEUING
+ LKU(im->cache->lock);
+#endif
}
static void
LKD(ie->lock);
LKD(ie->lock_cancel);
#endif
+#ifdef EVAS_FRAME_QUEUING
+ LKD(ie->lock_references);
+#endif
cache->func.dealloc(ie);
}
if (tstamp) ie->tstamp = *tstamp;
else memset(&ie->tstamp, 0, sizeof(Image_Timestamp));
+#ifdef EVAS_FRAME_QUEUING
+ LKI(ie->lock_references);
+#endif
#ifdef BUILD_ASYNC_PRELOAD
LKI(ie->lock);
LKI(ie->lock_cancel);
return;
}
if (ie->flags.loaded) _evas_cache_image_async_end(ie);
+#ifdef EVAS_FRAME_QUEUING
+ LKL(ie->lock_references);
+#endif
if (ie->references == 0)
{
_evas_cache_image_lru_add(ie);
cache = ie->cache;
}
+#ifdef EVAS_FRAME_QUEUING
+ LKU(ie->lock_references);
+#endif
if (cache) evas_cache_image_flush(cache);
}
EAPI void
evas_cache_image_set(Evas_Cache_Image *cache, unsigned int limit)
{
+#ifdef EVAS_FRAME_QUEUING
+ LKL(cache->lock);
+#endif
if (cache->limit == limit)
{
+#ifdef EVAS_FRAME_QUEUING
+ LKU(cache->lock);
+#endif
return;
}
cache->limit = limit;
+#ifdef EVAS_FRAME_QUEUING
+ LKU(cache->lock);
+#endif
evas_cache_image_flush(cache);
}
cache->inactiv = eina_hash_string_superfast_new(NULL);
cache->activ = eina_hash_string_superfast_new(NULL);
cache->references = 1;
+#ifdef EVAS_FRAME_QUEUING
+ LKI(cache->lock);
+#endif
return cache;
}
Eina_List *delete_list;
Image_Entry *im;
+#ifdef EVAS_FRAME_QUEUING
+ LKL(cache->lock);
+#endif
cache->references--;
if (cache->references != 0)
{
+#ifdef EVAS_FRAME_QUEUING
+ LKU(cache->lock);
+#endif
return;
}
+#ifdef EVAS_FRAME_QUEUING
+ /* Release and destroy lock early ! */
+ LKU(cache->lock);
+ LKD(cache->lock);
+#endif
#ifdef BUILD_ASYNC_PRELOAD
EINA_LIST_FREE(cache->preload, im)
hkey[size] = '\0';
/* find image by key in active hash */
+#ifdef EVAS_FRAME_QUEUING
+ LKL(cache->lock);
+#endif
im = eina_hash_find(cache->activ, hkey);
+#ifdef EVAS_FRAME_QUEUING
+ LKU(cache->lock);
+#endif
if (im)
{
int ok = 1;
}
/* find image by key in inactive/lru hash */
+#ifdef EVAS_FRAME_QUEUING
+ LKL(cache->lock);
+#endif
im = eina_hash_find(cache->inactiv, hkey);
+#ifdef EVAS_FRAME_QUEUING
+ LKU(cache->lock);
+#endif
if (im)
{
int ok = 1;
on_ok:
*error = EVAS_LOAD_ERROR_NONE;
+#ifdef EVAS_FRAME_QUEUING
+ LKL(im->lock_references);
+#endif
im->references++;
+#ifdef EVAS_FRAME_QUEUING
+ LKU(im->lock_references);
+#endif
return im;
on_stat_error:
Evas_Cache_Image *cache;
int references;
+#ifdef EVAS_FRAME_QUEUING
+ LKL(im->lock_references);
+#endif
im->references--;
if (im->references < 0) im->references = 0;
references = im->references;
+#ifdef EVAS_FRAME_QUEUING
+ LKU(im->lock_references);
+#endif
cache = im->cache;
if (references == 0)
{
+#ifdef EVAS_FRAME_QUEUING
+ LKL(im->ref_fq_add);
+ LKL(im->ref_fq_del);
+ if (im->ref_fq[0] != im->ref_fq[1])
+ {
+ LKU(im->ref_fq_add);
+ LKU(im->ref_fq_del);
+ return;
+ }
+ LKU(im->ref_fq_add);
+ LKU(im->ref_fq_del);
+#endif
+
#ifdef BUILD_ASYNC_PRELOAD
if (im->preload)
{
{
int references;
+#ifdef EVAS_FRAME_QUEUING
+ LKL(im->lock_references);
+#endif
references = im->references;
+#ifdef EVAS_FRAME_QUEUING
+ LKU(im->lock_references);
+#endif
if (references > 1) return;
if ((im->flags.dirty) || (!im->flags.need_data)) return;
_evas_cache_image_lru_nodata_add(im);
{
#ifndef EVAS_CSERVE
int references;
+#ifdef EVAS_FRAME_QUEUING
+ LKL(im->lock_references);
+#endif
references = im->references;
+#ifdef EVAS_FRAME_QUEUING
+ LKU(im->lock_references);
+#endif
// if ref 1 also copy if using shared cache as its read-only
if (references == 1) im_dirty = im;
else
if (cache->func.debug) cache->func.debug("dirty-src", im);
cache->func.dirty(im_dirty, im);
if (cache->func.debug) cache->func.debug("dirty-out", im_dirty);
+#ifdef EVAS_FRAME_QUEUING
+ LKL(im_dirty->lock_references);
+#endif
im_dirty->references = 1;
+#ifdef EVAS_FRAME_QUEUING
+ LKU(im_dirty->lock_references);
+#endif
evas_cache_image_drop(im);
}
_evas_cache_image_dirty_add(im_dirty);
int references;
cache = im->cache;
+#ifdef EVAS_FRAME_QUEUING
+ LKL(im->lock_references);
+#endif
references = im->references;
+#ifdef EVAS_FRAME_QUEUING
+ LKU(im->lock_references);
+#endif
if (references <= 1)
{
if (cache->func.debug) cache->func.debug("dirty-src", im);
cache->func.dirty(im_dirty, im);
if (cache->func.debug) cache->func.debug("dirty-out", im_dirty);
+#ifdef EVAS_FRAME_QUEUING
+ LKL(im_dirty->lock_references);
+#endif
im_dirty->references = 1;
+#ifdef EVAS_FRAME_QUEUING
+ LKU(im_dirty->lock_references);
+#endif
evas_cache_image_drop(im);
}
return im_dirty;
_evas_cache_image_entry_delete(cache, im);
return NULL;
}
+#ifdef EVAS_FRAME_QUEUING
+ LKL(im->lock_references);
+#endif
im->references = 1;
+#ifdef EVAS_FRAME_QUEUING
+ LKU(im->lock_references);
+#endif
if (cache->func.debug) cache->func.debug("copied-data", im);
return im;
}
_evas_cache_image_entry_delete(cache, im);
return NULL;
}
+#ifdef EVAS_FRAME_QUEUING
+ LKL(im->lock_references);
+#endif
im->references = 1;
+#ifdef EVAS_FRAME_QUEUING
+ LKU(im->lock_references);
+#endif
if (cache->func.debug) cache->func.debug("data", im);
return im;
}
_evas_cache_image_entry_surface_alloc(cache, im2, w, h);
error = cache->func.size_set(im2, im, w, h);
if (error != 0) goto on_error;
+#ifdef EVAS_FRAME_QUEUING
+ LKL(im2->lock_references);
+#endif
im2->references = 1;
+#ifdef EVAS_FRAME_QUEUING
+ LKU(im2->lock_references);
+#endif
evas_cache_image_drop(im);
if (cache->func.debug) cache->func.debug("size_set", im2);
return im2;
im = _evas_cache_image_entry_new(cache, NULL, NULL, NULL, NULL, NULL, NULL);
if (!im) return NULL;
+#ifdef EVAS_FRAME_QUEUING
+ LKL(im->lock_references);
+#endif
im->references = 1;
+#ifdef EVAS_FRAME_QUEUING
+ LKU(im->lock_references);
+#endif
return im;
}