140266059SGregory Neil Shapiro /* 2d0cef73dSGregory Neil Shapiro * Copyright (c) 2000-2001, 2006 Proofpoint, Inc. and its suppliers. 340266059SGregory Neil Shapiro * All rights reserved. 440266059SGregory Neil Shapiro * 540266059SGregory Neil Shapiro * By using this file, you agree to the terms and conditions set 640266059SGregory Neil Shapiro * forth in the LICENSE file which can be found at the top level of 740266059SGregory Neil Shapiro * the sendmail distribution. 840266059SGregory Neil Shapiro * 9d0cef73dSGregory Neil Shapiro * $Id: heap.h,v 1.24 2013-11-22 20:51:31 ca Exp $ 1040266059SGregory Neil Shapiro */ 1140266059SGregory Neil Shapiro 1240266059SGregory Neil Shapiro /* 1340266059SGregory Neil Shapiro ** Sendmail debugging memory allocation package. 1440266059SGregory Neil Shapiro ** See libsm/heap.html for documentation. 1540266059SGregory Neil Shapiro */ 1640266059SGregory Neil Shapiro 1740266059SGregory Neil Shapiro #ifndef SM_HEAP_H 1840266059SGregory Neil Shapiro # define SM_HEAP_H 1940266059SGregory Neil Shapiro 2040266059SGregory Neil Shapiro # include <sm/io.h> 2140266059SGregory Neil Shapiro # include <stdlib.h> 2240266059SGregory Neil Shapiro # include <sm/debug.h> 2340266059SGregory Neil Shapiro # include <sm/exc.h> 2440266059SGregory Neil Shapiro 2540266059SGregory Neil Shapiro /* change default to 0 for production? */ 2640266059SGregory Neil Shapiro # ifndef SM_HEAP_CHECK 2740266059SGregory Neil Shapiro # define SM_HEAP_CHECK 1 2840266059SGregory Neil Shapiro # endif 2940266059SGregory Neil Shapiro 3040266059SGregory Neil Shapiro # if SM_HEAP_CHECK 3140266059SGregory Neil Shapiro # define sm_malloc_x(sz) sm_malloc_tagged_x(sz, __FILE__, __LINE__, SmHeapGroup) 3240266059SGregory Neil Shapiro # define sm_malloc(size) sm_malloc_tagged(size, __FILE__, __LINE__, SmHeapGroup) 3340266059SGregory Neil Shapiro # define sm_free(ptr) sm_free_tagged(ptr, __FILE__, __LINE__) 3440266059SGregory Neil Shapiro 3540266059SGregory Neil Shapiro extern void *sm_malloc_tagged __P((size_t, char *, int, int)); 3640266059SGregory Neil Shapiro extern void *sm_malloc_tagged_x __P((size_t, char *, int, int)); 3740266059SGregory Neil Shapiro extern void sm_free_tagged __P((void *, char *, int)); 3840266059SGregory Neil Shapiro extern void *sm_realloc_x __P((void *, size_t)); 3940266059SGregory Neil Shapiro extern bool sm_heap_register __P((void *, size_t, char *, int, int)); 4040266059SGregory Neil Shapiro extern void sm_heap_checkptr_tagged __P((void *, char *, int)); 4140266059SGregory Neil Shapiro extern void sm_heap_report __P((SM_FILE_T *, int)); 4240266059SGregory Neil Shapiro 4340266059SGregory Neil Shapiro # else /* SM_HEAP_CHECK */ 4440266059SGregory Neil Shapiro # define sm_malloc_tagged(size, file, line, grp) sm_malloc(size) 4540266059SGregory Neil Shapiro # define sm_malloc_tagged_x(size, file, line, grp) sm_malloc_x(size) 4640266059SGregory Neil Shapiro # define sm_free_tagged(ptr, file, line) sm_free(ptr) 4740266059SGregory Neil Shapiro # define sm_heap_register(ptr, size, file, line, grp) (true) 4840266059SGregory Neil Shapiro # define sm_heap_checkptr_tagged(ptr, tag, num) ((void)0) 4940266059SGregory Neil Shapiro # define sm_heap_report(file, verbose) ((void)0) 5040266059SGregory Neil Shapiro 5140266059SGregory Neil Shapiro extern void *sm_malloc __P((size_t)); 5240266059SGregory Neil Shapiro extern void *sm_malloc_x __P((size_t)); 5340266059SGregory Neil Shapiro extern void *sm_realloc_x __P((void *, size_t)); 5440266059SGregory Neil Shapiro extern void sm_free __P((void *)); 5540266059SGregory Neil Shapiro # endif /* SM_HEAP_CHECK */ 5640266059SGregory Neil Shapiro 5740266059SGregory Neil Shapiro extern void *sm_realloc __P((void *, size_t)); 5840266059SGregory Neil Shapiro 5940266059SGregory Neil Shapiro # define sm_heap_checkptr(ptr) sm_heap_checkptr_tagged(ptr, __FILE__, __LINE__) 6040266059SGregory Neil Shapiro 6140266059SGregory Neil Shapiro #if 0 6240266059SGregory Neil Shapiro /* 6340266059SGregory Neil Shapiro ** sm_f[mc]alloc are plug in replacements for malloc and calloc 6440266059SGregory Neil Shapiro ** which can be used in a context requiring a function pointer, 6540266059SGregory Neil Shapiro ** and which are compatible with sm_free. Warning: sm_heap_report 6640266059SGregory Neil Shapiro ** cannot report where storage leaked by sm_f[mc]alloc was allocated. 6740266059SGregory Neil Shapiro */ 6840266059SGregory Neil Shapiro 6940266059SGregory Neil Shapiro /* XXX unused right now */ 7040266059SGregory Neil Shapiro 7140266059SGregory Neil Shapiro extern void * 7240266059SGregory Neil Shapiro sm_fmalloc __P(( 7340266059SGregory Neil Shapiro size_t)); 7440266059SGregory Neil Shapiro 7540266059SGregory Neil Shapiro extern void * 7640266059SGregory Neil Shapiro sm_fcalloc __P(( 7740266059SGregory Neil Shapiro size_t, 7840266059SGregory Neil Shapiro size_t)); 7940266059SGregory Neil Shapiro #endif /* 0 */ 8040266059SGregory Neil Shapiro 8140266059SGregory Neil Shapiro /* 8240266059SGregory Neil Shapiro ** Allocate 'permanent' storage that can be freed but may still be 8340266059SGregory Neil Shapiro ** allocated when the process exits. sm_heap_report will not complain 8440266059SGregory Neil Shapiro ** about a storage leak originating from a call to sm_pmalloc. 8540266059SGregory Neil Shapiro */ 8640266059SGregory Neil Shapiro 8740266059SGregory Neil Shapiro # define sm_pmalloc(size) sm_malloc_tagged(size, __FILE__, __LINE__, 0) 8840266059SGregory Neil Shapiro # define sm_pmalloc_x(size) sm_malloc_tagged_x(size, __FILE__, __LINE__, 0) 8940266059SGregory Neil Shapiro 9040266059SGregory Neil Shapiro # define sm_heap_group() SmHeapGroup 9140266059SGregory Neil Shapiro # define sm_heap_setgroup(g) (SmHeapGroup = (g)) 9240266059SGregory Neil Shapiro # define sm_heap_newgroup() (SmHeapGroup = ++SmHeapMaxGroup) 9340266059SGregory Neil Shapiro 94d0cef73dSGregory Neil Shapiro #define SM_FREE(ptr) \ 95d0cef73dSGregory Neil Shapiro do \ 96d0cef73dSGregory Neil Shapiro { \ 97d0cef73dSGregory Neil Shapiro if ((ptr) != NULL) \ 98d0cef73dSGregory Neil Shapiro { \ 99d0cef73dSGregory Neil Shapiro sm_free(ptr); \ 100d0cef73dSGregory Neil Shapiro (ptr) = NULL; \ 101d0cef73dSGregory Neil Shapiro } \ 102d0cef73dSGregory Neil Shapiro } while (0) 103d0cef73dSGregory Neil Shapiro 10440266059SGregory Neil Shapiro extern int SmHeapGroup; 10540266059SGregory Neil Shapiro extern int SmHeapMaxGroup; 10640266059SGregory Neil Shapiro 10740266059SGregory Neil Shapiro extern SM_DEBUG_T SmHeapTrace; 10840266059SGregory Neil Shapiro extern SM_DEBUG_T SmHeapCheck; 10940266059SGregory Neil Shapiro extern SM_EXC_T SmHeapOutOfMemory; 11040266059SGregory Neil Shapiro 11140266059SGregory Neil Shapiro #endif /* ! SM_HEAP_H */ 112