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)