gwenhywfar  4.99.8beta
multicache.c
Go to the documentation of this file.
1 /***************************************************************************
2  begin : Wed May 08 2013
3  copyright : (C) 2013 by Martin Preuss
4  email : martin@libchipcard.de
5 
6  ***************************************************************************
7  * *
8  * This library is free software; you can redistribute it and/or *
9  * modify it under the terms of the GNU Lesser General Public *
10  * License as published by the Free Software Foundation; either *
11  * version 2.1 of the License, or (at your option) any later version. *
12  * *
13  * This library is distributed in the hope that it will be useful, *
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
16  * Lesser General Public License for more details. *
17  * *
18  * You should have received a copy of the GNU Lesser General Public *
19  * License along with this library; if not, write to the Free Software *
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, *
21  * MA 02111-1307 USA *
22  * *
23  ***************************************************************************/
24 
25 #ifdef HAVE_CONFIG_H
26 # include <config.h>
27 #endif
28 
29 #define DISABLE_DEBUGLOG
30 
31 #include "multicache_p.h"
32 
33 #include <gwenhywfar/debug.h>
34 
35 
36 
37 GWEN_LIST_FUNCTIONS(GWEN_MULTICACHE_ENTRY, GWEN_MultiCache_Entry);
38 GWEN_IDMAP_FUNCTIONS(GWEN_MULTICACHE_ENTRY, GWEN_MultiCache_Entry);
39 GWEN_LIST_FUNCTIONS(GWEN_MULTICACHE_TYPE, GWEN_MultiCache_Type);
40 
41 
42 
43 
44 GWEN_MULTICACHE_ENTRY *GWEN_MultiCache_Entry_new(GWEN_MULTICACHE_TYPE *ct, uint32_t id, void *p, uint32_t i) {
45  GWEN_MULTICACHE_ENTRY *e;
46 
47  GWEN_NEW_OBJECT(GWEN_MULTICACHE_ENTRY, e);
48  GWEN_LIST_INIT(GWEN_MULTICACHE_ENTRY, e);
49 
50  e->cacheType=ct;
51  e->id=id;
52  e->dataPtr=p;
53  e->dataSize=i;
54 
55  return e;
56 }
57 
58 
59 
60 void GWEN_MultiCache_Entry_free(GWEN_MULTICACHE_ENTRY *e) {
61  if (e) {
62  GWEN_LIST_FINI(GWEN_MULTICACHE_ENTRY, e);
64  }
65 }
66 
67 
68 
69 uint32_t GWEN_MultiCache_Entry_GetId(const GWEN_MULTICACHE_ENTRY *e) {
70  assert(e);
71  return e->id;
72 }
73 
74 
75 
76 uint32_t GWEN_MultiCache_Entry_GetDataSize(const GWEN_MULTICACHE_ENTRY *e) {
77  assert(e);
78  return e->dataSize;
79 }
80 
81 
82 
83 void *GWEN_MultiCache_Entry_GetDataPtr(const GWEN_MULTICACHE_ENTRY *e) {
84  assert(e);
85  return e->dataPtr;
86 }
87 
88 
89 
90 GWEN_MULTICACHE_TYPE *GWEN_MultiCache_Entry_GetCacheType(const GWEN_MULTICACHE_ENTRY *e) {
91  assert(e);
92  return e->cacheType;
93 }
94 
95 
96 
97 uint32_t GWEN_MultiCache_Entry_GetParam1(const GWEN_MULTICACHE_ENTRY *e) {
98  assert(e);
99  return e->param1;
100 }
101 
102 
103 
104 void GWEN_MultiCache_Entry_SetParam1(GWEN_MULTICACHE_ENTRY *e, uint32_t i) {
105  assert(e);
106  e->param1=i;
107 }
108 
109 
110 
111 uint32_t GWEN_MultiCache_Entry_GetParam2(const GWEN_MULTICACHE_ENTRY *e) {
112  assert(e);
113  return e->param2;
114 }
115 
116 
117 
118 void GWEN_MultiCache_Entry_SetParam2(GWEN_MULTICACHE_ENTRY *e, uint32_t i) {
119  assert(e);
120  e->param2=i;
121 }
122 
123 
124 
125 uint32_t GWEN_MultiCache_Entry_GetParam3(const GWEN_MULTICACHE_ENTRY *e) {
126  assert(e);
127  return e->param3;
128 }
129 
130 
131 
132 void GWEN_MultiCache_Entry_SetParam3(GWEN_MULTICACHE_ENTRY *e, uint32_t i) {
133  assert(e);
134  e->param3=i;
135 }
136 
137 
138 
139 uint32_t GWEN_MultiCache_Entry_GetParam4(const GWEN_MULTICACHE_ENTRY *e) {
140  assert(e);
141  return e->param4;
142 }
143 
144 
145 
146 void GWEN_MultiCache_Entry_SetParam4(GWEN_MULTICACHE_ENTRY *e, uint32_t i) {
147  assert(e);
148  e->param4=i;
149 }
150 
151 
152 
153 double GWEN_MultiCache_Entry_GetParam5(const GWEN_MULTICACHE_ENTRY *e) {
154  assert(e);
155  return e->param5;
156 }
157 
158 
159 
160 void GWEN_MultiCache_Entry_SetParam5(GWEN_MULTICACHE_ENTRY *e, double d) {
161  assert(e);
162  e->param5=d;
163 }
164 
165 
166 
167 
168 
169 
170 
171 
172 
175 
178  ct->_refCount=1;
179  ct->multiCache=mc;
180  ct->entryMap=GWEN_MultiCache_Entry_IdMap_new(GWEN_IdMapAlgo_Hex4);
181 
182  return ct;
183 }
184 
185 
186 
188  if (ct) {
189  assert(ct->_refCount);
190  if (ct->_refCount==1) {
191  GWEN_MultiCache_ReleaseEntriesForType(ct->multiCache, ct);
192  GWEN_MultiCache_Entry_IdMap_free(ct->entryMap);
194  ct->_refCount=0;
195  GWEN_FREE_OBJECT(ct);
196  }
197  else
198  ct->_refCount--;
199  }
200 }
201 
202 
203 
204 void *GWEN_MultiCache_Type_GetData(const GWEN_MULTICACHE_TYPE *ct, uint32_t id) {
205  GWEN_MULTICACHE_ENTRY *e;
206 
207  assert(ct);
208  assert(ct->_refCount);
209 
210  e=(GWEN_MULTICACHE_ENTRY*)GWEN_MultiCache_Entry_IdMap_Find(ct->entryMap, id);
211  if (e) {
212  void *p;
213 
214  GWEN_MultiCache_UsingEntry(ct->multiCache, e);
217  GWEN_MultiCache_IncCacheHits(ct->multiCache);
218  return p;
219  }
220  GWEN_MultiCache_IncCacheMisses(ct->multiCache);
221  return NULL;
222 }
223 
224 
225 
227  uint32_t param1, uint32_t param2, uint32_t param3, uint32_t param4) {
228 
229  GWEN_MULTICACHE_ENTRY *e;
230 
231  assert(ct);
232  assert(ct->_refCount);
233 
234  e=(GWEN_MULTICACHE_ENTRY*)GWEN_MultiCache_Entry_IdMap_Find(ct->entryMap, id);
235  if (e) {
236  if ((GWEN_MultiCache_Entry_GetParam1(e)==param1) &&
237  (GWEN_MultiCache_Entry_GetParam2(e)==param2) &&
238  (GWEN_MultiCache_Entry_GetParam3(e)==param3) &&
239  (GWEN_MultiCache_Entry_GetParam4(e)==param4)) {
240  void *p;
241 
242  GWEN_MultiCache_UsingEntry(ct->multiCache, e);
245  GWEN_MultiCache_IncCacheHits(ct->multiCache);
246  return p;
247  }
248  }
249  GWEN_MultiCache_IncCacheMisses(ct->multiCache);
250  return NULL;
251 }
252 
253 
254 
256  uint32_t param1, uint32_t param2, uint32_t param3, uint32_t param4,
257  double param5) {
258 
259  GWEN_MULTICACHE_ENTRY *e;
260 
261  assert(ct);
262  assert(ct->_refCount);
263 
264  e=(GWEN_MULTICACHE_ENTRY*)GWEN_MultiCache_Entry_IdMap_Find(ct->entryMap, id);
265  if (e) {
266  if ((GWEN_MultiCache_Entry_GetParam1(e)==param1) &&
267  (GWEN_MultiCache_Entry_GetParam2(e)==param2) &&
268  (GWEN_MultiCache_Entry_GetParam3(e)==param3) &&
269  (GWEN_MultiCache_Entry_GetParam4(e)==param4) &&
270  (GWEN_MultiCache_Entry_GetParam5(e)==param5)) {
271  void *p;
272 
273  GWEN_MultiCache_UsingEntry(ct->multiCache, e);
276  GWEN_MultiCache_IncCacheHits(ct->multiCache);
277  return p;
278  }
279  }
280  GWEN_MultiCache_IncCacheMisses(ct->multiCache);
281  return NULL;
282 }
283 
284 
285 
286 void GWEN_MultiCache_Type_SetData(GWEN_MULTICACHE_TYPE *ct, uint32_t id, void *ptr, uint32_t size) {
287  GWEN_MULTICACHE_ENTRY *e;
288 
289  assert(ct);
290  assert(ct->_refCount);
291 
293  e=GWEN_MultiCache_Entry_new(ct, id, ptr, size);
294  GWEN_MultiCache_AddEntry(ct->multiCache, e);
295  GWEN_MultiCache_Entry_IdMap_Insert(ct->entryMap, id, (void*) e);
296 }
297 
298 
299 
300 void GWEN_MultiCache_Type_SetDataWithParams(GWEN_MULTICACHE_TYPE *ct, uint32_t id, void *ptr, uint32_t size,
301  uint32_t param1, uint32_t param2, uint32_t param3, uint32_t param4) {
302  GWEN_MULTICACHE_ENTRY *e;
303 
304  assert(ct);
305  assert(ct->_refCount);
306 
308 
309  e=GWEN_MultiCache_Entry_new(ct, id, ptr, size);
310  GWEN_MultiCache_AddEntry(ct->multiCache, e);
315  GWEN_MultiCache_Entry_IdMap_Insert(ct->entryMap, id, (void*) e);
316 }
317 
318 
319 
320 void GWEN_MultiCache_Type_SetDataWithParams5(GWEN_MULTICACHE_TYPE *ct, uint32_t id, void *ptr, uint32_t size,
321  uint32_t param1, uint32_t param2, uint32_t param3, uint32_t param4,
322  double param5) {
323  GWEN_MULTICACHE_ENTRY *e;
324 
325  assert(ct);
326  assert(ct->_refCount);
327 
329 
330  e=GWEN_MultiCache_Entry_new(ct, id, ptr, size);
331  GWEN_MultiCache_AddEntry(ct->multiCache, e);
337  GWEN_MultiCache_Entry_IdMap_Insert(ct->entryMap, id, (void*) e);
338 }
339 
340 
341 
343  GWEN_MULTICACHE_ENTRY *e;
344 
345  assert(ct);
346  assert(ct->_refCount);
347 
348  e=(GWEN_MULTICACHE_ENTRY*)GWEN_MultiCache_Entry_IdMap_Find(ct->entryMap, id);
349  if (e)
350  GWEN_MultiCache_ReleaseEntry(ct->multiCache, e);
351 }
352 
353 
354 
356  assert(ct);
357  assert(ct->_refCount);
358 
359  GWEN_MultiCache_ReleaseEntriesForType(ct->multiCache, ct);
360 }
361 
362 
363 
365  assert(ct);
366  assert(ct->_refCount);
367 
368  ct->attachFn=fn;
369 }
370 
371 
372 
374  assert(ct);
375  assert(ct->_refCount);
376 
377  ct->freeFn=fn;
378 }
379 
380 
381 
383  assert(ct);
384  assert(ct->_refCount);
385 
386  ct->attachObjectFn=fn;
387 }
388 
389 
390 
392  assert(ct);
393  assert(ct->_refCount);
394 
395  ct->freeObjectFn=fn;
396 }
397 
398 
399 
401  assert(ct);
402  assert(ct->_refCount);
403 
404  /* try attachObjectFn first, because that has THIS object as first argument */
405  if (ct->attachObjectFn)
406  return ct->attachObjectFn(ct, p);
407 
408  if (ct->attachFn)
409  return ct->attachFn(p);
410 
412 }
413 
414 
415 
417  assert(ct);
418  assert(ct->_refCount);
419 
420  /* try freeObjectFn first, because that has THIS object as first argument */
421  if (ct->freeObjectFn)
422  return ct->freeObjectFn(ct, p);
423 
424  if (ct->freeFn)
425  return ct->freeFn(p);
426 
428 }
429 
430 
431 void GWEN_MultiCache_Type_ReleaseEntry(GWEN_MULTICACHE_TYPE *ct, GWEN_MULTICACHE_ENTRY *e) {
432  assert(ct);
433  assert(ct->_refCount);
434 
435  assert(e);
436 
437  GWEN_MultiCache_Entry_IdMap_Remove(ct->entryMap, GWEN_MultiCache_Entry_GetId(e));
438 }
439 
440 
441 
442 
443 
444 
445 
447  GWEN_MULTICACHE *mc;
448 
450  mc->_refCount=1;
451  mc->maxSize=maxSize;
452  mc->typeList=GWEN_MultiCache_Type_List_new();
453  mc->entryList=GWEN_MultiCache_Entry_List_new();
454 
455  return mc;
456 }
457 
458 
459 
461  if (mc) {
462  assert(mc->_refCount);
463 
464  if (mc->_refCount==1) {
465  GWEN_MULTICACHE_ENTRY *ce;
466 
467  ce=GWEN_MultiCache_Entry_List_First(mc->entryList);
468  while(ce) {
470  ce=GWEN_MultiCache_Entry_List_First(mc->entryList);
471  }
472 
473  GWEN_MultiCache_Entry_List_free(mc->entryList);
474  GWEN_MultiCache_Type_List_free(mc->typeList);
475 
476  DBG_NOTICE(GWEN_LOGDOMAIN, "MultiCache usage: %lld hits, %lld misses, %lld drops, %lld mb max memory used from %lld mb (%d %%)",
477  (unsigned long long int) mc->cacheHits,
478  (unsigned long long int) mc->cacheMisses,
479  (unsigned long long int) mc->cacheDrops,
480  (unsigned long long int) ((mc->maxSizeUsed)/(1024*1024)),
481  (unsigned long long int) ((mc->maxSize)/(1024*1024)),
482  (int)((mc->maxSizeUsed)*100.0/mc->maxSize));
483 
484  mc->_refCount=0;
485  GWEN_FREE_OBJECT(mc);
486  }
487  else
488  mc->_refCount--;
489  }
490 }
491 
492 
493 
495  assert(mc);
496  assert(mc->_refCount);
497  return mc->maxSizeUsed;
498 }
499 
500 
501 
502 int GWEN_MultiCache_AddEntry(GWEN_MULTICACHE *mc, GWEN_MULTICACHE_ENTRY *e) {
503  uint32_t esize;
504 
505  assert(mc);
506  assert(mc->_refCount);
507  assert(e);
508 
510  if ((mc->currentSize+esize)>mc->maxSize) {
511  int64_t nsize;
512 
513  /* make room */
514  nsize=(mc->currentSize+esize)-mc->maxSize;
515  while(nsize>0) {
516  GWEN_MULTICACHE_ENTRY *ce;
517 
518  ce=GWEN_MultiCache_Entry_List_First(mc->entryList);
519  if (ce) {
522  mc->cacheDrops++;
523  }
524  else {
525  DBG_ERROR(GWEN_LOGDOMAIN, "No entry left to release, cache size limit too low");
526  return GWEN_ERROR_MEMORY_FULL;
527  }
528  }
529  }
530 
531  mc->currentSize+=esize;
532  if (mc->currentSize>mc->maxSizeUsed)
533  mc->maxSizeUsed=mc->currentSize;
535  GWEN_MultiCache_Entry_List_Add(e, mc->entryList);
536  return 0;
537 }
538 
539 
540 
541 void GWEN_MultiCache_ReleaseEntry(GWEN_MULTICACHE *mc, GWEN_MULTICACHE_ENTRY *e) {
542  uint32_t esize;
543 
544  assert(mc);
545  assert(mc->_refCount);
546  assert(e);
547  assert(e->cacheType);
548 
549  /* remove from list first */
550  GWEN_MultiCache_Entry_List_Del(e);
551 
552  /* release from type's idmap */
554 
555  /* release */
559  mc->currentSize-=esize;
560 }
561 
562 
563 
565  GWEN_MULTICACHE_ENTRY *ce;
566 
567  assert(mc);
568  assert(mc->_refCount);
569  assert(ct);
570 
571 
572  ce=GWEN_MultiCache_Entry_List_First(mc->entryList);
573  while(ce) {
574  GWEN_MULTICACHE_ENTRY *ceNext;
575 
576  ceNext=GWEN_MultiCache_Entry_List_Next(ce);
579  ce=ceNext;
580  }
581 }
582 
583 
584 
585 void GWEN_MultiCache_UsingEntry(GWEN_MULTICACHE *mc, GWEN_MULTICACHE_ENTRY *e) {
586  assert(mc);
587  assert(mc->_refCount);
588 
589  /* move cache entry to the end of the list */
590  GWEN_MultiCache_Entry_List_Del(e);
591  GWEN_MultiCache_Entry_List_Add(e, mc->entryList);
592 }
593 
594 
595 
597  assert(mc);
598  assert(mc->_refCount);
599  mc->cacheHits++;
600 }
601 
602 
603 
605  assert(mc);
606  assert(mc->_refCount);
607  mc->cacheMisses++;
608 }
609 
610 
611 
612 
void GWEN_MultiCache_Type_ReleaseEntry(GWEN_MULTICACHE_TYPE *ct, GWEN_MULTICACHE_ENTRY *e)
Definition: multicache.c:431
void GWEN_MultiCache_Entry_SetParam5(GWEN_MULTICACHE_ENTRY *e, double d)
Definition: multicache.c:160
GWEN_MULTICACHE_ENTRY * GWEN_MultiCache_Entry_new(GWEN_MULTICACHE_TYPE *ct, uint32_t id, void *p, uint32_t i)
Definition: multicache.c:44
int GWEN_MultiCache_Type_FreeData(const GWEN_MULTICACHE_TYPE *ct, void *p)
Definition: multicache.c:416
void GWEN_MultiCache_IncCacheHits(GWEN_MULTICACHE *mc)
Definition: multicache.c:596
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)
Definition: multicache.c:320
#define DBG_NOTICE(dbg_logger, format, args...)
Definition: debug.h:140
int GWENHYWFAR_CB(* GWEN_MULTICACHE_TYPE_FREE_OBJECT_FN)(const GWEN_MULTICACHE_TYPE *ct, void *p)
Definition: multicache.h:66
#define GWEN_FREE_OBJECT(varname)
Definition: memory.h:92
#define NULL
Definition: binreloc.c:290
uint32_t GWEN_MultiCache_Entry_GetParam3(const GWEN_MULTICACHE_ENTRY *e)
Definition: multicache.c:125
uint32_t GWEN_MultiCache_Entry_GetParam4(const GWEN_MULTICACHE_ENTRY *e)
Definition: multicache.c:139
uint32_t GWEN_MultiCache_Entry_GetParam1(const GWEN_MULTICACHE_ENTRY *e)
Definition: multicache.c:97
void GWEN_MultiCache_Type_PurgeAll(GWEN_MULTICACHE_TYPE *ct)
Definition: multicache.c:355
void GWEN_MultiCache_free(GWEN_MULTICACHE *mc)
Definition: multicache.c:460
void GWEN_MultiCache_Type_free(GWEN_MULTICACHE_TYPE *ct)
Definition: multicache.c:187
#define GWEN_LOGDOMAIN
Definition: logger.h:35
int GWEN_MultiCache_AddEntry(GWEN_MULTICACHE *mc, GWEN_MULTICACHE_ENTRY *e)
Definition: multicache.c:502
GWEN_MULTICACHE * GWEN_MultiCache_new(uint64_t maxSize)
Definition: multicache.c:446
int GWENHYWFAR_CB(* GWEN_MULTICACHE_TYPE_ATTACH_FN)(void *p)
Definition: multicache.h:62
void GWEN_MultiCache_Entry_SetParam2(GWEN_MULTICACHE_ENTRY *e, uint32_t i)
Definition: multicache.c:118
int GWENHYWFAR_CB(* GWEN_MULTICACHE_TYPE_FREE_FN)(void *p)
Definition: multicache.h:63
struct GWEN_MULTICACHE GWEN_MULTICACHE
Definition: multicache.h:58
GWEN_MULTICACHE_TYPE * GWEN_MultiCache_Entry_GetCacheType(const GWEN_MULTICACHE_ENTRY *e)
Definition: multicache.c:90
uint64_t GWEN_MultiCache_GetMaxSizeUsed(const GWEN_MULTICACHE *mc)
Definition: multicache.c:494
#define GWEN_NEW_OBJECT(typ, varname)
Definition: memory.h:86
void GWEN_MultiCache_Entry_SetParam1(GWEN_MULTICACHE_ENTRY *e, uint32_t i)
Definition: multicache.c:104
GWEN_LIST_FUNCTIONS(GWEN_MULTICACHE_ENTRY, GWEN_MultiCache_Entry)
void GWEN_MultiCache_Entry_free(GWEN_MULTICACHE_ENTRY *e)
Definition: multicache.c:60
uint32_t GWEN_MultiCache_Entry_GetId(const GWEN_MULTICACHE_ENTRY *e)
Definition: multicache.c:69
double GWEN_MultiCache_Entry_GetParam5(const GWEN_MULTICACHE_ENTRY *e)
Definition: multicache.c:153
void GWEN_MultiCache_Entry_SetParam3(GWEN_MULTICACHE_ENTRY *e, uint32_t i)
Definition: multicache.c:132
void GWEN_MultiCache_ReleaseEntry(GWEN_MULTICACHE *mc, GWEN_MULTICACHE_ENTRY *e)
Definition: multicache.c:541
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)
Definition: multicache.c:255
void GWEN_MultiCache_ReleaseEntriesForType(GWEN_MULTICACHE *mc, GWEN_MULTICACHE_TYPE *ct)
Definition: multicache.c:564
struct GWEN_MULTICACHE_TYPE GWEN_MULTICACHE_TYPE
Definition: multicache.h:59
#define DBG_ERROR(dbg_logger, format, args...)
Definition: debug.h:97
void GWEN_MultiCache_IncCacheMisses(GWEN_MULTICACHE *mc)
Definition: multicache.c:604
uint32_t GWEN_MultiCache_Entry_GetParam2(const GWEN_MULTICACHE_ENTRY *e)
Definition: multicache.c:111
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)
Definition: multicache.c:300
void GWEN_MultiCache_Type_SetFreeObjectFn(GWEN_MULTICACHE_TYPE *ct, GWEN_MULTICACHE_TYPE_FREE_OBJECT_FN fn)
Definition: multicache.c:391
int GWENHYWFAR_CB(* GWEN_MULTICACHE_TYPE_ATTACH_OBJECT_FN)(const GWEN_MULTICACHE_TYPE *ct, void *p)
Definition: multicache.h:65
void GWEN_MultiCache_Type_SetFreeFn(GWEN_MULTICACHE_TYPE *ct, GWEN_MULTICACHE_TYPE_FREE_FN fn)
Definition: multicache.c:373
#define GWEN_LIST_INIT(t, element)
Definition: list1.h:465
void GWEN_MultiCache_UsingEntry(GWEN_MULTICACHE *mc, GWEN_MULTICACHE_ENTRY *e)
Definition: multicache.c:585
void GWEN_MultiCache_Type_PurgeData(GWEN_MULTICACHE_TYPE *ct, uint32_t id)
Definition: multicache.c:342
uint32_t GWEN_MultiCache_Entry_GetDataSize(const GWEN_MULTICACHE_ENTRY *e)
Definition: multicache.c:76
void * GWEN_MultiCache_Type_GetData(const GWEN_MULTICACHE_TYPE *ct, uint32_t id)
Definition: multicache.c:204
void GWEN_MultiCache_Type_SetAttachFn(GWEN_MULTICACHE_TYPE *ct, GWEN_MULTICACHE_TYPE_ATTACH_FN fn)
Definition: multicache.c:364
void GWEN_MultiCache_Type_SetAttachObjectFn(GWEN_MULTICACHE_TYPE *ct, GWEN_MULTICACHE_TYPE_ATTACH_OBJECT_FN fn)
Definition: multicache.c:382
int GWEN_MultiCache_Type_AttachData(const GWEN_MULTICACHE_TYPE *ct, void *p)
Definition: multicache.c:400
void GWEN_MultiCache_Entry_SetParam4(GWEN_MULTICACHE_ENTRY *e, uint32_t i)
Definition: multicache.c:146
void GWEN_MultiCache_Type_SetData(GWEN_MULTICACHE_TYPE *ct, uint32_t id, void *ptr, uint32_t size)
Definition: multicache.c:286
void * GWEN_MultiCache_Entry_GetDataPtr(const GWEN_MULTICACHE_ENTRY *e)
Definition: multicache.c:83
#define GWEN_LIST_FINI(t, element)
Definition: list1.h:474
GWEN_IDMAP_FUNCTIONS(GWEN_MULTICACHE_ENTRY, GWEN_MultiCache_Entry)
GWEN_MULTICACHE_TYPE * GWEN_MultiCache_Type_new(GWEN_MULTICACHE *mc)
Definition: multicache.c:173
#define GWEN_ERROR_MEMORY_FULL
Definition: error.h:77
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)
Definition: multicache.c:226
#define GWEN_ERROR_NOT_IMPLEMENTED
Definition: error.h:108