| /* |
| xmalloc.h - Simple malloc debugging library API |
| |
| This software is released under a BSD-style license. |
| See the file LICENSE for details and copyright. |
| |
| */ |
| |
| #ifndef _XMALLOC_H |
| #define _XMALLOC_H 1 |
| |
| void *xmalloc_impl(size_t size, const char *file, int line, const char *func); |
| void *xcalloc_impl(size_t nmemb, size_t size, const char *file, int line, |
| const char *func); |
| void xfree_impl(void *ptr, const char *file, int line, const char *func); |
| void *xrealloc_impl(void *ptr, size_t new_size, const char *file, int line, |
| const char *func); |
| int xmalloc_dump_leaks(void); |
| void xmalloc_configure(int fail_after); |
| |
| |
| #ifndef XMALLOC_INTERNAL |
| #ifdef MALLOC_DEBUGGING |
| |
| /* Version 2.4 and later of GCC define a magical variable `__PRETTY_FUNCTION__' |
| which contains the name of the function currently being defined. |
| # define __XMALLOC_FUNCTION __PRETTY_FUNCTION__ |
| This is broken in G++ before version 2.6. |
| C9x has a similar variable called __func__, but prefer the GCC one since |
| it demangles C++ function names. */ |
| # ifdef __GNUC__ |
| # if __GNUC__ > 2 || (__GNUC__ == 2 \ |
| && __GNUC_MINOR__ >= (defined __cplusplus ? 6 : 4)) |
| # define __XMALLOC_FUNCTION __PRETTY_FUNCTION__ |
| # else |
| # define __XMALLOC_FUNCTION ((const char *) 0) |
| # endif |
| # else |
| # if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L |
| # define __XMALLOC_FUNCTION __func__ |
| # else |
| # define __XMALLOC_FUNCTION ((const char *) 0) |
| # endif |
| # endif |
| |
| #define xmalloc(size) xmalloc_impl(size, __FILE__, __LINE__, \ |
| __XMALLOC_FUNCTION) |
| #define xcalloc(nmemb, size) xcalloc_impl(nmemb, size, __FILE__, __LINE__, \ |
| __XMALLOC_FUNCTION) |
| #define xfree(ptr) xfree_impl(ptr, __FILE__, __LINE__, __XMALLOC_FUNCTION) |
| #define xrealloc(ptr, new_size) xrealloc_impl(ptr, new_size, __FILE__, \ |
| __LINE__, __XMALLOC_FUNCTION) |
| #undef malloc |
| #undef calloc |
| #undef free |
| #undef realloc |
| |
| #define malloc USE_XMALLOC_INSTEAD_OF_MALLOC |
| #define calloc USE_XCALLOC_INSTEAD_OF_CALLOC |
| #define free USE_XFREE_INSTEAD_OF_FREE |
| #define realloc USE_XREALLOC_INSTEAD_OF_REALLOC |
| |
| #else /* !MALLOC_DEBUGGING */ |
| |
| #include <stdlib.h> |
| |
| #define xmalloc(size) malloc(size) |
| #define xcalloc(nmemb, size) calloc(nmemb, size) |
| #define xfree(ptr) free(ptr) |
| #define xrealloc(ptr, new_size) realloc(ptr, new_size) |
| |
| #endif /* !MALLOC_DEBUGGING */ |
| #endif /* !XMALLOC_INTERNAL */ |
| |
| #endif /* _XMALLOC_H */ |
| |
| /* EOF */ |