diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/heap.c | 92 | ||||
-rw-r--r-- | src/heap.h | 49 |
2 files changed, 141 insertions, 0 deletions
diff --git a/src/heap.c b/src/heap.c new file mode 100644 index 0000000..9a01001 --- /dev/null +++ b/src/heap.c @@ -0,0 +1,92 @@ +/* $Id: heap.c,v 1.1 2002-05-23 04:41:10 rjkaes Exp $ + * + * Debugging versions of various heap related functions are combined + * here. The debugging versions include assertions and also print + * (to standard error) the function called along with the amount + * of memory allocated, and where the memory is pointing. The + * format of the log message is standardized. + * + * Copyright (C) 2002 Robert James Kaes (rjkaes@flarenet.com) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2, or (at your option) any + * later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + */ + +#include "tinyproxy.h" +#include "heap.h" + +void * +debugging_calloc(size_t nmemb, size_t size, const char *file, + unsigned long line) +{ + void *ptr; + + assert(nmemb > 0); + assert(size > 0); + + ptr = calloc(nmemb, size); + fprintf(stderr, "{calloc: %p:%u x %u} %s:%lu\n", ptr, nmemb, size, file, + line); + return ptr; +} + +void * +debugging_malloc(size_t size, const char *file, unsigned long line) +{ + void *ptr; + + assert(size > 0); + + ptr = malloc(size); + fprintf(stderr, "{malloc: %p:%u} %s:%lu\n", ptr, size, file, line); + return ptr; +} + +void * +debugging_realloc(void *ptr, size_t size, const char *file, unsigned long line) +{ + void *newptr; + + assert(ptr != NULL); + assert(size > 0); + + newptr = realloc(ptr, size); + fprintf(stderr, "{realloc: %p -> %p:%u} %s:%lu\n", ptr, newptr, size, + file, line); + return newptr; +} + +void +debugging_free(void *ptr, const char *file, unsigned long line) +{ + assert(ptr != NULL); + + fprintf(stderr, "{free: %p} %s:%lu\n", ptr, file, line); + free(ptr); + return; +} + +char* +debugging_strdup(const char* s, const char* file, unsigned long line) +{ + char* ptr; + size_t len; + + assert(s != NULL); + + len = strlen(s) + 1; + ptr = malloc(len); + if (!ptr) + return NULL; + memcpy(ptr, s, len); + + fprintf(stderr, "{strdup: %p:%u} %s:%lu\n", ptr, len, file, line); + return ptr; +} diff --git a/src/heap.h b/src/heap.h new file mode 100644 index 0000000..fca28cb --- /dev/null +++ b/src/heap.h @@ -0,0 +1,49 @@ +/* $Id: heap.h,v 1.1 2002-05-23 04:41:10 rjkaes Exp $ + * + * See 'heap.c' for a detailed description. + * + * Copyright (C) 2002 Robert James Kaes (rjkaes@flarenet.com) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2, or (at your option) any + * later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + */ + +#ifndef TINYPROXY_HEAP_H +#define TINYPROXY_HEAP_H + +/* + * The following is to allow for better memory checking. + */ +#ifndef NDEBUG + +extern void *debugging_calloc(size_t nmemb, size_t size, const char *file, + unsigned long line); +extern void *debugging_malloc(size_t size, const char *file, + unsigned long line); +extern void debugging_free(void *ptr, const char *file, unsigned long line); +extern void *debugging_realloc(void *ptr, size_t size, const char *file, + unsigned long line); +extern char *debugging_strdup(const char* s, const char* file, + unsigned long line); + +# define safecalloc(x, y) debugging_calloc(x, y, __FILE__, __LINE__) +# define safemalloc(x) debugging_malloc(x, __FILE__, __LINE__) +# define saferealloc(x, y) debugging_realloc(x, y, __FILE__, __LINE__) +# define safefree(x) debugging_free(x, __FILE__, __LINE__); (x) = NULL +# define safestrdup(x) debugging_strdup(x, __FILE__, __LINE__) +#else +# define safecalloc(x, y) calloc(x, y) +# define safemalloc(x) malloc(x) +# define saferealloc(x, y) realloc(x, y) +# define safefree(x) free(x); (x) = NULL +# define safestrdup(x) strdup(x) +#endif + +#endif |