xref: /minix3/minix/lib/libmagicrt/include/magic_mem.h (revision b2ed49a5d83e311ee0fa9e5ff613639b1bf77aaf)
1*b2ed49a5SDavid van Moolenbroek #ifndef _MAGIC_MEM_H
2*b2ed49a5SDavid van Moolenbroek #define _MAGIC_MEM_H
3*b2ed49a5SDavid van Moolenbroek 
4*b2ed49a5SDavid van Moolenbroek #include <magic.h>
5*b2ed49a5SDavid van Moolenbroek 
6*b2ed49a5SDavid van Moolenbroek #define __MA_ARGS__             struct _magic_type *type, const char *name, const char *parent_name,
7*b2ed49a5SDavid van Moolenbroek #define __MA_VALUES__           type, name, parent_name,
8*b2ed49a5SDavid van Moolenbroek #define __MA_VALUES_EXT__       MAGIC_VOID_TYPE, MAGIC_ALLOC_EXT_NAME, MAGIC_ALLOC_EXT_PARENT_NAME,
9*b2ed49a5SDavid van Moolenbroek 
10*b2ed49a5SDavid van Moolenbroek #define __MD_ARGS__
11*b2ed49a5SDavid van Moolenbroek #define __MD_VALUES__
12*b2ed49a5SDavid van Moolenbroek #define __MD_VALUES_EXT__
13*b2ed49a5SDavid van Moolenbroek #define __MD_VALUES_DEFAULT__
14*b2ed49a5SDavid van Moolenbroek 
15*b2ed49a5SDavid van Moolenbroek /* External callbacks. */
16*b2ed49a5SDavid van Moolenbroek typedef void *(*magic_mem_heap_alloc_cb_t)(size_t size, const char *name, const char *parent_name);
17*b2ed49a5SDavid van Moolenbroek typedef void (*magic_mem_create_dsentry_cb_t)(struct _magic_dsentry *dsentry);
18*b2ed49a5SDavid van Moolenbroek typedef int (*magic_mem_heap_free_cb_t)(struct _magic_dsentry *dsentry);
19*b2ed49a5SDavid van Moolenbroek extern magic_mem_heap_alloc_cb_t magic_mem_heap_alloc_cb;
20*b2ed49a5SDavid van Moolenbroek extern magic_mem_create_dsentry_cb_t magic_mem_create_dsentry_cb;
21*b2ed49a5SDavid van Moolenbroek extern magic_mem_heap_free_cb_t magic_mem_heap_free_cb;
22*b2ed49a5SDavid van Moolenbroek 
23*b2ed49a5SDavid van Moolenbroek /* Public dsentry functions. */
24*b2ed49a5SDavid van Moolenbroek typedef void (*magic_dsentry_cb_t)(struct _magic_dsentry*);
25*b2ed49a5SDavid van Moolenbroek PUBLIC int magic_create_dsentry(struct _magic_dsentry *dsentry,
26*b2ed49a5SDavid van Moolenbroek     void *data_ptr, struct _magic_type *type, size_t size, int flags,
27*b2ed49a5SDavid van Moolenbroek     const char *name, const char *parent_name);
28*b2ed49a5SDavid van Moolenbroek PUBLIC struct _magic_obdsentry* magic_create_obdsentry(void *data_ptr,
29*b2ed49a5SDavid van Moolenbroek     struct _magic_type *type, size_t size, int flags,
30*b2ed49a5SDavid van Moolenbroek     const char *name, const char *parent_name);
31*b2ed49a5SDavid van Moolenbroek PUBLIC int magic_update_dsentry_state(struct _magic_dsentry *dsentry,
32*b2ed49a5SDavid van Moolenbroek     unsigned long mstate);
33*b2ed49a5SDavid van Moolenbroek PUBLIC void magic_free_dead_dsentries(void);
34*b2ed49a5SDavid van Moolenbroek PUBLIC void magic_destroy_dsentry(struct _magic_dsentry *dsentry,
35*b2ed49a5SDavid van Moolenbroek     struct _magic_dsentry *prev_dsentry);
36*b2ed49a5SDavid van Moolenbroek PUBLIC void magic_destroy_dsentry_set_ext_cb(const magic_dsentry_cb_t cb);
37*b2ed49a5SDavid van Moolenbroek PUBLIC int magic_destroy_obdsentry_by_addr(void *data_ptr);
38*b2ed49a5SDavid van Moolenbroek PUBLIC int magic_update_dsentry(void* addr, struct _magic_type *type);
39*b2ed49a5SDavid van Moolenbroek PUBLIC void magic_stack_dsentries_create(
40*b2ed49a5SDavid van Moolenbroek     struct _magic_dsentry **prev_last_stack_dsentry, int num_dsentries,
41*b2ed49a5SDavid van Moolenbroek     /* struct _magic_dsentry *dsentry, struct _magic_type *type, void* data_ptr, const char* function_name, const char* name, */ ...);
42*b2ed49a5SDavid van Moolenbroek PUBLIC void magic_stack_dsentries_destroy(
43*b2ed49a5SDavid van Moolenbroek     struct _magic_dsentry **prev_last_stack_dsentry, int num_dsentries,
44*b2ed49a5SDavid van Moolenbroek     /* struct _magic_dsentry *dsentry, */ ...);
45*b2ed49a5SDavid van Moolenbroek 
46*b2ed49a5SDavid van Moolenbroek /* Public dfunction functions. */
47*b2ed49a5SDavid van Moolenbroek PUBLIC int magic_create_dfunction(struct _magic_dfunction *dfunction,
48*b2ed49a5SDavid van Moolenbroek     void *data_ptr, struct _magic_type *type, int flags,
49*b2ed49a5SDavid van Moolenbroek     const char *name, const char *parent_name);
50*b2ed49a5SDavid van Moolenbroek PUBLIC void magic_destroy_dfunction(struct _magic_dfunction *dfunction);
51*b2ed49a5SDavid van Moolenbroek 
52*b2ed49a5SDavid van Moolenbroek /* Public sodesc functions. */
53*b2ed49a5SDavid van Moolenbroek PUBLIC int magic_create_sodesc(struct _magic_sodesc *sodesc);
54*b2ed49a5SDavid van Moolenbroek PUBLIC int magic_destroy_sodesc(struct _magic_sodesc *sodesc);
55*b2ed49a5SDavid van Moolenbroek 
56*b2ed49a5SDavid van Moolenbroek /* Public dsodesc functions. */
57*b2ed49a5SDavid van Moolenbroek PUBLIC int magic_create_dsodesc(struct _magic_dsodesc *dsodesc);
58*b2ed49a5SDavid van Moolenbroek PUBLIC int magic_destroy_dsodesc(struct _magic_dsodesc *dsodesc);
59*b2ed49a5SDavid van Moolenbroek 
60*b2ed49a5SDavid van Moolenbroek /* Memory usage logging support. */
61*b2ed49a5SDavid van Moolenbroek #if MAGIC_MEM_USAGE_OUTPUT_CTL
62*b2ed49a5SDavid van Moolenbroek /* CPU frequency (used for timestamp generation) */
63*b2ed49a5SDavid van Moolenbroek EXTERN double magic_cycles_per_ns;
64*b2ed49a5SDavid van Moolenbroek #endif
65*b2ed49a5SDavid van Moolenbroek 
66*b2ed49a5SDavid van Moolenbroek /* Magic malloc wrappers. */
67*b2ed49a5SDavid van Moolenbroek #include <stdlib.h>
68*b2ed49a5SDavid van Moolenbroek #ifndef __MINIX
69*b2ed49a5SDavid van Moolenbroek #include <malloc.h>
70*b2ed49a5SDavid van Moolenbroek #endif
71*b2ed49a5SDavid van Moolenbroek 
72*b2ed49a5SDavid van Moolenbroek PUBLIC void *magic_alloc(__MA_ARGS__ void *ptr, size_t size, int flags);
73*b2ed49a5SDavid van Moolenbroek PUBLIC void *magic_malloc( __MA_ARGS__ size_t size);
74*b2ed49a5SDavid van Moolenbroek PUBLIC void *magic_calloc( __MA_ARGS__ size_t nmemb, size_t size);
75*b2ed49a5SDavid van Moolenbroek PUBLIC void  magic_free(   __MD_ARGS__ void *ptr);
76*b2ed49a5SDavid van Moolenbroek PUBLIC void *magic_realloc(__MA_ARGS__ void *ptr, size_t size);
77*b2ed49a5SDavid van Moolenbroek 
78*b2ed49a5SDavid van Moolenbroek PUBLIC void *(*magic_real_malloc)(size_t size);
79*b2ed49a5SDavid van Moolenbroek PUBLIC void *(*magic_real_calloc)(size_t nmemb, size_t size);
80*b2ed49a5SDavid van Moolenbroek PUBLIC void  (*magic_real_free)(void *ptr);
81*b2ed49a5SDavid van Moolenbroek PUBLIC void *(*magic_real_realloc)(void *ptr, size_t size);
82*b2ed49a5SDavid van Moolenbroek 
83*b2ed49a5SDavid van Moolenbroek PUBLIC int magic_posix_memalign(__MA_ARGS__ void **memptr, size_t alignment, size_t size);
84*b2ed49a5SDavid van Moolenbroek PUBLIC int (*magic_real_posix_memalign)(void **memptr, size_t alignment, size_t size);
85*b2ed49a5SDavid van Moolenbroek 
86*b2ed49a5SDavid van Moolenbroek #ifndef __MINIX
87*b2ed49a5SDavid van Moolenbroek PUBLIC void *magic_valloc(      __MA_ARGS__ size_t size);
88*b2ed49a5SDavid van Moolenbroek PUBLIC void *magic_memalign(    __MA_ARGS__ size_t boundary, size_t size);
89*b2ed49a5SDavid van Moolenbroek 
90*b2ed49a5SDavid van Moolenbroek PUBLIC void *(*magic_real_valloc)(size_t size);
91*b2ed49a5SDavid van Moolenbroek PUBLIC void *(*magic_real_memalign)(size_t boundary, size_t size);
92*b2ed49a5SDavid van Moolenbroek #endif
93*b2ed49a5SDavid van Moolenbroek 
94*b2ed49a5SDavid van Moolenbroek /* Magic mmap wrappers. */
95*b2ed49a5SDavid van Moolenbroek #include <sys/mman.h>
96*b2ed49a5SDavid van Moolenbroek 
97*b2ed49a5SDavid van Moolenbroek #ifdef __MINIX
98*b2ed49a5SDavid van Moolenbroek #ifndef MAP_ANONYMOUS
99*b2ed49a5SDavid van Moolenbroek #define MAP_ANONYMOUS MAP_ANON
100*b2ed49a5SDavid van Moolenbroek #endif
101*b2ed49a5SDavid van Moolenbroek #endif
102*b2ed49a5SDavid van Moolenbroek 
103*b2ed49a5SDavid van Moolenbroek #ifndef _GNU_SOURCE
104*b2ed49a5SDavid van Moolenbroek void *mmap64(void *addr, size_t length, int prot, int flags, int fd, off_t pgoffset);
105*b2ed49a5SDavid van Moolenbroek #endif
106*b2ed49a5SDavid van Moolenbroek 
107*b2ed49a5SDavid van Moolenbroek PUBLIC void *magic_mmap(__MA_ARGS__ void *start, size_t length, int prot, int flags,
108*b2ed49a5SDavid van Moolenbroek     int fd, off_t offset);
109*b2ed49a5SDavid van Moolenbroek PUBLIC int magic_munmap(__MD_ARGS__ void *start, size_t length);
110*b2ed49a5SDavid van Moolenbroek 
111*b2ed49a5SDavid van Moolenbroek PUBLIC void *(*magic_real_mmap)(void *start, size_t length, int prot, int flags,
112*b2ed49a5SDavid van Moolenbroek     int fd, off_t offset);
113*b2ed49a5SDavid van Moolenbroek PUBLIC int (*magic_real_munmap)(void *start, size_t length);
114*b2ed49a5SDavid van Moolenbroek 
115*b2ed49a5SDavid van Moolenbroek /* Magic brk wrappers. */
116*b2ed49a5SDavid van Moolenbroek #include <unistd.h>
117*b2ed49a5SDavid van Moolenbroek 
118*b2ed49a5SDavid van Moolenbroek PUBLIC int magic_brk(   __MA_ARGS__ void *addr);
119*b2ed49a5SDavid van Moolenbroek PUBLIC void *magic_sbrk(__MA_ARGS__ intptr_t increment);
120*b2ed49a5SDavid van Moolenbroek 
121*b2ed49a5SDavid van Moolenbroek PUBLIC int (*magic_real_brk)(void *addr);
122*b2ed49a5SDavid van Moolenbroek PUBLIC void *(*magic_real_sbrk)(intptr_t increment);
123*b2ed49a5SDavid van Moolenbroek 
124*b2ed49a5SDavid van Moolenbroek #ifndef __MINIX
125*b2ed49a5SDavid van Moolenbroek /* Magic shm wrappers. */
126*b2ed49a5SDavid van Moolenbroek #include <sys/types.h>
127*b2ed49a5SDavid van Moolenbroek #include <sys/shm.h>
128*b2ed49a5SDavid van Moolenbroek 
129*b2ed49a5SDavid van Moolenbroek PUBLIC void *magic_shmat(__MA_ARGS__ int shmid, const void *shmaddr, int shmflg);
130*b2ed49a5SDavid van Moolenbroek PUBLIC int magic_shmdt(  __MD_ARGS__ const void *shmaddr);
131*b2ed49a5SDavid van Moolenbroek 
132*b2ed49a5SDavid van Moolenbroek PUBLIC void *(*magic_real_shmat)(int shmid, const void *shmaddr, int shmflg);
133*b2ed49a5SDavid van Moolenbroek PUBLIC int (*magic_real_shmdt)(const void *shmaddr);
134*b2ed49a5SDavid van Moolenbroek 
135*b2ed49a5SDavid van Moolenbroek /* Magic other wrappers. */
136*b2ed49a5SDavid van Moolenbroek PUBLIC void *magic_mmap64(__MA_ARGS__ void *start, size_t length, int prot, int flags,
137*b2ed49a5SDavid van Moolenbroek     int fd, off_t pgoffset);
138*b2ed49a5SDavid van Moolenbroek 
139*b2ed49a5SDavid van Moolenbroek PUBLIC void *(*magic_real_mmap64)(void *start, size_t length, int prot, int flags,
140*b2ed49a5SDavid van Moolenbroek     int fd, off_t pgoffset);
141*b2ed49a5SDavid van Moolenbroek #else
142*b2ed49a5SDavid van Moolenbroek #include <minix/vm.h>
143*b2ed49a5SDavid van Moolenbroek 
144*b2ed49a5SDavid van Moolenbroek PUBLIC void *magic_vm_map_cacheblock(__MA_ARGS__ dev_t dev, off_t dev_offset,
145*b2ed49a5SDavid van Moolenbroek     ino_t ino, off_t ino_offset, u32_t *flags, int blocksize);
146*b2ed49a5SDavid van Moolenbroek PUBLIC void *(*magic_real_vm_map_cacheblock)(dev_t dev, off_t dev_offset,
147*b2ed49a5SDavid van Moolenbroek     ino_t ino, off_t ino_offset, u32_t *flags, int blocksize);
148*b2ed49a5SDavid van Moolenbroek #endif
149*b2ed49a5SDavid van Moolenbroek 
150*b2ed49a5SDavid van Moolenbroek /* wrappers to skip alloction */
151*b2ed49a5SDavid van Moolenbroek PUBLIC void *magic_malloc_positioned( __MA_ARGS__ size_t size, void *ptr);
152*b2ed49a5SDavid van Moolenbroek PUBLIC void *magic_mmap_positioned(__MA_ARGS__ void *start, size_t length, int prot, int flags,
153*b2ed49a5SDavid van Moolenbroek     int fd, off_t offset, struct _magic_dsentry *cached_dsentry);
154*b2ed49a5SDavid van Moolenbroek 
155*b2ed49a5SDavid van Moolenbroek /* Macros. */
156*b2ed49a5SDavid van Moolenbroek #define MAGIC_ALLOC_SIZE                    (sizeof(struct _magic_dsentry))
157*b2ed49a5SDavid van Moolenbroek 
158*b2ed49a5SDavid van Moolenbroek #define MAGIC_SIZE_TO_REAL(S)               (S + MAGIC_ALLOC_SIZE)
159*b2ed49a5SDavid van Moolenbroek #define MAGIC_SIZE_TO_SOURCE(S)             (S - MAGIC_ALLOC_SIZE)
160*b2ed49a5SDavid van Moolenbroek #define MAGIC_PTR_TO_DSENTRY(P)                                                \
161*b2ed49a5SDavid van Moolenbroek     ((struct _magic_dsentry *) (((char *)P)))
162*b2ed49a5SDavid van Moolenbroek #define MAGIC_PTR_FROM_DSENTRY(P)           ((void *) P)
163*b2ed49a5SDavid van Moolenbroek #define MAGIC_PTR_TO_DATA(P)                                                   \
164*b2ed49a5SDavid van Moolenbroek     ((void *) (((char *)P) + MAGIC_ALLOC_SIZE))
165*b2ed49a5SDavid van Moolenbroek #define MAGIC_PTR_FROM_DATA(P)                                                 \
166*b2ed49a5SDavid van Moolenbroek     ((void *) (((char *)P) - MAGIC_ALLOC_SIZE))
167*b2ed49a5SDavid van Moolenbroek 
168*b2ed49a5SDavid van Moolenbroek /* Variables to keep track of magic mem wrappers. */
169*b2ed49a5SDavid van Moolenbroek EXTERN THREAD_LOCAL short magic_mem_wrapper_active;
170*b2ed49a5SDavid van Moolenbroek EXTERN short magic_mem_create_dsentry_site_id;
171*b2ed49a5SDavid van Moolenbroek 
172*b2ed49a5SDavid van Moolenbroek /* Variables to indicate if dsentry site_ids should be created. */
173*b2ed49a5SDavid van Moolenbroek 
174*b2ed49a5SDavid van Moolenbroek #if MAGIC_ALLOW_DYN_MEM_WRAPPER_NESTING
175*b2ed49a5SDavid van Moolenbroek #define MAGIC_MEM_WRAPPER_IS_ACTIVE()   (magic_mem_wrapper_active > 0)
176*b2ed49a5SDavid van Moolenbroek #define MAGIC_MEM_WRAPPER_BEGIN()       do {                                   \
177*b2ed49a5SDavid van Moolenbroek         magic_mem_wrapper_active++;                                            \
178*b2ed49a5SDavid van Moolenbroek     } while(0)
179*b2ed49a5SDavid van Moolenbroek #define MAGIC_MEM_WRAPPER_END()         do {                                   \
180*b2ed49a5SDavid van Moolenbroek         assert(MAGIC_MEM_WRAPPER_IS_ACTIVE());                                 \
181*b2ed49a5SDavid van Moolenbroek         magic_mem_wrapper_active--;                                            \
182*b2ed49a5SDavid van Moolenbroek     } while(0)
183*b2ed49a5SDavid van Moolenbroek #else
184*b2ed49a5SDavid van Moolenbroek #define MAGIC_MEM_WRAPPER_IS_ACTIVE()   (magic_mem_wrapper_active == 1)
185*b2ed49a5SDavid van Moolenbroek #define MAGIC_MEM_WRAPPER_BEGIN()       do {                                   \
186*b2ed49a5SDavid van Moolenbroek         assert(!MAGIC_MEM_WRAPPER_IS_ACTIVE());                                \
187*b2ed49a5SDavid van Moolenbroek         magic_mem_wrapper_active = 1;                                          \
188*b2ed49a5SDavid van Moolenbroek     } while(0)
189*b2ed49a5SDavid van Moolenbroek #define MAGIC_MEM_WRAPPER_END()         do {                                   \
190*b2ed49a5SDavid van Moolenbroek         assert(MAGIC_MEM_WRAPPER_IS_ACTIVE());                                 \
191*b2ed49a5SDavid van Moolenbroek         magic_mem_wrapper_active = 0;                                          \
192*b2ed49a5SDavid van Moolenbroek     } while(0)
193*b2ed49a5SDavid van Moolenbroek #endif
194*b2ed49a5SDavid van Moolenbroek 
195*b2ed49a5SDavid van Moolenbroek #define MAGIC_MEM_WRAPPER_LBEGIN()       do {                                  \
196*b2ed49a5SDavid van Moolenbroek         MAGIC_MEM_WRAPPER_BEGIN();                                             \
197*b2ed49a5SDavid van Moolenbroek         MAGIC_DSENTRY_LOCK();                                                  \
198*b2ed49a5SDavid van Moolenbroek     } while(0)
199*b2ed49a5SDavid van Moolenbroek #define MAGIC_MEM_WRAPPER_LEND()         do {                                  \
200*b2ed49a5SDavid van Moolenbroek         MAGIC_MEM_WRAPPER_END();                                               \
201*b2ed49a5SDavid van Moolenbroek         MAGIC_DSENTRY_UNLOCK();                                                \
202*b2ed49a5SDavid van Moolenbroek     } while(0)
203*b2ed49a5SDavid van Moolenbroek #define MAGIC_MEM_WRAPPER_BLOCK(BLOCK)   do {                                  \
204*b2ed49a5SDavid van Moolenbroek         MAGIC_MEM_WRAPPER_BEGIN();                                             \
205*b2ed49a5SDavid van Moolenbroek         BLOCK                                                                  \
206*b2ed49a5SDavid van Moolenbroek         MAGIC_MEM_WRAPPER_END();                                               \
207*b2ed49a5SDavid van Moolenbroek     } while(0)
208*b2ed49a5SDavid van Moolenbroek #define MAGIC_MEM_WRAPPER_LBLOCK(BLOCK)  do {                                  \
209*b2ed49a5SDavid van Moolenbroek         MAGIC_MEM_WRAPPER_LBEGIN();                                            \
210*b2ed49a5SDavid van Moolenbroek         BLOCK                                                                  \
211*b2ed49a5SDavid van Moolenbroek         MAGIC_MEM_WRAPPER_LEND();                                              \
212*b2ed49a5SDavid van Moolenbroek     } while(0)
213*b2ed49a5SDavid van Moolenbroek 
214*b2ed49a5SDavid van Moolenbroek /* Variables to keep track of memory pool management functions. */
215*b2ed49a5SDavid van Moolenbroek #define MAGIC_MEMPOOL_ID_UNKNOWN            -1
216*b2ed49a5SDavid van Moolenbroek #define MAGIC_MEMPOOL_ID_DETACHED           -2
217*b2ed49a5SDavid van Moolenbroek #define MAGIC_MEMPOOL_MAX_FUNC_RECURSIONS   100
218*b2ed49a5SDavid van Moolenbroek EXTERN THREAD_LOCAL short magic_mempool_mgmt_active_level;
219*b2ed49a5SDavid van Moolenbroek EXTERN THREAD_LOCAL short magic_mempool_ids[MAGIC_MEMPOOL_MAX_FUNC_RECURSIONS];
220*b2ed49a5SDavid van Moolenbroek EXTERN int magic_mempool_allow_reset;
221*b2ed49a5SDavid van Moolenbroek EXTERN int magic_mempool_allow_reuse;
222*b2ed49a5SDavid van Moolenbroek 
223*b2ed49a5SDavid van Moolenbroek /* TLS flags to be set when pool management functions are active. */
224*b2ed49a5SDavid van Moolenbroek #define MAGIC_MEMPOOL_MGMT_SET_ACTIVE()                                        \
225*b2ed49a5SDavid van Moolenbroek     assert((++magic_mempool_mgmt_active_level <= MAGIC_MEMPOOL_MAX_FUNC_RECURSIONS) \
226*b2ed49a5SDavid van Moolenbroek             && "Reached the maximum number of nested pool function calls!")
227*b2ed49a5SDavid van Moolenbroek #define MAGIC_MEMPOOL_MGMT_IS_ACTIVE()                                         \
228*b2ed49a5SDavid van Moolenbroek     (magic_mempool_mgmt_active_level > 0)
229*b2ed49a5SDavid van Moolenbroek #define MAGIC_MEMPOOL_MGMT_UNSET_ACTIVE()                                      \
230*b2ed49a5SDavid van Moolenbroek     assert((--magic_mempool_mgmt_active_level >= 0) && "Invalid nested pool call level!")
231*b2ed49a5SDavid van Moolenbroek #define MAGIC_MEMPOOL_SET_ID(ID)                                               \
232*b2ed49a5SDavid van Moolenbroek     (magic_mempool_ids[magic_mempool_mgmt_active_level - 1] = ID)
233*b2ed49a5SDavid van Moolenbroek #define MAGIC_MEMPOOL_GET_ID()                                                 \
234*b2ed49a5SDavid van Moolenbroek     (magic_mempool_ids[magic_mempool_mgmt_active_level - 1])
235*b2ed49a5SDavid van Moolenbroek #define MAGIC_MEMPOOL_ID_IS_SET()                                              \
236*b2ed49a5SDavid van Moolenbroek     (magic_mempool_ids[magic_mempool_mgmt_active_level - 1] > 0)
237*b2ed49a5SDavid van Moolenbroek #define MAGIC_MEMPOOL_GET_NAME()                                               \
238*b2ed49a5SDavid van Moolenbroek     (MAGIC_MEMPOOL_ID_IS_SET() ?                                               \
239*b2ed49a5SDavid van Moolenbroek         _magic_mpdescs[MAGIC_MEMPOOL_GET_ID() - 1].name :                      \
240*b2ed49a5SDavid van Moolenbroek         ((MAGIC_MEMPOOL_GET_ID() == MAGIC_MEMPOOL_ID_UNKNOWN) ?                \
241*b2ed49a5SDavid van Moolenbroek             MAGIC_MEMPOOL_NAME_UNKNOWN : MAGIC_MEMPOOL_NAME_DETACHED))
242*b2ed49a5SDavid van Moolenbroek /*  Store dynamic type in TLS if memory usage logging is enabled */
243*b2ed49a5SDavid van Moolenbroek #if MAGIC_MEM_USAGE_OUTPUT_CTL
244*b2ed49a5SDavid van Moolenbroek #define	MAGIC_MEMPOOL_SET_DTYPE(TYPE)                                          \
245*b2ed49a5SDavid van Moolenbroek     do {                                                                       \
246*b2ed49a5SDavid van Moolenbroek         if (MAGIC_MEMPOOL_ID_IS_SET())  {                                      \
247*b2ed49a5SDavid van Moolenbroek             _magic_mpdescs[MAGIC_MEMPOOL_GET_ID() - 1].dtype_id = TYPE;        \
248*b2ed49a5SDavid van Moolenbroek         }                                                                      \
249*b2ed49a5SDavid van Moolenbroek     } while(0)
250*b2ed49a5SDavid van Moolenbroek #define	MAGIC_MEMPOOL_GET_DTYPE()                                              \
251*b2ed49a5SDavid van Moolenbroek     (MAGIC_MEMPOOL_ID_IS_SET() ?                                               \
252*b2ed49a5SDavid van Moolenbroek             _magic_mpdescs[MAGIC_MEMPOOL_GET_ID() - 1].dtype_id : 0)
253*b2ed49a5SDavid van Moolenbroek #else
254*b2ed49a5SDavid van Moolenbroek #define	MAGIC_MEMPOOL_SET_DTYPE(TYPE)
255*b2ed49a5SDavid van Moolenbroek #define	MAGIC_MEMPOOL_GET_DTYPE()   0
256*b2ed49a5SDavid van Moolenbroek #endif
257*b2ed49a5SDavid van Moolenbroek 
258*b2ed49a5SDavid van Moolenbroek /* Pass call site information when logging is activated. */
259*b2ed49a5SDavid van Moolenbroek #if (MAGIC_MEM_USAGE_OUTPUT_CTL == 1)
260*b2ed49a5SDavid van Moolenbroek #define __MDEBUG_ARGS__             const char* name
261*b2ed49a5SDavid van Moolenbroek #else
262*b2ed49a5SDavid van Moolenbroek #define __MDEBUG_ARGS__
263*b2ed49a5SDavid van Moolenbroek #endif
264*b2ed49a5SDavid van Moolenbroek /* Specific wrapper for the memory pool creation. */
265*b2ed49a5SDavid van Moolenbroek MAGIC_HOOK void magic_mempool_create_begin(__MDEBUG_ARGS__);
266*b2ed49a5SDavid van Moolenbroek MAGIC_HOOK void magic_mempool_create_end(void* addr, int indirection);
267*b2ed49a5SDavid van Moolenbroek 
268*b2ed49a5SDavid van Moolenbroek /* Specific wrappers for the memory pool destruction. */
269*b2ed49a5SDavid van Moolenbroek MAGIC_HOOK void magic_mempool_destroy_begin(void* addr, int memory_reuse);
270*b2ed49a5SDavid van Moolenbroek MAGIC_HOOK void magic_mempool_destroy_end(void);
271*b2ed49a5SDavid van Moolenbroek 
272*b2ed49a5SDavid van Moolenbroek /* Specific wrappers for the memory pool resetting */
273*b2ed49a5SDavid van Moolenbroek MAGIC_HOOK void magic_mempool_reset_begin(void* addr);
274*b2ed49a5SDavid van Moolenbroek 
275*b2ed49a5SDavid van Moolenbroek /* Generic wrappers for the rest of the memory pool management functions. */
276*b2ed49a5SDavid van Moolenbroek MAGIC_HOOK void magic_mempool_mgmt_begin(void* addr);
277*b2ed49a5SDavid van Moolenbroek MAGIC_HOOK void magic_mempool_mgmt_end(void);
278*b2ed49a5SDavid van Moolenbroek 
279*b2ed49a5SDavid van Moolenbroek /* Pool block allocation template function and magic wrapper. */
280*b2ed49a5SDavid van Moolenbroek MAGIC_FUNC void *mempool_block_alloc_template(void* addr, size_t size);
281*b2ed49a5SDavid van Moolenbroek PUBLIC void *magic_mempool_block_alloc_template(__MA_ARGS__ void* addr, size_t size);
282*b2ed49a5SDavid van Moolenbroek 
283*b2ed49a5SDavid van Moolenbroek #endif
284*b2ed49a5SDavid van Moolenbroek 
285