CLI: Create ast_cli_completion_vector.
[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 #define __AST_DEBUG_MALLOC
36
37 void *ast_std_malloc(size_t size);
38 void *ast_std_calloc(size_t nmemb, size_t size);
39 void *ast_std_realloc(void *ptr, size_t size);
40 void ast_std_free(void *ptr);
41 void ast_free_ptr(void *ptr);
42
43 void *__ast_calloc(size_t nmemb, size_t size, const char *file, int lineno, const char *func);
44 void *__ast_calloc_cache(size_t nmemb, size_t size, const char *file, int lineno, const char *func);
45 void *__ast_malloc(size_t size, const char *file, int lineno, const char *func);
46 void __ast_free(void *ptr, const char *file, int lineno, const char *func);
47 void *__ast_realloc(void *ptr, size_t size, const char *file, int lineno, const char *func);
48 char *__ast_strdup(const char *s, const char *file, int lineno, const char *func);
49 char *__ast_strndup(const char *s, size_t n, const char *file, int lineno, const char *func);
50 int __ast_asprintf(const char *file, int lineno, const char *func, char **strp, const char *format, ...)
51         __attribute__((format(printf, 5, 6)));
52 int __ast_vasprintf(char **strp, const char *format, va_list ap, const char *file, int lineno, const char *func)
53         __attribute__((format(printf, 2, 0)));
54 void __ast_mm_init_phase_1(void);
55 void __ast_mm_init_phase_2(void);
56
57 /*!
58  * \brief ASTMM_LIBC can be defined to control the meaning of standard allocators.
59  *
60  * \note The standard allocators effected by this compiler define are:
61  *    malloc, calloc, realloc, strdup, strndup, asprintf, vasprintf and free.
62  *
63  * @{
64  */
65
66 /*!
67  * \brief Produce compiler errors if standard allocators are used.
68  *
69  * \note This is the default option, and in most cases the correct option.
70  * Any use of standard allocators will cause an error, even if those uses
71  * are in unused static inline header functions.
72  */
73 #define ASTMM_BLOCK    0
74
75 /*!
76  * \brief Redirect standard allocators to use Asterisk functions.
77  *
78  * \note This option is used in some cases instead of changing the
79  * existing source to use Asterisk functions.  New code should
80  * generally avoid this option, except where it's needed to work
81  * with situations where switching the code is unreasonable, such
82  * as output from code generators that are hard coded to use
83  * standard functions.
84  */
85 #define ASTMM_REDIRECT 1
86
87 /*!
88  * \brief Standard allocators are used directly.
89  *
90  * \note This option is needed when including 3rd party headers with calls
91  * to standard allocators from inline functions.  Using ASTMM_REDIRECT in
92  * this situation could result in an object being allocated by malloc and
93  * freed by ast_free, or the reverse.
94  */
95 #define ASTMM_IGNORE   2
96
97 /*!
98  * }@
99  */
100
101 #if !defined(ASTMM_LIBC)
102 /* BLOCK libc allocators by default. */
103 #define ASTMM_LIBC ASTMM_BLOCK
104 #endif
105
106 #if ASTMM_LIBC == ASTMM_IGNORE
107 /* Don't touch the libc functions. */
108 #else
109
110 /* Undefine any macros */
111 #undef malloc
112 #undef calloc
113 #undef realloc
114 #undef strdup
115 #undef strndup
116 #undef asprintf
117 #undef vasprintf
118 #undef free
119
120 #if ASTMM_LIBC == ASTMM_REDIRECT
121
122 /* Redefine libc functions to our own versions */
123 #define calloc(a,b) \
124         __ast_calloc(a,b,__FILE__, __LINE__, __PRETTY_FUNCTION__)
125 #define malloc(a) \
126         __ast_malloc(a,__FILE__, __LINE__, __PRETTY_FUNCTION__)
127 #define free(a) \
128         __ast_free(a,__FILE__, __LINE__, __PRETTY_FUNCTION__)
129 #define realloc(a,b) \
130         __ast_realloc(a,b,__FILE__, __LINE__, __PRETTY_FUNCTION__)
131 #define strdup(a) \
132         __ast_strdup(a,__FILE__, __LINE__, __PRETTY_FUNCTION__)
133 #define strndup(a,b) \
134         __ast_strndup(a,b,__FILE__, __LINE__, __PRETTY_FUNCTION__)
135 #define asprintf(a, b, c...) \
136         __ast_asprintf(__FILE__, __LINE__, __PRETTY_FUNCTION__, a, b, c)
137 #define vasprintf(a,b,c) \
138         __ast_vasprintf(a,b,c,__FILE__, __LINE__, __PRETTY_FUNCTION__)
139
140 #elif ASTMM_LIBC == ASTMM_BLOCK
141
142 /* Redefine libc functions to cause compile errors */
143 #define calloc(a,b) \
144         Do_not_use_calloc__use_ast_calloc->fail(a,b)
145 #define malloc(a) \
146         Do_not_use_malloc__use_ast_malloc->fail(a)
147 #define free(a) \
148         Do_not_use_free__use_ast_free_or_ast_std_free_for_remotely_allocated_memory->fail(a)
149 #define realloc(a,b) \
150         Do_not_use_realloc__use_ast_realloc->fail(a,b)
151 #define strdup(a) \
152         Do_not_use_strdup__use_ast_strdup->fail(a)
153 #define strndup(a,b) \
154         Do_not_use_strndup__use_ast_strndup->fail(a,b)
155 #define asprintf(a, b, c...) \
156         Do_not_use_asprintf__use_ast_asprintf->fail(a,b,c)
157 #define vasprintf(a,b,c) \
158         Do_not_use_vasprintf__use_ast_vasprintf->fail(a,b,c)
159
160 #else
161 #error "Unacceptable value for the macro ASTMM_LIBC"
162 #endif
163
164 #endif
165
166 /* Provide our own definition for ast_free */
167
168 #define ast_free(a) \
169         __ast_free(a,__FILE__, __LINE__, __PRETTY_FUNCTION__)
170
171 #else
172 #error "NEVER INCLUDE astmm.h DIRECTLY!!"
173 #endif /* _ASTERISK_ASTMM_H */
174
175 #ifdef __cplusplus
176 }
177 #endif