Basilisk CFD
Adaptive Cartesian mesh PDE framework
Loading...
Searching...
No Matches
mempool.h
Go to the documentation of this file.
1/** @file mempool.h
2 */
3/* A memory pool implementation for fixed-size blocks
4 It uses Simple Segregated Storage, see e.g:
5 http://www.boost.org/doc/libs/1_55_0/libs/pool/doc/html/boost_pool/pool/pooling.html
6*/
7
8typedef struct _Pool Pool;
9
10struct _Pool {
11 Pool * next; // next pool
12};
13
14typedef struct {
15 char * first, * lastb; // first and last free blocks
16 size_t size; // block size
17 size_t poolsize; // pool size
18 Pool * pool, * last; // first and last pools
19} Mempool;
20
21typedef struct {
22 char * next;
23} FreeBlock;
24
25Mempool * mempool_new (size_t poolsize, size_t size)
26{
27 // check for 64 bytes alignment
28 assert (poolsize % 8 == 0);
29 assert (size >= sizeof(FreeBlock));
30 // to get the effective pool size, we cap this amount to 2^20 = 1MB
31 // i.e. something comparable to the size of a L2 cache
32 poolsize = min(1 << 20, poolsize + sizeof(Pool));
33 Mempool * m = qcalloc (1, Mempool);
34 m->poolsize = poolsize;
35 m->size = size;
36 return m;
37}
38
40{
41 Pool * p = m->pool;
42 while (p) {
43 Pool * next = p->next;
44 free (p);
45 p = next;
46 }
47 free (m);
48}
49
51{
52 if (!m->first) {
53 // allocate new pool
54 Pool * p = (Pool *) malloc (m->poolsize);
55 p->next = NULL;
56 if (m->last)
57 m->last->next = p;
58 else
59 m->pool = p;
60 m->last = p;
61 m->first = m->lastb = ((char *)m->last) + sizeof(Pool);
62 FreeBlock * b = (FreeBlock *) m->first;
63 b->next = NULL;
64 }
65 void * ret = m->first;
66 FreeBlock * b = (FreeBlock *) ret;
67 char * next = b->next;
68 if (!next) {
69 m->lastb += m->size;
70 next = m->lastb;
71 if (next + m->size > ((char *) m->last) + m->poolsize)
72 next = NULL;
73 else {
74 FreeBlock * b = (FreeBlock *) next;
75 b->next = NULL;
76 }
77 }
78 m->first = next;
79@if TRASH
80 double * v = (double *) ret;
81 for (int i = 0; i < m->size/sizeof(real); i++)
82 v[i] = undefined;
83@endif
84 return ret;
85}
86
88{
89 void * ret = mempool_alloc (m);
90 memset (ret, 0, m->size);
91 return ret;
92}
93
94void mempool_free (Mempool * m, void * p)
95{
96@if TRASH
97 double * v = (double *) p;
98 for (int i = 0; i < m->size/sizeof(real); i++)
99 v[i] = undefined;
100@endif
101 FreeBlock * b = (FreeBlock *) p;
102 b->next = m->first;
103 m->first = (char *) p;
104}
int min
Definition balance.h:192
define m((k)==0 &&(l)==0 &&(m)==0) macro2 foreach_point(double _x=0.
double real
Definition cartesian.h:6
free(list1)
int x
Definition common.h:76
#define p
Definition tree.h:320
else define undefined((double) DBL_MAX) @ define enable_fpe(flags) @ define disable_fpe(flags) static void set_fpe(void)
Definition config.h:615
#define qcalloc(size, type)
#define assert(a)
Definition config.h:107
double v[2]
Definition embed.h:383
scalar int i
Definition embed.h:74
void mempool_free(Mempool *m, void *p)
Definition mempool.h:94
void mempool_destroy(Mempool *m)
Definition mempool.h:39
struct _Pool Pool
Definition mempool.h:8
void * mempool_alloc0(Mempool *m)
Definition mempool.h:87
void * mempool_alloc(Mempool *m)
Definition mempool.h:50
Mempool * mempool_new(size_t poolsize, size_t size)
Definition mempool.h:25
size_t size
size *double * b
char * next
Definition mempool.h:22
size_t poolsize
Definition mempool.h:17
size_t size
Definition mempool.h:16
char * first
Definition mempool.h:15
Pool * last
Definition mempool.h:18
Pool * next
Definition mempool.h:11
static size_t poolsize(size_t depth, size_t size)
Definition tree.h:128