29 #define DISABLE_DEBUGLOG
31 #include "multicache_p.h"
33 #include <gwenhywfar/debug.h>
45 GWEN_MULTICACHE_ENTRY *e;
189 assert(ct->_refCount);
190 if (ct->_refCount==1) {
192 GWEN_MultiCache_Entry_IdMap_free(ct->entryMap);
205 GWEN_MULTICACHE_ENTRY *e;
208 assert(ct->_refCount);
210 e=(GWEN_MULTICACHE_ENTRY*)GWEN_MultiCache_Entry_IdMap_Find(ct->entryMap,
id);
227 uint32_t param1, uint32_t param2, uint32_t param3, uint32_t param4) {
229 GWEN_MULTICACHE_ENTRY *e;
232 assert(ct->_refCount);
234 e=(GWEN_MULTICACHE_ENTRY*)GWEN_MultiCache_Entry_IdMap_Find(ct->entryMap,
id);
256 uint32_t param1, uint32_t param2, uint32_t param3, uint32_t param4,
259 GWEN_MULTICACHE_ENTRY *e;
262 assert(ct->_refCount);
264 e=(GWEN_MULTICACHE_ENTRY*)GWEN_MultiCache_Entry_IdMap_Find(ct->entryMap,
id);
287 GWEN_MULTICACHE_ENTRY *e;
290 assert(ct->_refCount);
295 GWEN_MultiCache_Entry_IdMap_Insert(ct->entryMap,
id, (
void*) e);
301 uint32_t param1, uint32_t param2, uint32_t param3, uint32_t param4) {
302 GWEN_MULTICACHE_ENTRY *e;
305 assert(ct->_refCount);
315 GWEN_MultiCache_Entry_IdMap_Insert(ct->entryMap,
id, (
void*) e);
321 uint32_t param1, uint32_t param2, uint32_t param3, uint32_t param4,
323 GWEN_MULTICACHE_ENTRY *e;
326 assert(ct->_refCount);
337 GWEN_MultiCache_Entry_IdMap_Insert(ct->entryMap,
id, (
void*) e);
343 GWEN_MULTICACHE_ENTRY *e;
346 assert(ct->_refCount);
348 e=(GWEN_MULTICACHE_ENTRY*)GWEN_MultiCache_Entry_IdMap_Find(ct->entryMap,
id);
357 assert(ct->_refCount);
366 assert(ct->_refCount);
375 assert(ct->_refCount);
384 assert(ct->_refCount);
386 ct->attachObjectFn=fn;
393 assert(ct->_refCount);
402 assert(ct->_refCount);
405 if (ct->attachObjectFn)
406 return ct->attachObjectFn(ct, p);
409 return ct->attachFn(p);
418 assert(ct->_refCount);
421 if (ct->freeObjectFn)
422 return ct->freeObjectFn(ct, p);
425 return ct->freeFn(p);
433 assert(ct->_refCount);
452 mc->typeList=GWEN_MultiCache_Type_List_new();
453 mc->entryList=GWEN_MultiCache_Entry_List_new();
462 assert(mc->_refCount);
464 if (mc->_refCount==1) {
465 GWEN_MULTICACHE_ENTRY *ce;
467 ce=GWEN_MultiCache_Entry_List_First(mc->entryList);
470 ce=GWEN_MultiCache_Entry_List_First(mc->entryList);
473 GWEN_MultiCache_Entry_List_free(mc->entryList);
474 GWEN_MultiCache_Type_List_free(mc->typeList);
476 DBG_NOTICE(
GWEN_LOGDOMAIN,
"MultiCache usage: %lld hits, %lld misses, %lld drops, %lld mb max memory used from %lld mb (%d %%)",
477 (
unsigned long long int) mc->cacheHits,
478 (
unsigned long long int) mc->cacheMisses,
479 (
unsigned long long int) mc->cacheDrops,
480 (
unsigned long long int) ((mc->maxSizeUsed)/(1024*1024)),
481 (
unsigned long long int) ((mc->maxSize)/(1024*1024)),
482 (
int)((mc->maxSizeUsed)*100.0/mc->maxSize));
496 assert(mc->_refCount);
497 return mc->maxSizeUsed;
506 assert(mc->_refCount);
510 if ((mc->currentSize+esize)>mc->maxSize) {
514 nsize=(mc->currentSize+esize)-mc->maxSize;
516 GWEN_MULTICACHE_ENTRY *ce;
518 ce=GWEN_MultiCache_Entry_List_First(mc->entryList);
531 mc->currentSize+=esize;
532 if (mc->currentSize>mc->maxSizeUsed)
533 mc->maxSizeUsed=mc->currentSize;
535 GWEN_MultiCache_Entry_List_Add(e, mc->entryList);
545 assert(mc->_refCount);
547 assert(e->cacheType);
550 GWEN_MultiCache_Entry_List_Del(e);
559 mc->currentSize-=esize;
565 GWEN_MULTICACHE_ENTRY *ce;
568 assert(mc->_refCount);
572 ce=GWEN_MultiCache_Entry_List_First(mc->entryList);
574 GWEN_MULTICACHE_ENTRY *ceNext;
576 ceNext=GWEN_MultiCache_Entry_List_Next(ce);
587 assert(mc->_refCount);
590 GWEN_MultiCache_Entry_List_Del(e);
591 GWEN_MultiCache_Entry_List_Add(e, mc->entryList);
598 assert(mc->_refCount);
606 assert(mc->_refCount);
void GWEN_MultiCache_Type_ReleaseEntry(GWEN_MULTICACHE_TYPE *ct, GWEN_MULTICACHE_ENTRY *e)
void GWEN_MultiCache_Entry_SetParam5(GWEN_MULTICACHE_ENTRY *e, double d)
GWEN_MULTICACHE_ENTRY * GWEN_MultiCache_Entry_new(GWEN_MULTICACHE_TYPE *ct, uint32_t id, void *p, uint32_t i)
int GWEN_MultiCache_Type_FreeData(const GWEN_MULTICACHE_TYPE *ct, void *p)
void GWEN_MultiCache_IncCacheHits(GWEN_MULTICACHE *mc)
void GWEN_MultiCache_Type_SetDataWithParams5(GWEN_MULTICACHE_TYPE *ct, uint32_t id, void *ptr, uint32_t size, uint32_t param1, uint32_t param2, uint32_t param3, uint32_t param4, double param5)
#define DBG_NOTICE(dbg_logger, format, args...)
int GWENHYWFAR_CB(* GWEN_MULTICACHE_TYPE_FREE_OBJECT_FN)(const GWEN_MULTICACHE_TYPE *ct, void *p)
#define GWEN_FREE_OBJECT(varname)
uint32_t GWEN_MultiCache_Entry_GetParam3(const GWEN_MULTICACHE_ENTRY *e)
uint32_t GWEN_MultiCache_Entry_GetParam4(const GWEN_MULTICACHE_ENTRY *e)
uint32_t GWEN_MultiCache_Entry_GetParam1(const GWEN_MULTICACHE_ENTRY *e)
void GWEN_MultiCache_Type_PurgeAll(GWEN_MULTICACHE_TYPE *ct)
void GWEN_MultiCache_free(GWEN_MULTICACHE *mc)
void GWEN_MultiCache_Type_free(GWEN_MULTICACHE_TYPE *ct)
int GWEN_MultiCache_AddEntry(GWEN_MULTICACHE *mc, GWEN_MULTICACHE_ENTRY *e)
GWEN_MULTICACHE * GWEN_MultiCache_new(uint64_t maxSize)
int GWENHYWFAR_CB(* GWEN_MULTICACHE_TYPE_ATTACH_FN)(void *p)
void GWEN_MultiCache_Entry_SetParam2(GWEN_MULTICACHE_ENTRY *e, uint32_t i)
int GWENHYWFAR_CB(* GWEN_MULTICACHE_TYPE_FREE_FN)(void *p)
struct GWEN_MULTICACHE GWEN_MULTICACHE
GWEN_MULTICACHE_TYPE * GWEN_MultiCache_Entry_GetCacheType(const GWEN_MULTICACHE_ENTRY *e)
uint64_t GWEN_MultiCache_GetMaxSizeUsed(const GWEN_MULTICACHE *mc)
#define GWEN_NEW_OBJECT(typ, varname)
void GWEN_MultiCache_Entry_SetParam1(GWEN_MULTICACHE_ENTRY *e, uint32_t i)
GWEN_LIST_FUNCTIONS(GWEN_MULTICACHE_ENTRY, GWEN_MultiCache_Entry)
void GWEN_MultiCache_Entry_free(GWEN_MULTICACHE_ENTRY *e)
uint32_t GWEN_MultiCache_Entry_GetId(const GWEN_MULTICACHE_ENTRY *e)
double GWEN_MultiCache_Entry_GetParam5(const GWEN_MULTICACHE_ENTRY *e)
void GWEN_MultiCache_Entry_SetParam3(GWEN_MULTICACHE_ENTRY *e, uint32_t i)
void GWEN_MultiCache_ReleaseEntry(GWEN_MULTICACHE *mc, GWEN_MULTICACHE_ENTRY *e)
void * GWEN_MultiCache_Type_GetDataWithParams5(const GWEN_MULTICACHE_TYPE *ct, uint32_t id, uint32_t param1, uint32_t param2, uint32_t param3, uint32_t param4, double param5)
void GWEN_MultiCache_ReleaseEntriesForType(GWEN_MULTICACHE *mc, GWEN_MULTICACHE_TYPE *ct)
struct GWEN_MULTICACHE_TYPE GWEN_MULTICACHE_TYPE
#define DBG_ERROR(dbg_logger, format, args...)
void GWEN_MultiCache_IncCacheMisses(GWEN_MULTICACHE *mc)
uint32_t GWEN_MultiCache_Entry_GetParam2(const GWEN_MULTICACHE_ENTRY *e)
void GWEN_MultiCache_Type_SetDataWithParams(GWEN_MULTICACHE_TYPE *ct, uint32_t id, void *ptr, uint32_t size, uint32_t param1, uint32_t param2, uint32_t param3, uint32_t param4)
void GWEN_MultiCache_Type_SetFreeObjectFn(GWEN_MULTICACHE_TYPE *ct, GWEN_MULTICACHE_TYPE_FREE_OBJECT_FN fn)
int GWENHYWFAR_CB(* GWEN_MULTICACHE_TYPE_ATTACH_OBJECT_FN)(const GWEN_MULTICACHE_TYPE *ct, void *p)
void GWEN_MultiCache_Type_SetFreeFn(GWEN_MULTICACHE_TYPE *ct, GWEN_MULTICACHE_TYPE_FREE_FN fn)
#define GWEN_LIST_INIT(t, element)
void GWEN_MultiCache_UsingEntry(GWEN_MULTICACHE *mc, GWEN_MULTICACHE_ENTRY *e)
void GWEN_MultiCache_Type_PurgeData(GWEN_MULTICACHE_TYPE *ct, uint32_t id)
uint32_t GWEN_MultiCache_Entry_GetDataSize(const GWEN_MULTICACHE_ENTRY *e)
void * GWEN_MultiCache_Type_GetData(const GWEN_MULTICACHE_TYPE *ct, uint32_t id)
void GWEN_MultiCache_Type_SetAttachFn(GWEN_MULTICACHE_TYPE *ct, GWEN_MULTICACHE_TYPE_ATTACH_FN fn)
void GWEN_MultiCache_Type_SetAttachObjectFn(GWEN_MULTICACHE_TYPE *ct, GWEN_MULTICACHE_TYPE_ATTACH_OBJECT_FN fn)
int GWEN_MultiCache_Type_AttachData(const GWEN_MULTICACHE_TYPE *ct, void *p)
void GWEN_MultiCache_Entry_SetParam4(GWEN_MULTICACHE_ENTRY *e, uint32_t i)
void GWEN_MultiCache_Type_SetData(GWEN_MULTICACHE_TYPE *ct, uint32_t id, void *ptr, uint32_t size)
void * GWEN_MultiCache_Entry_GetDataPtr(const GWEN_MULTICACHE_ENTRY *e)
#define GWEN_LIST_FINI(t, element)
GWEN_IDMAP_FUNCTIONS(GWEN_MULTICACHE_ENTRY, GWEN_MultiCache_Entry)
GWEN_MULTICACHE_TYPE * GWEN_MultiCache_Type_new(GWEN_MULTICACHE *mc)
#define GWEN_ERROR_MEMORY_FULL
void * GWEN_MultiCache_Type_GetDataWithParams(const GWEN_MULTICACHE_TYPE *ct, uint32_t id, uint32_t param1, uint32_t param2, uint32_t param3, uint32_t param4)
#define GWEN_ERROR_NOT_IMPLEMENTED