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);
478 GWEN_MULTICACHE_ENTRY *ce;
481 assert(ct->_refCount);
485 ce=GWEN_MultiCache_Entry_List_First(ct->multiCache->entryList);
487 GWEN_MULTICACHE_ENTRY *ceNext;
489 ceNext=GWEN_MultiCache_Entry_List_Next(ce);
517 mc->typeList=GWEN_MultiCache_Type_List_new();
518 mc->entryList=GWEN_MultiCache_Entry_List_new();
528 assert(mc->_refCount);
530 if (mc->_refCount==1) {
531 GWEN_MULTICACHE_ENTRY *ce;
533 ce=GWEN_MultiCache_Entry_List_First(mc->entryList);
536 ce=GWEN_MultiCache_Entry_List_First(mc->entryList);
539 GWEN_MultiCache_Entry_List_free(mc->entryList);
540 GWEN_MultiCache_Type_List_free(mc->typeList);
545 "%" PRIu64
" misses, "
546 "%" PRIu64
" drops, "
547 "%" PRIu64
" mb max memory used from "
550 (uint64_t) mc->cacheHits,
551 (uint64_t) mc->cacheMisses,
552 (uint64_t) mc->cacheDrops,
553 (uint64_t)((mc->maxSizeUsed)/(1024*1024)),
554 (uint64_t)((mc->maxSize)/(1024*1024)),
555 (
int)((mc->maxSizeUsed)*100.0/mc->maxSize));
570 uint64_t totalCacheOps;
573 totalCacheOps=mc->cacheHits+mc->cacheMisses;
575 hitPercentage=((mc->cacheHits)*100)/totalCacheOps;
577 len=snprintf(ptrBuffer, lenBuffer,
579 "%" PRIu64
" hits (%d %%), "
580 "%" PRIu64
" misses, "
581 "%" PRIu64
" drops, "
582 "%" PRIu64
" mb max memory used from "
585 (uint64_t) mc->cacheHits,
587 (uint64_t) mc->cacheMisses,
588 (uint64_t) mc->cacheDrops,
589 (uint64_t)((mc->maxSizeUsed)/(1024*1024)),
590 (uint64_t)((mc->maxSize)/(1024*1024)),
591 (
int)((mc->maxSizeUsed)*100.0/mc->maxSize));
592 if (len>=(
size_t)lenBuffer) {
594 (uint64_t) lenBuffer, (uint64_t) len);
606 assert(mc->_refCount);
607 return mc->maxSizeUsed;
617 assert(mc->_refCount);
621 if ((mc->currentSize+esize)>mc->maxSize) {
625 nsize=(mc->currentSize+esize)-mc->maxSize;
627 GWEN_MULTICACHE_ENTRY *ce;
629 ce=GWEN_MultiCache_Entry_List_First(mc->entryList);
642 mc->currentSize+=esize;
643 if (mc->currentSize>mc->maxSizeUsed)
644 mc->maxSizeUsed=mc->currentSize;
646 GWEN_MultiCache_Entry_List_Add(e, mc->entryList);
657 assert(mc->_refCount);
659 assert(e->cacheType);
662 GWEN_MultiCache_Entry_List_Del(e);
671 mc->currentSize-=esize;
678 GWEN_MULTICACHE_ENTRY *ce;
681 assert(mc->_refCount);
685 ce=GWEN_MultiCache_Entry_List_First(mc->entryList);
687 GWEN_MULTICACHE_ENTRY *ceNext;
689 ceNext=GWEN_MultiCache_Entry_List_Next(ce);
701 assert(mc->_refCount);
704 GWEN_MultiCache_Entry_List_Del(e);
705 GWEN_MultiCache_Entry_List_Add(e, mc->entryList);
713 assert(mc->_refCount);
722 assert(mc->_refCount);
#define DBG_NOTICE(dbg_logger, format, args...)
#define DBG_ERROR(dbg_logger, format, args...)
#define GWEN_ERROR_NOT_IMPLEMENTED
#define GWEN_ERROR_MEMORY_FULL
#define GWEN_ERROR_BUFFER_OVERFLOW
void GWEN_IdList64_free(GWEN_IDLIST64 *idl)
GWEN_IDLIST64 * GWEN_IdList64_new()
int64_t GWEN_IdList64_AddId(GWEN_IDLIST64 *idl, uint64_t entry)
uint64_t GWEN_IdList64_GetEntryCount(const GWEN_SIMPLEPTRLIST *pl)
GWEN_SIMPLEPTRLIST GWEN_IDLIST64
#define GWEN_IDMAP_FUNCTIONS(t, pr)
#define GWEN_LIST_FINI(t, element)
#define GWEN_LIST_FUNCTIONS(t, pr)
#define GWEN_LIST_INIT(t, element)
#define GWEN_FREE_OBJECT(varname)
#define GWEN_NEW_OBJECT(typ, varname)
int GWEN_MultiCache_Type_AttachData(const GWEN_MULTICACHE_TYPE *ct, void *p)
void GWEN_MultiCache_Type_SetFreeFn(GWEN_MULTICACHE_TYPE *ct, GWEN_MULTICACHE_TYPE_FREE_FN fn)
int GWEN_MultiCache_AddEntry(GWEN_MULTICACHE *mc, GWEN_MULTICACHE_ENTRY *e)
void GWEN_MultiCache_Type_free(GWEN_MULTICACHE_TYPE *ct)
void GWEN_MultiCache_Type_PurgeAll(GWEN_MULTICACHE_TYPE *ct)
void GWEN_MultiCache_Type_ReleaseEntry(GWEN_MULTICACHE_TYPE *ct, 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_Entry_GetDataPtr(const GWEN_MULTICACHE_ENTRY *e)
double GWEN_MultiCache_Entry_GetParam5(const GWEN_MULTICACHE_ENTRY *e)
uint32_t GWEN_MultiCache_Entry_GetParam1(const GWEN_MULTICACHE_ENTRY *e)
void GWEN_MultiCache_IncCacheMisses(GWEN_MULTICACHE *mc)
int GWEN_MultiCache_Type_FreeData(const GWEN_MULTICACHE_TYPE *ct, void *p)
uint32_t GWEN_MultiCache_Entry_GetParam4(const GWEN_MULTICACHE_ENTRY *e)
GWEN_IDLIST64 * GWEN_MultiCache_Type_GetIdsInCache(const GWEN_MULTICACHE_TYPE *ct)
void GWEN_MultiCache_Type_SetAttachFn(GWEN_MULTICACHE_TYPE *ct, GWEN_MULTICACHE_TYPE_ATTACH_FN fn)
void GWEN_MultiCache_ReleaseEntry(GWEN_MULTICACHE *mc, GWEN_MULTICACHE_ENTRY *e)
GWEN_MULTICACHE_TYPE * GWEN_MultiCache_Entry_GetCacheType(const GWEN_MULTICACHE_ENTRY *e)
void GWEN_MultiCache_Entry_SetParam3(GWEN_MULTICACHE_ENTRY *e, uint32_t i)
uint32_t GWEN_MultiCache_Entry_GetDataSize(const GWEN_MULTICACHE_ENTRY *e)
void GWEN_MultiCache_Entry_SetParam4(GWEN_MULTICACHE_ENTRY *e, uint32_t i)
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)
void GWEN_MultiCache_Type_PurgeData(GWEN_MULTICACHE_TYPE *ct, uint32_t id)
void GWEN_MultiCache_UsingEntry(GWEN_MULTICACHE *mc, GWEN_MULTICACHE_ENTRY *e)
void * GWEN_MultiCache_Type_GetData(const GWEN_MULTICACHE_TYPE *ct, uint32_t id)
GWEN_MULTICACHE * GWEN_MultiCache_new(uint64_t maxSize)
int GWEN_MultiCache_GetUsageString(const GWEN_MULTICACHE *mc, char *ptrBuffer, int lenBuffer)
void GWEN_MultiCache_Entry_SetParam2(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_SetParam5(GWEN_MULTICACHE_ENTRY *e, double d)
void GWEN_MultiCache_Entry_free(GWEN_MULTICACHE_ENTRY *e)
GWEN_MULTICACHE_ENTRY * GWEN_MultiCache_Entry_new(GWEN_MULTICACHE_TYPE *ct, uint32_t id, void *p, uint32_t i)
void GWEN_MultiCache_Type_SetFreeObjectFn(GWEN_MULTICACHE_TYPE *ct, GWEN_MULTICACHE_TYPE_FREE_OBJECT_FN fn)
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)
uint32_t GWEN_MultiCache_Entry_GetParam3(const GWEN_MULTICACHE_ENTRY *e)
void GWEN_MultiCache_free(GWEN_MULTICACHE *mc)
uint32_t GWEN_MultiCache_Entry_GetId(const GWEN_MULTICACHE_ENTRY *e)
void GWEN_MultiCache_Type_SetAttachObjectFn(GWEN_MULTICACHE_TYPE *ct, GWEN_MULTICACHE_TYPE_ATTACH_OBJECT_FN fn)
GWEN_MULTICACHE_TYPE * GWEN_MultiCache_Type_new(GWEN_MULTICACHE *mc)
void GWEN_MultiCache_Entry_SetParam1(GWEN_MULTICACHE_ENTRY *e, uint32_t i)
uint32_t GWEN_MultiCache_Entry_GetParam2(const GWEN_MULTICACHE_ENTRY *e)
void GWEN_MultiCache_IncCacheHits(GWEN_MULTICACHE *mc)
void GWEN_MultiCache_ReleaseEntriesForType(GWEN_MULTICACHE *mc, GWEN_MULTICACHE_TYPE *ct)
uint64_t GWEN_MultiCache_GetMaxSizeUsed(const GWEN_MULTICACHE *mc)
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)
struct GWEN_MULTICACHE GWEN_MULTICACHE
int GWENHYWFAR_CB(* GWEN_MULTICACHE_TYPE_ATTACH_FN)(void *p)
struct GWEN_MULTICACHE_TYPE GWEN_MULTICACHE_TYPE
int GWENHYWFAR_CB(* GWEN_MULTICACHE_TYPE_ATTACH_OBJECT_FN)(const GWEN_MULTICACHE_TYPE *ct, void *p)
int GWENHYWFAR_CB(* GWEN_MULTICACHE_TYPE_FREE_OBJECT_FN)(const GWEN_MULTICACHE_TYPE *ct, void *p)
int GWENHYWFAR_CB(* GWEN_MULTICACHE_TYPE_FREE_FN)(void *p)