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