1 /* 2 * Copyright (c) 2000-2001, 2006 Sendmail, Inc. and its suppliers. 3 * All rights reserved. 4 * 5 * By using this file, you agree to the terms and conditions set 6 * forth in the LICENSE file which can be found at the top level of 7 * the sendmail distribution. 8 * 9 * $Id: heap.h,v 1.23 2006/08/15 00:53:46 ca Exp $ 10 */ 11 12 #pragma ident "%Z%%M% %I% %E% SMI" 13 14 /* 15 ** Sendmail debugging memory allocation package. 16 ** See libsm/heap.html for documentation. 17 */ 18 19 #ifndef SM_HEAP_H 20 # define SM_HEAP_H 21 22 # include <sm/io.h> 23 # include <stdlib.h> 24 # include <sm/debug.h> 25 # include <sm/exc.h> 26 27 /* change default to 0 for production? */ 28 # ifndef SM_HEAP_CHECK 29 # define SM_HEAP_CHECK 1 30 # endif /* ! SM_HEAP_CHECK */ 31 32 # if SM_HEAP_CHECK 33 # define sm_malloc_x(sz) sm_malloc_tagged_x(sz, __FILE__, __LINE__, SmHeapGroup) 34 # define sm_malloc(size) sm_malloc_tagged(size, __FILE__, __LINE__, SmHeapGroup) 35 # define sm_free(ptr) sm_free_tagged(ptr, __FILE__, __LINE__) 36 37 extern void *sm_malloc_tagged __P((size_t, char *, int, int)); 38 extern void *sm_malloc_tagged_x __P((size_t, char *, int, int)); 39 extern void sm_free_tagged __P((void *, char *, int)); 40 extern void *sm_realloc_x __P((void *, size_t)); 41 extern bool sm_heap_register __P((void *, size_t, char *, int, int)); 42 extern void sm_heap_checkptr_tagged __P((void *, char *, int)); 43 extern void sm_heap_report __P((SM_FILE_T *, int)); 44 45 # else /* SM_HEAP_CHECK */ 46 # define sm_malloc_tagged(size, file, line, grp) sm_malloc(size) 47 # define sm_malloc_tagged_x(size, file, line, grp) sm_malloc_x(size) 48 # define sm_free_tagged(ptr, file, line) sm_free(ptr) 49 # define sm_heap_register(ptr, size, file, line, grp) (true) 50 # define sm_heap_checkptr_tagged(ptr, tag, num) ((void)0) 51 # define sm_heap_report(file, verbose) ((void)0) 52 53 extern void *sm_malloc __P((size_t)); 54 extern void *sm_malloc_x __P((size_t)); 55 extern void *sm_realloc_x __P((void *, size_t)); 56 extern void sm_free __P((void *)); 57 # endif /* SM_HEAP_CHECK */ 58 59 extern void *sm_realloc __P((void *, size_t)); 60 61 # define sm_heap_checkptr(ptr) sm_heap_checkptr_tagged(ptr, __FILE__, __LINE__) 62 63 #if 0 64 /* 65 ** sm_f[mc]alloc are plug in replacements for malloc and calloc 66 ** which can be used in a context requiring a function pointer, 67 ** and which are compatible with sm_free. Warning: sm_heap_report 68 ** cannot report where storage leaked by sm_f[mc]alloc was allocated. 69 */ 70 71 /* XXX unused right now */ 72 73 extern void * 74 sm_fmalloc __P(( 75 size_t)); 76 77 extern void * 78 sm_fcalloc __P(( 79 size_t, 80 size_t)); 81 #endif /* 0 */ 82 83 /* 84 ** Allocate 'permanent' storage that can be freed but may still be 85 ** allocated when the process exits. sm_heap_report will not complain 86 ** about a storage leak originating from a call to sm_pmalloc. 87 */ 88 89 # define sm_pmalloc(size) sm_malloc_tagged(size, __FILE__, __LINE__, 0) 90 # define sm_pmalloc_x(size) sm_malloc_tagged_x(size, __FILE__, __LINE__, 0) 91 92 # define sm_heap_group() SmHeapGroup 93 # define sm_heap_setgroup(g) (SmHeapGroup = (g)) 94 # define sm_heap_newgroup() (SmHeapGroup = ++SmHeapMaxGroup) 95 96 #define SM_FREE(ptr) \ 97 do \ 98 { \ 99 if ((ptr) != NULL) \ 100 { \ 101 sm_free(ptr); \ 102 (ptr) = NULL; \ 103 } \ 104 } while (0) 105 106 extern int SmHeapGroup; 107 extern int SmHeapMaxGroup; 108 109 extern SM_DEBUG_T SmHeapTrace; 110 extern SM_DEBUG_T SmHeapCheck; 111 extern SM_EXC_T SmHeapOutOfMemory; 112 113 #endif /* ! SM_HEAP_H */ 114