u_debug.h revision d355eee5cacac30e2b4c8ac2f10964e2861a539e
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**************************************************************************
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * All Rights Reserved.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Permission is hereby granted, free of charge, to any person obtaining a
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * copy of this software and associated documentation files (the
858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * "Software"), to deal in the Software without restriction, including
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * without limitation the rights to use, copy, modify, merge, publish,
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * distribute, sub license, and/or sell copies of the Software, and to
117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * permit persons to whom the Software is furnished to do so, subject to
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * the following conditions:
13b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) *
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * The above copyright notice and this permission notice (including the
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * next paragraph) shall be included in all copies or substantial portions
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of the Software.
174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *
1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) *
2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) **************************************************************************/
27b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
28a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)/**
29b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) * @file
30b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) * Cross-platform debugging helpers.
31b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) *
32b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) * For now it just has assert and printf replacements, but it might be extended
33b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) * with stack trace reports and more advanced logging in the near future.
34b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) *
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @author Jose Fonseca <jrfonseca@tungstengraphics.com>
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
37b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef P_DEBUG_H_
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define P_DEBUG_H_
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdarg.h>
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "p_compiler.h"
4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#ifdef	__cplusplus
4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)extern "C" {
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DBG
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef DEBUG
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DEBUG 1
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NDEBUG
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NDEBUG 1
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void _debug_vprintf(const char *format, va_list ap);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static INLINE void
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_debug_printf(const char *format, ...)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   va_list ap;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   va_start(ap, format);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   _debug_vprintf(format, ap);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   va_end(ap);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Print debug messages.
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * The actual channel used to output debug message is platform specific. To
80b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) * avoid misformating or truncation, follow these rules of thumb:
81b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) * - output whole lines
82b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) * - avoid outputing large strings (512 bytes is the current maximum length
83b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) * that is guaranteed to be printed in all platforms)
84b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) */
85b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)static INLINE void
86b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)debug_printf(const char *format, ...)
87b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles){
88b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#ifdef DEBUG
89b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)   va_list ap;
90b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)   va_start(ap, format);
91b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)   _debug_vprintf(format, ap);
92b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)   va_end(ap);
93b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#else
94b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)   (void) format; /* silence warning */
95b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#endif
96b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
97b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
98a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
99a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#ifdef DEBUG
100a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#define debug_vprintf(_format, _ap) _debug_vprintf(_format, _ap)
101a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#else
10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define debug_vprintf(_format, _ap) ((void)0)
10358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#endif
10458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch
10558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch
10658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch/**
1072385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch * Dump a blob in hex to the same place that debug_printf sends its
10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * messages.
10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) */
11058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#ifdef DEBUG
11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void debug_print_blob( const char *name,
11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                       const void *blob,
11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                       unsigned size );
11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#else
11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#define debug_print_blob(_name, _blob, _size) ((void)0)
11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif
11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void _debug_break(void);
12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)/**
12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * Hard-coded breakpoint.
12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) */
1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#ifdef DEBUG
1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if (defined(__i386__) || defined(__386__)) && defined(__GNUC__)
1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define debug_break() __asm("int3")
1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#elif (defined(__i386__) || defined(__386__)) && defined(__MSC__)
1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define debug_break()  _asm {int 3}
1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#else
1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define debug_break() _debug_break()
1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#else /* !DEBUG */
1348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#define debug_break() ((void)0)
1358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#endif /* !DEBUG */
13603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)long
139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)debug_get_num_option(const char *name, long dfault);
140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void _debug_assert_fail(const char *expr,
1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                        const char *file,
1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                        unsigned line,
1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                        const char *function);
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/**
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Assert macro
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do not expect that the assert call terminates -- errors must be handled
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * regardless of assert behavior.
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define debug_assert(expr) ((expr) ? (void)0 : _debug_assert_fail(#expr, __FILE__, __LINE__, __FUNCTION__))
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define debug_assert(expr) ((void)0)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** Override standard assert macro */
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef assert
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef assert
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define assert(expr) debug_assert(expr)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
167a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)/**
168a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) * Output the current function name.
16958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) */
17058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#ifdef DEBUG
17158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#define debug_checkpoint() \
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   _debug_printf("%s\n", __FUNCTION__)
173b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#else
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define debug_checkpoint() \
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ((void)0)
176b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#endif
177b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Output the full source code position.
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
18258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#ifdef DEBUG
18358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#define debug_checkpoint_full() \
18458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)   _debug_printf("%s:%u:%s", __FILE__, __LINE__, __FUNCTION__)
18558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#else
18658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#define debug_checkpoint_full() \
18758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)   ((void)0)
18858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif
189b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/**
1926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) * Output a warning message. Muted on release version.
1936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) */
1946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#ifdef DEBUG
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define debug_warning(__msg) \
19658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)   _debug_printf("%s:%u:%s: warning: %s\n", __FILE__, __LINE__, __FUNCTION__, __msg)
197b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#else
1986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#define debug_warning(__msg) \
1995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)   ((void)0)
20058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif
20158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
20258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
20358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)/**
20458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * Output an error message. Not muted on release version.
20558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) */
20658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#ifdef DEBUG
20758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#define debug_error(__msg) \
20858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)   _debug_printf("%s:%u:%s: error: %s\n", __FILE__, __LINE__, __FUNCTION__, __msg)
2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#else
2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define debug_error(__msg) \
21158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)   _debug_printf("error: %s\n", __msg)
21258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif
21358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Used by debug_dump_enum and debug_dump_flags to describe symbols.
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct debug_named_value
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   const char *name;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   unsigned long value;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch/**
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Some C pre-processor magic to simplify creating named values.
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Example:
229b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) * @code
230b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) * static const debug_named_value my_names[] = {
231b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) *    DEBUG_NAMED_VALUE(MY_ENUM_VALUE_X),
2327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) *    DEBUG_NAMED_VALUE(MY_ENUM_VALUE_Y),
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    DEBUG_NAMED_VALUE(MY_ENUM_VALUE_Z),
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    DEBUG_NAMED_VALUE_END
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * };
236b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) *
237b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) *    ...
2385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) *    debug_printf("%s = %s\n",
2395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) *                 name,
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *                 debug_dump_enum(my_names, my_value));
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    ...
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @endcode
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DEBUG_NAMED_VALUE(__symbol) {#__symbol, (unsigned long)__symbol}
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DEBUG_NAMED_VALUE_END {NULL, 0}
246
247
248/**
249 * Convert a enum value to a string.
250 */
251const char *
252debug_dump_enum(const struct debug_named_value *names,
253                unsigned long value);
254
255
256/**
257 * Convert binary flags value to a string.
258 */
259const char *
260debug_dump_flags(const struct debug_named_value *names,
261                 unsigned long value);
262
263
264/**
265 * Get option.
266 *
267 * It is an alias for getenv on Linux.
268 *
269 * On Windows it reads C:\gallium.cfg, which is a text file with CR+LF line
270 * endings with one option per line as
271 *
272 *   NAME=value
273 *
274 * This file must be terminated with an extra empty line.
275 */
276const char *
277debug_get_option(const char *name, const char *dfault);
278
279boolean
280debug_get_bool_option(const char *name, boolean dfault);
281
282long
283debug_get_unsigned_option(const char *name, long dfault);
284
285unsigned long
286debug_get_flags_option(const char *name,
287                       const struct debug_named_value *flags,
288                       unsigned long dfault);
289
290
291void *
292debug_malloc(const char *file, unsigned line, const char *function,
293             size_t size);
294
295void
296debug_free(const char *file, unsigned line, const char *function,
297           void *ptr);
298
299void *
300debug_calloc(const char *file, unsigned line, const char *function,
301             size_t count, size_t size );
302
303void *
304debug_realloc(const char *file, unsigned line, const char *function,
305              void *old_ptr, size_t old_size, size_t new_size );
306
307void
308debug_memory_reset(void);
309
310void
311debug_memory_report(void);
312
313
314#ifdef	__cplusplus
315}
316#endif
317
318#endif /* P_DEBUG_H_ */
319