gwenhywfar  5.1.2
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 {
46  GWEN_MULTICACHE_ENTRY *e;
47 
48  GWEN_NEW_OBJECT(GWEN_MULTICACHE_ENTRY, e);
49  GWEN_LIST_INIT(GWEN_MULTICACHE_ENTRY, e);
50 
51  e->cacheType=ct;
52  e->id=id;
53  e->dataPtr=p;
54  e->dataSize=i;
55 
56  return e;
57 }
58 
59 
60 
61 void GWEN_MultiCache_Entry_free(GWEN_MULTICACHE_ENTRY *e)
62 {
63  if (e) {
64  GWEN_LIST_FINI(GWEN_MULTICACHE_ENTRY, e);
66  }
67 }
68 
69 
70 
71 uint32_t GWEN_MultiCache_Entry_GetId(const GWEN_MULTICACHE_ENTRY *e)
72 {
73  assert(e);
74  return e->id;
75 }
76 
77 
78 
79 uint32_t GWEN_MultiCache_Entry_GetDataSize(const GWEN_MULTICACHE_ENTRY *e)
80 {
81  assert(e);
82  return e->dataSize;
83 }
84 
85 
86 
87 void *GWEN_MultiCache_Entry_GetDataPtr(const GWEN_MULTICACHE_ENTRY *e)
88 {
89  assert(e);
90  return e->dataPtr;
91 }
92 
93 
94 
96 {
97  assert(e);
98  return e->cacheType;
99 }
100 
101 
102 
103 uint32_t GWEN_MultiCache_Entry_GetParam1(const GWEN_MULTICACHE_ENTRY *e)
104 {
105  assert(e);
106  return e->param1;
107 }
108 
109 
110 
111 void GWEN_MultiCache_Entry_SetParam1(GWEN_MULTICACHE_ENTRY *e, uint32_t i)
112 {
113  assert(e);
114  e->param1=i;
115 }
116 
117 
118 
119 uint32_t GWEN_MultiCache_Entry_GetParam2(const GWEN_MULTICACHE_ENTRY *e)
120 {
121  assert(e);
122  return e->param2;
123 }
124 
125 
126 
127 void GWEN_MultiCache_Entry_SetParam2(GWEN_MULTICACHE_ENTRY *e, uint32_t i)
128 {
129  assert(e);
130  e->param2=i;
131 }
132 
133 
134 
135 uint32_t GWEN_MultiCache_Entry_GetParam3(const GWEN_MULTICACHE_ENTRY *e)
136 {
137  assert(e);
138  return e->param3;
139 }
140 
141 
142 
143 void GWEN_MultiCache_Entry_SetParam3(GWEN_MULTICACHE_ENTRY *e, uint32_t i)
144 {
145  assert(e);
146  e->param3=i;
147 }
148 
149 
150 
151 uint32_t GWEN_MultiCache_Entry_GetParam4(const GWEN_MULTICACHE_ENTRY *e)
152 {
153  assert(e);
154  return e->param4;
155 }
156 
157 
158 
159 void GWEN_MultiCache_Entry_SetParam4(GWEN_MULTICACHE_ENTRY *e, uint32_t i)
160 {
161  assert(e);
162  e->param4=i;
163 }
164 
165 
166 
167 double GWEN_MultiCache_Entry_GetParam5(const GWEN_MULTICACHE_ENTRY *e)
168 {
169  assert(e);
170  return e->param5;
171 }
172 
173 
174 
175 void GWEN_MultiCache_Entry_SetParam5(GWEN_MULTICACHE_ENTRY *e, double d)
176 {
177  assert(e);
178  e->param5=d;
179 }
180 
181 
182 
183 
184 
185 
186 
187 
188 
190 {
192 
195  ct->_refCount=1;
196  ct->multiCache=mc;
197  ct->entryMap=GWEN_MultiCache_Entry_IdMap_new(GWEN_IdMapAlgo_Hex4);
198 
199  return ct;
200 }
201 
202 
203 
205 {
206  if (ct) {
207  assert(ct->_refCount);
208  if (ct->_refCount==1) {
209  GWEN_MultiCache_ReleaseEntriesForType(ct->multiCache, ct);
210  GWEN_MultiCache_Entry_IdMap_free(ct->entryMap);
212  ct->_refCount=0;
213  GWEN_FREE_OBJECT(ct);
214  }
215  else
216  ct->_refCount--;
217  }
218 }
219 
220 
221 
223 {
224  GWEN_MULTICACHE_ENTRY *e;
225 
226  assert(ct);
227  assert(ct->_refCount);
228 
229  e=(GWEN_MULTICACHE_ENTRY *)GWEN_MultiCache_Entry_IdMap_Find(ct->entryMap, id);
230  if (e) {
231  void *p;
232 
233  GWEN_MultiCache_UsingEntry(ct->multiCache, e);
236  GWEN_MultiCache_IncCacheHits(ct->multiCache);
237  return p;
238  }
239  GWEN_MultiCache_IncCacheMisses(ct->multiCache);
240  return NULL;
241 }
242 
243 
244 
246  uint32_t param1, uint32_t param2, uint32_t param3, uint32_t param4)
247 {
248 
249  GWEN_MULTICACHE_ENTRY *e;
250 
251  assert(ct);
252  assert(ct->_refCount);
253 
254  e=(GWEN_MULTICACHE_ENTRY *)GWEN_MultiCache_Entry_IdMap_Find(ct->entryMap, id);
255  if (e) {
256  if ((GWEN_MultiCache_Entry_GetParam1(e)==param1) &&
257  (GWEN_MultiCache_Entry_GetParam2(e)==param2) &&
258  (GWEN_MultiCache_Entry_GetParam3(e)==param3) &&
259  (GWEN_MultiCache_Entry_GetParam4(e)==param4)) {
260  void *p;
261 
262  GWEN_MultiCache_UsingEntry(ct->multiCache, e);
265  GWEN_MultiCache_IncCacheHits(ct->multiCache);
266  return p;
267  }
268  }
269  GWEN_MultiCache_IncCacheMisses(ct->multiCache);
270  return NULL;
271 }
272 
273 
274 
276  uint32_t param1, uint32_t param2, uint32_t param3, uint32_t param4,
277  double param5)
278 {
279 
280  GWEN_MULTICACHE_ENTRY *e;
281 
282  assert(ct);
283  assert(ct->_refCount);
284 
285  e=(GWEN_MULTICACHE_ENTRY *)GWEN_MultiCache_Entry_IdMap_Find(ct->entryMap, id);
286  if (e) {
287  if ((GWEN_MultiCache_Entry_GetParam1(e)==param1) &&
288  (GWEN_MultiCache_Entry_GetParam2(e)==param2) &&
289  (GWEN_MultiCache_Entry_GetParam3(e)==param3) &&
290  (GWEN_MultiCache_Entry_GetParam4(e)==param4) &&
291  (GWEN_MultiCache_Entry_GetParam5(e)==param5)) {
292  void *p;
293 
294  GWEN_MultiCache_UsingEntry(ct->multiCache, e);
297  GWEN_MultiCache_IncCacheHits(ct->multiCache);
298  return p;
299  }
300  }
301  GWEN_MultiCache_IncCacheMisses(ct->multiCache);
302  return NULL;
303 }
304 
305 
306 
307 void GWEN_MultiCache_Type_SetData(GWEN_MULTICACHE_TYPE *ct, uint32_t id, void *ptr, uint32_t size)
308 {
309  GWEN_MULTICACHE_ENTRY *e;
310 
311  assert(ct);
312  assert(ct->_refCount);
313 
315  e=GWEN_MultiCache_Entry_new(ct, id, ptr, size);
316  GWEN_MultiCache_AddEntry(ct->multiCache, e);
317  GWEN_MultiCache_Entry_IdMap_Insert(ct->entryMap, id, (void *) e);
318 }
319 
320 
321 
322 void GWEN_MultiCache_Type_SetDataWithParams(GWEN_MULTICACHE_TYPE *ct, uint32_t id, void *ptr, uint32_t size,
323  uint32_t param1, uint32_t param2, uint32_t param3, uint32_t param4)
324 {
325  GWEN_MULTICACHE_ENTRY *e;
326 
327  assert(ct);
328  assert(ct->_refCount);
329 
331 
332  e=GWEN_MultiCache_Entry_new(ct, id, ptr, size);
333  GWEN_MultiCache_AddEntry(ct->multiCache, e);
338  GWEN_MultiCache_Entry_IdMap_Insert(ct->entryMap, id, (void *) e);
339 }
340 
341 
342 
343 void GWEN_MultiCache_Type_SetDataWithParams5(GWEN_MULTICACHE_TYPE *ct, uint32_t id, void *ptr, uint32_t size,
344  uint32_t param1, uint32_t param2, uint32_t param3, uint32_t param4,
345  double param5)
346 {
347  GWEN_MULTICACHE_ENTRY *e;
348 
349  assert(ct);
350  assert(ct->_refCount);
351 
353 
354  e=GWEN_MultiCache_Entry_new(ct, id, ptr, size);
355  GWEN_MultiCache_AddEntry(ct->multiCache, e);
361  GWEN_MultiCache_Entry_IdMap_Insert(ct->entryMap, id, (void *) e);
362 }
363 
364 
365 
367 {
368  GWEN_MULTICACHE_ENTRY *e;
369 
370  assert(ct);
371  assert(ct->_refCount);
372 
373  e=(GWEN_MULTICACHE_ENTRY *)GWEN_MultiCache_Entry_IdMap_Find(ct->entryMap, id);
374  if (e)
375  GWEN_MultiCache_ReleaseEntry(ct->multiCache, e);
376 }
377 
378 
379 
381 {
382  assert(ct);
383  assert(ct->_refCount);
384 
385  GWEN_MultiCache_ReleaseEntriesForType(ct->multiCache, ct);
386 }
387 
388 
389 
391 {
392  assert(ct);
393  assert(ct->_refCount);
394 
395  ct->attachFn=fn;
396 }
397 
398 
399 
401 {
402  assert(ct);
403  assert(ct->_refCount);
404 
405  ct->freeFn=fn;
406 }
407 
408 
409 
411 {
412  assert(ct);
413  assert(ct->_refCount);
414 
415  ct->attachObjectFn=fn;
416 }
417 
418 
419 
421 {
422  assert(ct);
423  assert(ct->_refCount);
424 
425  ct->freeObjectFn=fn;
426 }
427 
428 
429 
431 {
432  assert(ct);
433  assert(ct->_refCount);
434 
435  /* try attachObjectFn first, because that has THIS object as first argument */
436  if (ct->attachObjectFn)
437  return ct->attachObjectFn(ct, p);
438 
439  if (ct->attachFn)
440  return ct->attachFn(p);
441 
443 }
444 
445 
446 
448 {
449  assert(ct);
450  assert(ct->_refCount);
451 
452  /* try freeObjectFn first, because that has THIS object as first argument */
453  if (ct->freeObjectFn)
454  return ct->freeObjectFn(ct, p);
455 
456  if (ct->freeFn)
457  return ct->freeFn(p);
458 
460 }
461 
462 
463 void GWEN_MultiCache_Type_ReleaseEntry(GWEN_MULTICACHE_TYPE *ct, GWEN_MULTICACHE_ENTRY *e)
464 {
465  assert(ct);
466  assert(ct->_refCount);
467 
468  assert(e);
469 
470  GWEN_MultiCache_Entry_IdMap_Remove(ct->entryMap, GWEN_MultiCache_Entry_GetId(e));
471 }
472 
473 
474 
475 
476 
477 
478 
480 {
481  GWEN_MULTICACHE *mc;
482 
484  mc->_refCount=1;
485  mc->maxSize=maxSize;
486  mc->typeList=GWEN_MultiCache_Type_List_new();
487  mc->entryList=GWEN_MultiCache_Entry_List_new();
488 
489  return mc;
490 }
491 
492 
493 
495 {
496  if (mc) {
497  assert(mc->_refCount);
498 
499  if (mc->_refCount==1) {
500  GWEN_MULTICACHE_ENTRY *ce;
501 
502  ce=GWEN_MultiCache_Entry_List_First(mc->entryList);
503  while (ce) {
505  ce=GWEN_MultiCache_Entry_List_First(mc->entryList);
506  }
507 
508  GWEN_MultiCache_Entry_List_free(mc->entryList);
509  GWEN_MultiCache_Type_List_free(mc->typeList);
510 
512  "MultiCache usage: "
513  "%" PRIu64 " hits, "
514  "%" PRIu64 " misses, "
515  "%" PRIu64 " drops, "
516  "%" PRIu64 " mb max memory used from "
517  "%" PRIu64 " mb "
518  "(%d %%)",
519  (uint64_t) mc->cacheHits,
520  (uint64_t) mc->cacheMisses,
521  (uint64_t) mc->cacheDrops,
522  (uint64_t)((mc->maxSizeUsed)/(1024*1024)),
523  (uint64_t)((mc->maxSize)/(1024*1024)),
524  (int)((mc->maxSizeUsed)*100.0/mc->maxSize));
525 
526  mc->_refCount=0;
527  GWEN_FREE_OBJECT(mc);
528  }
529  else
530  mc->_refCount--;
531  }
532 }
533 
534 
535 
537 {
538  assert(mc);
539  assert(mc->_refCount);
540  return mc->maxSizeUsed;
541 }
542 
543 
544 
545 int GWEN_MultiCache_AddEntry(GWEN_MULTICACHE *mc, GWEN_MULTICACHE_ENTRY *e)
546 {
547  uint32_t esize;
548 
549  assert(mc);
550  assert(mc->_refCount);
551  assert(e);
552 
554  if ((mc->currentSize+esize)>mc->maxSize) {
555  int64_t nsize;
556 
557  /* make room */
558  nsize=(mc->currentSize+esize)-mc->maxSize;
559  while (nsize>0) {
560  GWEN_MULTICACHE_ENTRY *ce;
561 
562  ce=GWEN_MultiCache_Entry_List_First(mc->entryList);
563  if (ce) {
566  mc->cacheDrops++;
567  }
568  else {
569  DBG_ERROR(GWEN_LOGDOMAIN, "No entry left to release, cache size limit too low");
570  return GWEN_ERROR_MEMORY_FULL;
571  }
572  }
573  }
574 
575  mc->currentSize+=esize;
576  if (mc->currentSize>mc->maxSizeUsed)
577  mc->maxSizeUsed=mc->currentSize;
579  GWEN_MultiCache_Entry_List_Add(e, mc->entryList);
580  return 0;
581 }
582 
583 
584 
585 void GWEN_MultiCache_ReleaseEntry(GWEN_MULTICACHE *mc, GWEN_MULTICACHE_ENTRY *e)
586 {
587  uint32_t esize;
588 
589  assert(mc);
590  assert(mc->_refCount);
591  assert(e);
592  assert(e->cacheType);
593 
594  /* remove from list first */
595  GWEN_MultiCache_Entry_List_Del(e);
596 
597  /* release from type's idmap */
599 
600  /* release */
604  mc->currentSize-=esize;
605 }
606 
607 
608 
610 {
611  GWEN_MULTICACHE_ENTRY *ce;
612 
613  assert(mc);
614  assert(mc->_refCount);
615  assert(ct);
616 
617 
618  ce=GWEN_MultiCache_Entry_List_First(mc->entryList);
619  while (ce) {
620  GWEN_MULTICACHE_ENTRY *ceNext;
621 
622  ceNext=GWEN_MultiCache_Entry_List_Next(ce);
625  ce=ceNext;
626  }
627 }
628 
629 
630 
631 void GWEN_MultiCache_UsingEntry(GWEN_MULTICACHE *mc, GWEN_MULTICACHE_ENTRY *e)
632 {
633  assert(mc);
634  assert(mc->_refCount);
635 
636  /* move cache entry to the end of the list */
637  GWEN_MultiCache_Entry_List_Del(e);
638  GWEN_MultiCache_Entry_List_Add(e, mc->entryList);
639 }
640 
641 
642 
644 {
645  assert(mc);
646  assert(mc->_refCount);
647  mc->cacheHits++;
648 }
649 
650 
651 
653 {
654  assert(mc);
655  assert(mc->_refCount);
656  mc->cacheMisses++;
657 }
658 
659 
660 
661 
void GWEN_MultiCache_Type_ReleaseEntry(GWEN_MULTICACHE_TYPE *ct, GWEN_MULTICACHE_ENTRY *e)
Definition: multicache.c:463
void GWEN_MultiCache_Entry_SetParam5(GWEN_MULTICACHE_ENTRY *e, double d)
Definition: multicache.c:175
GWEN_MULTICACHE_ENTRY * GWEN_MultiCache_Entry_new(GWEN_MULTICACHE_TYPE *ct, uint32_t id, void *p, uint32_t i)
Definition: multicache.c:44
int GWENHYWFAR_CB(* GWEN_MULTICACHE_TYPE_FREE_OBJECT_FN)(const GWEN_MULTICACHE_TYPE *ct, void *p)
Definition: multicache.h:66
int GWEN_MultiCache_Type_FreeData(const GWEN_MULTICACHE_TYPE *ct, void *p)
Definition: multicache.c:447
void GWEN_MultiCache_IncCacheHits(GWEN_MULTICACHE *mc)
Definition: multicache.c:643
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:343
#define DBG_NOTICE(dbg_logger, format, args...)
Definition: debug.h:151
#define GWEN_FREE_OBJECT(varname)
Definition: memory.h:61
#define NULL
Definition: binreloc.c:300
uint32_t GWEN_MultiCache_Entry_GetParam3(const GWEN_MULTICACHE_ENTRY *e)
Definition: multicache.c:135
uint32_t GWEN_MultiCache_Entry_GetParam4(const GWEN_MULTICACHE_ENTRY *e)
Definition: multicache.c:151
uint32_t GWEN_MultiCache_Entry_GetParam1(const GWEN_MULTICACHE_ENTRY *e)
Definition: multicache.c:103
void GWEN_MultiCache_Type_PurgeAll(GWEN_MULTICACHE_TYPE *ct)
Definition: multicache.c:380
void GWEN_MultiCache_free(GWEN_MULTICACHE *mc)
Definition: multicache.c:494
void GWEN_MultiCache_Type_free(GWEN_MULTICACHE_TYPE *ct)
Definition: multicache.c:204
#define GWEN_LOGDOMAIN
Definition: logger.h:35
int GWEN_MultiCache_AddEntry(GWEN_MULTICACHE *mc, GWEN_MULTICACHE_ENTRY *e)
Definition: multicache.c:545
int GWENHYWFAR_CB(* GWEN_MULTICACHE_TYPE_ATTACH_OBJECT_FN)(const GWEN_MULTICACHE_TYPE *ct, void *p)
Definition: multicache.h:65
int GWENHYWFAR_CB(* GWEN_MULTICACHE_TYPE_FREE_FN)(void *p)
Definition: multicache.h:63
GWEN_MULTICACHE * GWEN_MultiCache_new(uint64_t maxSize)
Definition: multicache.c:479
void GWEN_MultiCache_Entry_SetParam2(GWEN_MULTICACHE_ENTRY *e, uint32_t i)
Definition: multicache.c:127
struct GWEN_MULTICACHE GWEN_MULTICACHE
Definition: multicache.h:58
GWEN_MULTICACHE_TYPE * GWEN_MultiCache_Entry_GetCacheType(const GWEN_MULTICACHE_ENTRY *e)
Definition: multicache.c:95
uint64_t GWEN_MultiCache_GetMaxSizeUsed(const GWEN_MULTICACHE *mc)
Definition: multicache.c:536
#define GWEN_NEW_OBJECT(typ, varname)
Definition: memory.h:55
void GWEN_MultiCache_Entry_SetParam1(GWEN_MULTICACHE_ENTRY *e, uint32_t i)
Definition: multicache.c:111
GWEN_LIST_FUNCTIONS(GWEN_MULTICACHE_ENTRY, GWEN_MultiCache_Entry)
void GWEN_MultiCache_Entry_free(GWEN_MULTICACHE_ENTRY *e)
Definition: multicache.c:61
uint32_t GWEN_MultiCache_Entry_GetId(const GWEN_MULTICACHE_ENTRY *e)
Definition: multicache.c:71
double GWEN_MultiCache_Entry_GetParam5(const GWEN_MULTICACHE_ENTRY *e)
Definition: multicache.c:167
void GWEN_MultiCache_Entry_SetParam3(GWEN_MULTICACHE_ENTRY *e, uint32_t i)
Definition: multicache.c:143
void GWEN_MultiCache_ReleaseEntry(GWEN_MULTICACHE *mc, GWEN_MULTICACHE_ENTRY *e)
Definition: multicache.c:585
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:275
void GWEN_MultiCache_ReleaseEntriesForType(GWEN_MULTICACHE *mc, GWEN_MULTICACHE_TYPE *ct)
Definition: multicache.c:609
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:652
uint32_t GWEN_MultiCache_Entry_GetParam2(const GWEN_MULTICACHE_ENTRY *e)
Definition: multicache.c:119
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:322
void GWEN_MultiCache_Type_SetFreeObjectFn(GWEN_MULTICACHE_TYPE *ct, GWEN_MULTICACHE_TYPE_FREE_OBJECT_FN fn)
Definition: multicache.c:420
void GWEN_MultiCache_Type_SetFreeFn(GWEN_MULTICACHE_TYPE *ct, GWEN_MULTICACHE_TYPE_FREE_FN fn)
Definition: multicache.c:400
#define GWEN_LIST_INIT(t, element)
Definition: list1.h:465
void GWEN_MultiCache_UsingEntry(GWEN_MULTICACHE *mc, GWEN_MULTICACHE_ENTRY *e)
Definition: multicache.c:631
void GWEN_MultiCache_Type_PurgeData(GWEN_MULTICACHE_TYPE *ct, uint32_t id)
Definition: multicache.c:366
uint32_t GWEN_MultiCache_Entry_GetDataSize(const GWEN_MULTICACHE_ENTRY *e)
Definition: multicache.c:79
void * GWEN_MultiCache_Type_GetData(const GWEN_MULTICACHE_TYPE *ct, uint32_t id)
Definition: multicache.c:222
int GWENHYWFAR_CB(* GWEN_MULTICACHE_TYPE_ATTACH_FN)(void *p)
Definition: multicache.h:62
void GWEN_MultiCache_Type_SetAttachFn(GWEN_MULTICACHE_TYPE *ct, GWEN_MULTICACHE_TYPE_ATTACH_FN fn)
Definition: multicache.c:390
void GWEN_MultiCache_Type_SetAttachObjectFn(GWEN_MULTICACHE_TYPE *ct, GWEN_MULTICACHE_TYPE_ATTACH_OBJECT_FN fn)
Definition: multicache.c:410
int GWEN_MultiCache_Type_AttachData(const GWEN_MULTICACHE_TYPE *ct, void *p)
Definition: multicache.c:430
void GWEN_MultiCache_Entry_SetParam4(GWEN_MULTICACHE_ENTRY *e, uint32_t i)
Definition: multicache.c:159
void GWEN_MultiCache_Type_SetData(GWEN_MULTICACHE_TYPE *ct, uint32_t id, void *ptr, uint32_t size)
Definition: multicache.c:307
void * GWEN_MultiCache_Entry_GetDataPtr(const GWEN_MULTICACHE_ENTRY *e)
Definition: multicache.c:87
#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:189
#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:245
#define GWEN_ERROR_NOT_IMPLEMENTED
Definition: error.h:108