core: Remove ABI effects of MALLOC_DEBUG.
[asterisk/asterisk.git] / include / asterisk / astmm.h
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 1999 - 2006, Digium, Inc.
5  *
6  * Mark Spencer <markster@digium.com>
7  *
8  * See http://www.asterisk.org for more information about
9  * the Asterisk project. Please do not directly contact
10  * any of the maintainers of this project for assistance;
11  * the project provides a web site, mailing lists and IRC
12  * channels for your use.
13  *
14  * This program is free software, distributed under the terms of
15  * the GNU General Public License Version 2. See the LICENSE file
16  * at the top of the source tree.
17  */
18
19 /*! \file
20  * \brief Asterisk memory usage debugging
21  * This file provides headers for MALLOC_DEBUG, a define used for tracking down
22  * memory leaks.  It should never be \#included directly; always use the
23  * MALLOC_DEBUG definition in menuselect to activate those functions.
24  */
25
26
27 #ifdef __cplusplus
28 extern "C" {
29 #endif
30
31 #ifndef _ASTERISK_ASTMM_H
32 #define _ASTERISK_ASTMM_H
33 /* IWYU pragma: private, include "asterisk.h" */
34
35 #if defined(MALLOC_DEBUG)
36 #define __AST_DEBUG_MALLOC
37
38 void __ast_mm_init_phase_1(void);
39 void __ast_mm_init_phase_2(void);
40 #endif
41
42 void *ast_std_malloc(size_t size);
43 void *ast_std_calloc(size_t nmemb, size_t size);
44 void *ast_std_realloc(void *ptr, size_t size);
45 void ast_std_free(void *ptr);
46 void ast_free_ptr(void *ptr);
47
48 void *__ast_repl_calloc(size_t nmemb, size_t size, const char *file, int lineno, const char *func);
49 void *__ast_repl_calloc_cache(size_t nmemb, size_t size, const char *file, int lineno, const char *func);
50 void *__ast_repl_malloc(size_t size, const char *file, int lineno, const char *func);
51 void __ast_free(void *ptr, const char *file, int lineno, const char *func);
52 void *__ast_repl_realloc(void *ptr, size_t size, const char *file, int lineno, const char *func);
53 char *__ast_repl_strdup(const char *s, const char *file, int lineno, const char *func);
54 char *__ast_repl_strndup(const char *s, size_t n, const char *file, int lineno, const char *func);
55 int __ast_repl_asprintf(const char *file, int lineno, const char *func, char **strp, const char *format, ...)
56         __attribute__((format(printf, 5, 6)));
57 int __ast_repl_vasprintf(char **strp, const char *format, va_list ap, const char *file, int lineno, const char *func)
58         __attribute__((format(printf, 2, 0)));
59
60 /*!
61  * \brief ASTMM_LIBC can be defined to control the meaning of standard allocators.
62  *
63  * \note The standard allocators effected by this compiler define are:
64  *    malloc, calloc, realloc, strdup, strndup, asprintf, vasprintf and free.
65  *
66  * @{
67  */
68
69 /*!
70  * \brief Produce compiler errors if standard allocators are used.
71  *
72  * \note This is the default option, and in most cases the correct option.
73  * Any use of standard allocators will cause an error, even if those uses
74  * are in unused static inline header functions.
75  */
76 #define ASTMM_BLOCK    0
77
78 /*!
79  * \brief Redirect standard allocators to use Asterisk functions.
80  *
81  * \note This option is used in some cases instead of changing the
82  * existing source to use Asterisk functions.  New code should
83  * generally avoid this option, except where it's needed to work
84  * with situations where switching the code is unreasonable, such
85  * as output from code generators that are hard coded to use
86  * standard functions.
87  */
88 #define ASTMM_REDIRECT 1
89
90 /*!
91  * \brief Standard allocators are used directly.
92  *
93  * \note This option is needed when including 3rd party headers with calls
94  * to standard allocators from inline functions.  Using ASTMM_REDIRECT in
95  * this situation could result in an object being allocated by malloc and
96  * freed by ast_free, or the reverse.
97  */
98 #define ASTMM_IGNORE   2
99
100 /*!
101  * }@
102  */
103
104 #if !defined(ASTMM_LIBC)
105 /* BLOCK libc allocators by default. */
106 #define ASTMM_LIBC ASTMM_BLOCK
107 #endif
108
109 #if ASTMM_LIBC == ASTMM_IGNORE
110 /* Don't touch the libc functions. */
111 #else
112
113 /* Undefine any macros */
114 #undef malloc
115 #undef calloc
116 #undef realloc
117 #undef strdup
118 #undef strndup
119 #undef asprintf
120 #undef vasprintf
121 #undef free
122
123 #if ASTMM_LIBC == ASTMM_REDIRECT
124
125 /* Redefine libc functions to our own versions */
126 #define calloc(a, b) \
127         __ast_repl_calloc(a, b, __FILE__, __LINE__, __PRETTY_FUNCTION__)
128 #define malloc(a) \
129         __ast_repl_malloc(a, __FILE__, __LINE__, __PRETTY_FUNCTION__)
130 #define free(a) \
131         __ast_free(a, __FILE__, __LINE__, __PRETTY_FUNCTION__)
132 #define realloc(a, b) \
133         __ast_repl_realloc(a, b, __FILE__, __LINE__, __PRETTY_FUNCTION__)
134 #define strdup(a) \
135         __ast_repl_strdup(a, __FILE__, __LINE__, __PRETTY_FUNCTION__)
136 #define strndup(a, b) \
137         __ast_repl_strndup(a, b, __FILE__, __LINE__, __PRETTY_FUNCTION__)
138 #define asprintf(a, b, c...) \
139         __ast_repl_asprintf(__FILE__, __LINE__, __PRETTY_FUNCTION__, a, b, c)
140 #define vasprintf(a, b, c) \
141         __ast_repl_vasprintf(a, b, c, __FILE__, __LINE__, __PRETTY_FUNCTION__)
142
143 #elif ASTMM_LIBC == ASTMM_BLOCK
144
145 /* Redefine libc functions to cause compile errors */
146 #define calloc(a, b) \
147         Do_not_use_calloc__use_ast_calloc->fail(a, b)
148 #define malloc(a) \
149         Do_not_use_malloc__use_ast_malloc->fail(a)
150 #define free(a) \
151         Do_not_use_free__use_ast_free_or_ast_std_free_for_remotely_allocated_memory->fail(a)
152 #define realloc(a, b) \
153         Do_not_use_realloc__use_ast_realloc->fail(a, b)
154 #define strdup(a) \
155         Do_not_use_strdup__use_ast_strdup->fail(a)
156 #define strndup(a, b) \
157         Do_not_use_strndup__use_ast_strndup->fail(a, b)
158 #define asprintf(a, b, c...) \
159         Do_not_use_asprintf__use_ast_asprintf->fail(a, b, c)
160 #define vasprintf(a, b, c) \
161         Do_not_use_vasprintf__use_ast_vasprintf->fail(a, b, c)
162
163 #else
164 #error "Unacceptable value for the macro ASTMM_LIBC"
165 #endif
166
167 #endif
168
169 /* Provide our own definition for ast_free */
170
171 #define ast_free(a) \
172         __ast_free(a, __FILE__, __LINE__, __PRETTY_FUNCTION__)
173
174 #else
175 #error "NEVER INCLUDE astmm.h DIRECTLY!!"
176 #endif /* _ASTERISK_ASTMM_H */
177
178 #ifdef __cplusplus
179 }
180 #endif