30 #include "memcache_p.h" 31 #include <gwenhywfar/misc.h> 32 #include <gwenhywfar/debug.h> 49 me->memCache=memCache;
56 me->memCache->currentCacheEntries++;
57 me->memCache->currentCacheMemory+=me->dataLen;
67 assert(me->useCounter==0);
71 me->memCache->currentCacheEntries--;
72 me->memCache->currentCacheMemory-=me->dataLen;
74 if (me->dataPtr && me->dataLen)
86 return me->useCounter;
94 return me->unusedSince;
149 if (me->useCounter>0) {
151 if (me->useCounter==0) {
152 if (!(me->isValid)) {
156 me->unusedSince=time(0);
162 assert(me->useCounter>0);
174 uint32_t maxCacheEntries)
181 mc->maxCacheMemory=maxCacheMemory;
182 mc->maxCacheEntries=maxCacheEntries;
192 GWEN_MemCacheEntry_IdMap_free(mc->idMap);
207 me=GWEN_MemCacheEntry_IdMap_Find(mc->idMap,
id);
226 me=GWEN_MemCacheEntry_IdMap_Find(mc->idMap,
id);
229 GWEN_MemCacheEntry_IdMap_Remove(mc->idMap,
id);
230 if (me->useCounter==0)
251 res=GWEN_MemCacheEntry_IdMap_GetFirst(mc->idMap, ¤tId);
255 me=GWEN_MemCacheEntry_IdMap_Find(mc->idMap, currentId);
257 if (me->isValid && me->useCounter==0) {
258 if (oldestEntry==
NULL)
261 if (me->unusedSince<oldestEntry->unusedSince)
266 res=GWEN_MemCacheEntry_IdMap_GetNext(mc->idMap, ¤tId);
269 if (oldestEntry==
NULL)
274 if (neededSize<oldestEntry->dataLen)
277 neededSize-=oldestEntry->dataLen;
280 GWEN_MemCacheEntry_IdMap_Remove(mc->idMap, oldestEntry->id);
300 me=GWEN_MemCacheEntry_IdMap_Find(mc->idMap,
id);
303 GWEN_MemCacheEntry_IdMap_Remove(mc->idMap,
id);
304 if (me->useCounter==0)
309 if (mc->currentCacheEntries>=mc->maxCacheEntries) {
322 if ((mc->currentCacheMemory+dataLen)>=mc->maxCacheMemory) {
326 diff=(mc->currentCacheMemory+dataLen)-mc->maxCacheMemory;
340 GWEN_MemCacheEntry_IdMap_Insert(mc->idMap,
id, me);
350 uint32_t
id, uint32_t mask)
358 res=GWEN_MemCacheEntry_IdMap_GetFirst(mc->idMap, ¤tId);
363 res=GWEN_MemCacheEntry_IdMap_GetNext(mc->idMap, &nextId);
364 if ((currentId & mask)==
id) {
367 me=GWEN_MemCacheEntry_IdMap_Find(mc->idMap, currentId);
370 GWEN_MemCacheEntry_IdMap_Remove(mc->idMap, currentId);
371 if (me->useCounter==0)
int GWEN_MemCache_Lock(GWEN_MEMCACHE *mc)
int GWEN_MemCache__MakeRoom(GWEN_MEMCACHE *mc, size_t neededSize)
#define GWEN_FREE_OBJECT(varname)
#define DBG_WARN(dbg_logger, format, args...)
void GWEN_MemCache_Purge(GWEN_MEMCACHE *mc)
GWENHYWFAR_API int GWEN_Mutex_Lock(GWEN_MUTEX *mtx)
void GWEN_MemCacheEntry_BeginUse(GWEN_MEMCACHE_ENTRY *me)
#define GWEN_NEW_OBJECT(typ, varname)
void GWEN_MemCache_PurgeEntry(GWEN_MEMCACHE *mc, uint32_t id)
GWENHYWFAR_API GWEN_MUTEX * GWEN_Mutex_new(void)
struct GWEN_MEMCACHE_ENTRY GWEN_MEMCACHE_ENTRY
GWENHYWFAR_API int GWEN_Mutex_Unlock(GWEN_MUTEX *mtx)
void * GWEN_MemCacheEntry_GetDataPtr(GWEN_MEMCACHE_ENTRY *me)
GWEN_MEMCACHE_ENTRY * GWEN_MemCache_FindEntry(GWEN_MEMCACHE *mc, uint32_t id)
uint32_t GWEN_MemCacheEntry_GetId(GWEN_MEMCACHE_ENTRY *me)
void GWEN_MemCacheEntry_EndUse(GWEN_MEMCACHE_ENTRY *me)
#define DBG_ERROR(dbg_logger, format, args...)
GWENHYWFAR_API void GWEN_Mutex_free(GWEN_MUTEX *mtx)
void GWEN_MemCacheEntry_free(GWEN_MEMCACHE_ENTRY *me)
void GWEN_MemCache_free(GWEN_MEMCACHE *mc)
int GWEN_MemCacheEntry_GetUseCounter(const GWEN_MEMCACHE_ENTRY *me)
time_t GWEN_MemCacheEntry_GetUnusedSince(GWEN_MEMCACHE_ENTRY *me)
#define DBG_INFO(dbg_logger, format, args...)
struct GWEN_MEMCACHE GWEN_MEMCACHE
int GWEN_MemCache_Unlock(GWEN_MEMCACHE *mc)
GWEN_MEMCACHE_ENTRY * GWEN_MemCache_CreateEntry(GWEN_MEMCACHE *mc, uint32_t id, void *dataPtr, size_t dataLen)
size_t GWEN_MemCacheEntry_GetDataLen(GWEN_MEMCACHE_ENTRY *me)
GWEN_MEMCACHE * GWEN_MemCache_new(size_t maxCacheMemory, uint32_t maxCacheEntries)
GWEN_IDMAP_FUNCTIONS(GWEN_MULTICACHE_ENTRY, GWEN_MultiCache_Entry)
#define GWEN_ERROR_MEMORY_FULL
GWEN_MEMCACHE_ENTRY * GWEN_MemCacheEntry_new(GWEN_MEMCACHE *memCache, uint32_t id, void *dataPtr, size_t dataLen)
void GWEN_MemCache_PurgeEntries(GWEN_MEMCACHE *mc, uint32_t id, uint32_t mask)