30 #include "memcache_p.h"
31 #include <gwenhywfar/misc.h>
32 #include <gwenhywfar/debug.h>
48 me->memCache=memCache;
55 me->memCache->currentCacheEntries++;
56 me->memCache->currentCacheMemory+=me->dataLen;
65 assert(me->useCounter==0);
69 me->memCache->currentCacheEntries--;
70 me->memCache->currentCacheMemory-=me->dataLen;
72 if (me->dataPtr && me->dataLen)
83 return me->useCounter;
90 return me->unusedSince;
140 if (me->useCounter>0) {
142 if (me->useCounter==0) {
143 if (!(me->isValid)) {
147 me->unusedSince=time(0);
153 assert(me->useCounter>0);
165 uint32_t maxCacheEntries) {
171 mc->maxCacheMemory=maxCacheMemory;
172 mc->maxCacheEntries=maxCacheEntries;
181 GWEN_MemCacheEntry_IdMap_free(mc->idMap);
195 me=GWEN_MemCacheEntry_IdMap_Find(mc->idMap,
id);
213 me=GWEN_MemCacheEntry_IdMap_Find(mc->idMap,
id);
216 GWEN_MemCacheEntry_IdMap_Remove(mc->idMap,
id);
217 if (me->useCounter==0)
237 res=GWEN_MemCacheEntry_IdMap_GetFirst(mc->idMap, ¤tId);
241 me=GWEN_MemCacheEntry_IdMap_Find(mc->idMap, currentId);
243 if (me->isValid && me->useCounter==0) {
244 if (oldestEntry==
NULL)
247 if (me->unusedSince<oldestEntry->unusedSince)
252 res=GWEN_MemCacheEntry_IdMap_GetNext(mc->idMap, ¤tId);
255 if (oldestEntry==
NULL)
260 if (neededSize<oldestEntry->dataLen)
263 neededSize-=oldestEntry->dataLen;
266 GWEN_MemCacheEntry_IdMap_Remove(mc->idMap, oldestEntry->id);
285 me=GWEN_MemCacheEntry_IdMap_Find(mc->idMap,
id);
288 GWEN_MemCacheEntry_IdMap_Remove(mc->idMap,
id);
289 if (me->useCounter==0)
294 if (mc->currentCacheEntries>=mc->maxCacheEntries) {
307 if ((mc->currentCacheMemory+dataLen)>=mc->maxCacheMemory) {
311 diff=(mc->currentCacheMemory+dataLen)-mc->maxCacheMemory;
325 GWEN_MemCacheEntry_IdMap_Insert(mc->idMap,
id, me);
335 uint32_t
id, uint32_t mask) {
342 res=GWEN_MemCacheEntry_IdMap_GetFirst(mc->idMap, ¤tId);
347 res=GWEN_MemCacheEntry_IdMap_GetNext(mc->idMap, &nextId);
348 if ((currentId & mask)==
id) {
351 me=GWEN_MemCacheEntry_IdMap_Find(mc->idMap, currentId);
354 GWEN_MemCacheEntry_IdMap_Remove(mc->idMap, currentId);
355 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)
void GWEN_MemCacheEntry_BeginUse(GWEN_MEMCACHE_ENTRY *me)
GWEN_MUTEX * GWEN_Mutex_new(void)
#define GWEN_NEW_OBJECT(typ, varname)
void GWEN_MemCache_PurgeEntry(GWEN_MEMCACHE *mc, uint32_t id)
struct GWEN_MEMCACHE_ENTRY GWEN_MEMCACHE_ENTRY
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)
int GWEN_Mutex_Unlock(GWEN_MUTEX *mtx)
#define DBG_ERROR(dbg_logger, format, args...)
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...)
void GWEN_Mutex_free(GWEN_MUTEX *mtx)
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)
int GWEN_Mutex_Lock(GWEN_MUTEX *mtx)