29 #define DISABLE_DEBUGLOG 31 #include "multicache_p.h" 33 #include <gwenhywfar/debug.h> 46 GWEN_MULTICACHE_ENTRY *e;
207 assert(ct->_refCount);
208 if (ct->_refCount==1) {
210 GWEN_MultiCache_Entry_IdMap_free(ct->entryMap);
224 GWEN_MULTICACHE_ENTRY *e;
227 assert(ct->_refCount);
229 e=(GWEN_MULTICACHE_ENTRY *)GWEN_MultiCache_Entry_IdMap_Find(ct->entryMap,
id);
246 uint32_t param1, uint32_t param2, uint32_t param3, uint32_t param4)
249 GWEN_MULTICACHE_ENTRY *e;
252 assert(ct->_refCount);
254 e=(GWEN_MULTICACHE_ENTRY *)GWEN_MultiCache_Entry_IdMap_Find(ct->entryMap,
id);
276 uint32_t param1, uint32_t param2, uint32_t param3, uint32_t param4,
280 GWEN_MULTICACHE_ENTRY *e;
283 assert(ct->_refCount);
285 e=(GWEN_MULTICACHE_ENTRY *)GWEN_MultiCache_Entry_IdMap_Find(ct->entryMap,
id);
309 GWEN_MULTICACHE_ENTRY *e;
312 assert(ct->_refCount);
317 GWEN_MultiCache_Entry_IdMap_Insert(ct->entryMap,
id, (
void *) e);
323 uint32_t param1, uint32_t param2, uint32_t param3, uint32_t param4)
325 GWEN_MULTICACHE_ENTRY *e;
328 assert(ct->_refCount);
338 GWEN_MultiCache_Entry_IdMap_Insert(ct->entryMap,
id, (
void *) e);
344 uint32_t param1, uint32_t param2, uint32_t param3, uint32_t param4,
347 GWEN_MULTICACHE_ENTRY *e;
350 assert(ct->_refCount);
361 GWEN_MultiCache_Entry_IdMap_Insert(ct->entryMap,
id, (
void *) e);
368 GWEN_MULTICACHE_ENTRY *e;
371 assert(ct->_refCount);
373 e=(GWEN_MULTICACHE_ENTRY *)GWEN_MultiCache_Entry_IdMap_Find(ct->entryMap,
id);
383 assert(ct->_refCount);
393 assert(ct->_refCount);
403 assert(ct->_refCount);
413 assert(ct->_refCount);
415 ct->attachObjectFn=fn;
423 assert(ct->_refCount);
433 assert(ct->_refCount);
436 if (ct->attachObjectFn)
437 return ct->attachObjectFn(ct, p);
440 return ct->attachFn(p);
450 assert(ct->_refCount);
453 if (ct->freeObjectFn)
454 return ct->freeObjectFn(ct, p);
457 return ct->freeFn(p);
466 assert(ct->_refCount);
486 mc->typeList=GWEN_MultiCache_Type_List_new();
487 mc->entryList=GWEN_MultiCache_Entry_List_new();
497 assert(mc->_refCount);
499 if (mc->_refCount==1) {
500 GWEN_MULTICACHE_ENTRY *ce;
502 ce=GWEN_MultiCache_Entry_List_First(mc->entryList);
505 ce=GWEN_MultiCache_Entry_List_First(mc->entryList);
508 GWEN_MultiCache_Entry_List_free(mc->entryList);
509 GWEN_MultiCache_Type_List_free(mc->typeList);
512 "MultiCache usage: %lld hits, %lld misses, %lld drops, %lld mb max memory used from %lld mb (%d %%)",
513 (
unsigned long long int) mc->cacheHits,
514 (
unsigned long long int) mc->cacheMisses,
515 (
unsigned long long int) mc->cacheDrops,
516 (
unsigned long long int)((mc->maxSizeUsed)/(1024*1024)),
517 (
unsigned long long int)((mc->maxSize)/(1024*1024)),
518 (
int)((mc->maxSizeUsed)*100.0/mc->maxSize));
533 assert(mc->_refCount);
534 return mc->maxSizeUsed;
544 assert(mc->_refCount);
548 if ((mc->currentSize+esize)>mc->maxSize) {
552 nsize=(mc->currentSize+esize)-mc->maxSize;
554 GWEN_MULTICACHE_ENTRY *ce;
556 ce=GWEN_MultiCache_Entry_List_First(mc->entryList);
569 mc->currentSize+=esize;
570 if (mc->currentSize>mc->maxSizeUsed)
571 mc->maxSizeUsed=mc->currentSize;
573 GWEN_MultiCache_Entry_List_Add(e, mc->entryList);
584 assert(mc->_refCount);
586 assert(e->cacheType);
589 GWEN_MultiCache_Entry_List_Del(e);
598 mc->currentSize-=esize;
605 GWEN_MULTICACHE_ENTRY *ce;
608 assert(mc->_refCount);
612 ce=GWEN_MultiCache_Entry_List_First(mc->entryList);
614 GWEN_MULTICACHE_ENTRY *ceNext;
616 ceNext=GWEN_MultiCache_Entry_List_Next(ce);
628 assert(mc->_refCount);
631 GWEN_MultiCache_Entry_List_Del(e);
632 GWEN_MultiCache_Entry_List_Add(e, mc->entryList);
640 assert(mc->_refCount);
649 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 GWENHYWFAR_CB(* GWEN_MULTICACHE_TYPE_FREE_OBJECT_FN)(const GWEN_MULTICACHE_TYPE *ct, void *p)
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...)
#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)
int GWENHYWFAR_CB(* GWEN_MULTICACHE_TYPE_ATTACH_OBJECT_FN)(const GWEN_MULTICACHE_TYPE *ct, void *p)
int GWENHYWFAR_CB(* GWEN_MULTICACHE_TYPE_FREE_FN)(void *p)
GWEN_MULTICACHE * GWEN_MultiCache_new(uint64_t maxSize)
void GWEN_MultiCache_Entry_SetParam2(GWEN_MULTICACHE_ENTRY *e, uint32_t i)
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)
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)
int GWENHYWFAR_CB(* GWEN_MULTICACHE_TYPE_ATTACH_FN)(void *p)
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