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