u_debug.h revision dd51365acdd515577ee76850ceda01347ceb27c0
1a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca/**************************************************************************
2a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca *
3a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
4a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * All Rights Reserved.
5a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca *
6a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * Permission is hereby granted, free of charge, to any person obtaining a
7a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * copy of this software and associated documentation files (the
8a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * "Software"), to deal in the Software without restriction, including
9a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * without limitation the rights to use, copy, modify, merge, publish,
10a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * distribute, sub license, and/or sell copies of the Software, and to
11a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * permit persons to whom the Software is furnished to do so, subject to
12a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * the following conditions:
13a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca *
14a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * The above copyright notice and this permission notice (including the
15a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * next paragraph) shall be included in all copies or substantial portions
16a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * of the Software.
17a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca *
18a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca *
26a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca **************************************************************************/
27a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca
28a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca/**
29a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * @file
30a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * Cross-platform debugging helpers.
31a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca *
32a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * For now it just has assert and printf replacements, but it might be extended
33a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * with stack trace reports and more advanced logging in the near future.
34a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca *
35a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca * @author Jose Fonseca <jrfonseca@tungstengraphics.com>
36a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca */
37a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca
38a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#ifndef P_DEBUG_H_
39a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#define P_DEBUG_H_
40a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca
41af6b12cc76b40c86f3b144a7f5cd3ef1278863d0José Fonseca
42af6b12cc76b40c86f3b144a7f5cd3ef1278863d0José Fonseca#include <stdarg.h>
43af6b12cc76b40c86f3b144a7f5cd3ef1278863d0José Fonseca
4445c59895113f997e5f2b7e346f95e46099fa3566José Fonseca#include "p_compiler.h"
4545c59895113f997e5f2b7e346f95e46099fa3566José Fonseca
46af6b12cc76b40c86f3b144a7f5cd3ef1278863d0José Fonseca
47a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#ifdef	__cplusplus
48a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonsecaextern "C" {
49a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#endif
50a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca
51a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca
52a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#ifdef DBG
53a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#ifndef DEBUG
54a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#define DEBUG 1
55a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#endif
56a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#else
57a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#ifndef NDEBUG
58a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#define NDEBUG 1
59a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#endif
60a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#endif
61a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca
62a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca
63dd51365acdd515577ee76850ceda01347ceb27c0José Fonsecavoid _debug_vprintf(const char *format, va_list ap);
64dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca
65dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca
66dd51365acdd515577ee76850ceda01347ceb27c0José Fonsecastatic void INLINE
67dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca_debug_printf(const char *format, ...)
68dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca{
69dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca   va_list ap;
70dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca   va_start(ap, format);
71dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca   _debug_vprintf(format, ap);
72dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca   va_end(ap);
73dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca}
74dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca
75dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca
76fc96aec9b7aceb4a0e7471e797abe8a00fc40cf2José Fonseca/**
77fc96aec9b7aceb4a0e7471e797abe8a00fc40cf2José Fonseca * Print debug messages.
78fc96aec9b7aceb4a0e7471e797abe8a00fc40cf2José Fonseca *
79fc96aec9b7aceb4a0e7471e797abe8a00fc40cf2José Fonseca * The actual channel used to output debug message is platform specific. To
80fc96aec9b7aceb4a0e7471e797abe8a00fc40cf2José Fonseca * avoid misformating or truncation, follow these rules of thumb:
81fc96aec9b7aceb4a0e7471e797abe8a00fc40cf2José Fonseca * - output whole lines
82fc96aec9b7aceb4a0e7471e797abe8a00fc40cf2José Fonseca * - avoid outputing large strings (512 bytes is the current maximum length
83fc96aec9b7aceb4a0e7471e797abe8a00fc40cf2José Fonseca * that is guaranteed to be printed in all platforms)
84fc96aec9b7aceb4a0e7471e797abe8a00fc40cf2José Fonseca */
85dd51365acdd515577ee76850ceda01347ceb27c0José Fonsecastatic void INLINE
86dd51365acdd515577ee76850ceda01347ceb27c0José Fonsecadebug_printf(const char *format, ...)
87dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca{
88dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#ifdef DEBUG
89dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca   va_list ap;
90dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca   va_start(ap, format);
91dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca   _debug_vprintf(format, ap);
92dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca   va_end(ap);
93dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#endif
94dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca}
95dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca
96dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca
97dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#ifdef DEBUG
98dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#define debug_vprintf(_format, _ap) _debug_vprintf(_format, _ap)
99dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#else
100dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#define debug_vprintf(_format, _ap) ((void)0)
101dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#endif
102af6b12cc76b40c86f3b144a7f5cd3ef1278863d0José Fonseca
103a88202d3b02a24a3bfff95c5e375ead44dae4c5eKeith Whitwell
104dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca/**
105dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca * Dump a blob in hex to the same place that debug_printf sends its
106dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca * messages.
107a88202d3b02a24a3bfff95c5e375ead44dae4c5eKeith Whitwell */
108dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#ifdef DEBUG
109a88202d3b02a24a3bfff95c5e375ead44dae4c5eKeith Whitwellvoid debug_print_blob( const char *name,
110a88202d3b02a24a3bfff95c5e375ead44dae4c5eKeith Whitwell                       const void *blob,
111a88202d3b02a24a3bfff95c5e375ead44dae4c5eKeith Whitwell                       unsigned size );
112dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#else
113dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#define debug_print_blob(_name, _blob, _size) ((void)0)
114dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#endif
115dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca
116dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca
117dd51365acdd515577ee76850ceda01347ceb27c0José Fonsecavoid _debug_break(void);
118dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca
119a88202d3b02a24a3bfff95c5e375ead44dae4c5eKeith Whitwell
120fc96aec9b7aceb4a0e7471e797abe8a00fc40cf2José Fonseca/**
121dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca * Hard-coded breakpoint.
122fc96aec9b7aceb4a0e7471e797abe8a00fc40cf2José Fonseca */
123dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#ifdef DEBUG
124dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#if (defined(__i386__) || defined(__386__)) && defined(__GNUC__)
125dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#define debug_break() __asm("int3")
126dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#elif (defined(__i386__) || defined(__386__)) && defined(__MSC__)
127dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#define debug_break()  _asm {int 3}
128dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#else
129dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#define debug_break() _debug_break()
130dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#endif
131dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#else /* !DEBUG */
132dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#define debug_break() ((void)0)
133dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#endif /* !DEBUG */
134af6b12cc76b40c86f3b144a7f5cd3ef1278863d0José Fonseca
135a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca
136dd51365acdd515577ee76850ceda01347ceb27c0José Fonsecavoid _debug_assert_fail(const char *expr,
137dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca                        const char *file,
138dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca                        unsigned line,
139dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca                        const char *function);
140af6b12cc76b40c86f3b144a7f5cd3ef1278863d0José Fonseca
141dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca
142dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca/**
143dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca * Assert macro
144dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca *
145dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca * Do not expect that the assert call terminates -- errors must be handled
146dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca * regardless of assert behavior.
147dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca */
148a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#ifdef DEBUG
149dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#define debug_assert(expr) ((expr) ? (void)0 : _debug_assert_fail(#expr, __FILE__, __LINE__, __FUNCTION__))
150a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#else
151a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#define debug_assert(expr) ((void)0)
152a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#endif
153a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca
154a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca
155dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca/** Override standard assert macro */
156a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#ifdef assert
157a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#undef assert
158a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#endif
159a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#define assert(expr) debug_assert(expr)
160a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca
161a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca
162dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca/**
163dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca * Output the current function name.
164dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca */
165dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#ifdef DEBUG
166dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#define debug_checkpoint() \
167dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca   _debug_printf("%s\n", __FUNCTION__)
168dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#else
169dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#define debug_checkpoint() \
170dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca   ((void)0)
171dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#endif
172dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca
173dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca
174dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca/**
175dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca * Output the full source code position.
176dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca */
177dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#ifdef DEBUG
178dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#define debug_checkpoint_full() \
179dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca   debug_printf("%s:%u:%s", __FILE__, __LINE__, __FUNCTION__)
180dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#else
181dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#define debug_checkpoint_full() \
182dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca   ((void)0)
183dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#endif
184dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca
185dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca
186dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca/**
187dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca * Output a warning message. Muted on release version.
188dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca */
189d1ca951cc4f3392aeec2817e97fb9ade2c1b7881José Fonseca#ifdef DEBUG
190d1ca951cc4f3392aeec2817e97fb9ade2c1b7881José Fonseca#define debug_warning(__msg) \
191dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca   _debug_printf("%s:%u:%s: warning: %s\n", __FILE__, __LINE__, __FUNCTION__, (__msg))
192d1ca951cc4f3392aeec2817e97fb9ade2c1b7881José Fonseca#else
193d1ca951cc4f3392aeec2817e97fb9ade2c1b7881José Fonseca#define debug_warning(__msg) \
194d1ca951cc4f3392aeec2817e97fb9ade2c1b7881José Fonseca   ((void)0)
195d1ca951cc4f3392aeec2817e97fb9ade2c1b7881José Fonseca#endif
196d1ca951cc4f3392aeec2817e97fb9ade2c1b7881José Fonseca
197d1ca951cc4f3392aeec2817e97fb9ade2c1b7881José Fonseca
198e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca/**
199dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca * Output an error message. Not muted on release version.
200dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca */
201dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#ifdef DEBUG
202dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#define debug_error(__msg) \
203dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca   _debug_printf("%s:%u:%s: error: %s\n", __FILE__, __LINE__, __FUNCTION__, (__msg))
204dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#else
205dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#define debug_error(__msg) \
206dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca   _debug_printf("error: %s\n", __msg))
207dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca#endif
208dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca
209dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca
210dd51365acdd515577ee76850ceda01347ceb27c0José Fonseca/**
211e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca * Used by debug_dump_enum and debug_dump_flags to describe symbols.
212e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca */
213e08501b45763cf177f03fb34b737050d23ba4bc0José Fonsecastruct debug_named_value
214e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca{
215e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca   const char *name;
216e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca   unsigned long value;
217e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca};
218e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca
219e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca
220e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca/**
221e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca * Some C pre-processor magic to simplify creating named values.
222e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca *
223e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca * Example:
224e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca * @code
225e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca * static const debug_named_value my_names[] = {
226e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca *    DEBUG_NAMED_VALUE(MY_ENUM_VALUE_X),
227e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca *    DEBUG_NAMED_VALUE(MY_ENUM_VALUE_Y),
228e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca *    DEBUG_NAMED_VALUE(MY_ENUM_VALUE_Z),
229e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca *    DEBUG_NAMED_VALUE_END
230e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca * };
231e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca *
232e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca *    ...
233e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca *    debug_printf("%s = %s\n",
234e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca *                 name,
235e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca *                 debug_dump_enum(my_names, my_value));
236e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca *    ...
237e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca * @endcode
238e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca */
239e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca#define DEBUG_NAMED_VALUE(__symbol) {#__symbol, (unsigned long)__symbol}
240e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca#define DEBUG_NAMED_VALUE_END {NULL, 0}
241e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca
242e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca
243e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca/**
244e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca * Convert a enum value to a string.
245e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca */
246e08501b45763cf177f03fb34b737050d23ba4bc0José Fonsecaconst char *
247e08501b45763cf177f03fb34b737050d23ba4bc0José Fonsecadebug_dump_enum(const struct debug_named_value *names,
248e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca                unsigned long value);
249e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca
250e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca
251e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca/**
252e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca * Convert binary flags value to a string.
253e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca */
254e08501b45763cf177f03fb34b737050d23ba4bc0José Fonsecaconst char *
255e08501b45763cf177f03fb34b737050d23ba4bc0José Fonsecadebug_dump_flags(const struct debug_named_value *names,
256e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca                 unsigned long value);
257e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca
258e08501b45763cf177f03fb34b737050d23ba4bc0José Fonseca
259732422f6708199d6655185b1a5daec86efe2f1b7José Fonsecavoid *
260732422f6708199d6655185b1a5daec86efe2f1b7José Fonsecadebug_malloc(const char *file, unsigned line, const char *function,
261732422f6708199d6655185b1a5daec86efe2f1b7José Fonseca             size_t size);
262732422f6708199d6655185b1a5daec86efe2f1b7José Fonseca
263732422f6708199d6655185b1a5daec86efe2f1b7José Fonsecavoid
264732422f6708199d6655185b1a5daec86efe2f1b7José Fonsecadebug_free(const char *file, unsigned line, const char *function,
265732422f6708199d6655185b1a5daec86efe2f1b7José Fonseca           void *ptr);
266732422f6708199d6655185b1a5daec86efe2f1b7José Fonseca
267732422f6708199d6655185b1a5daec86efe2f1b7José Fonsecavoid *
268732422f6708199d6655185b1a5daec86efe2f1b7José Fonsecadebug_calloc(const char *file, unsigned line, const char *function,
269732422f6708199d6655185b1a5daec86efe2f1b7José Fonseca             size_t count, size_t size );
270732422f6708199d6655185b1a5daec86efe2f1b7José Fonseca
271732422f6708199d6655185b1a5daec86efe2f1b7José Fonsecavoid *
272732422f6708199d6655185b1a5daec86efe2f1b7José Fonsecadebug_realloc(const char *file, unsigned line, const char *function,
273732422f6708199d6655185b1a5daec86efe2f1b7José Fonseca              void *old_ptr, size_t old_size, size_t new_size );
274732422f6708199d6655185b1a5daec86efe2f1b7José Fonseca
275732422f6708199d6655185b1a5daec86efe2f1b7José Fonsecavoid
276732422f6708199d6655185b1a5daec86efe2f1b7José Fonsecadebug_memory_reset(void);
277732422f6708199d6655185b1a5daec86efe2f1b7José Fonseca
278732422f6708199d6655185b1a5daec86efe2f1b7José Fonsecavoid
279732422f6708199d6655185b1a5daec86efe2f1b7José Fonsecadebug_memory_report(void);
280732422f6708199d6655185b1a5daec86efe2f1b7José Fonseca
281732422f6708199d6655185b1a5daec86efe2f1b7José Fonseca
282a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#ifdef	__cplusplus
283a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca}
284a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#endif
285a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca
286a31d289de6091987e6b9da6af1b2e56eb79a96fbJosé Fonseca#endif /* P_DEBUG_H_ */
287