xref: /freebsd/contrib/sendmail/include/sm/heap.h (revision d0cef73d)
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