summaryrefslogtreecommitdiff
path: root/utils/open-isns/mdebug.c
diff options
context:
space:
mode:
Diffstat (limited to 'utils/open-isns/mdebug.c')
-rw-r--r--utils/open-isns/mdebug.c295
1 files changed, 0 insertions, 295 deletions
diff --git a/utils/open-isns/mdebug.c b/utils/open-isns/mdebug.c
deleted file mode 100644
index 90dcaf0..0000000
--- a/utils/open-isns/mdebug.c
+++ /dev/null
@@ -1,295 +0,0 @@
-/*
- * Stupid malloc debugger. I think I wrote something like
- * this a couple of times already. Where does all the old
- * source code go?
- */
-
-#ifdef MDEBUG
-
-#include <stdlib.h>
-#include <string.h>
-#include "util.h"
-
-static void * isns_malloc_default(size_t, const char *, unsigned int);
-static void * isns_calloc_default(unsigned int, size_t,
- const char *, unsigned int);
-static void * isns_realloc_default(void *, size_t,
- const char *, unsigned int);
-static char * isns_strdup_default(const char *, const char *, unsigned int);
-static void isns_free_default(void *, const char *, unsigned int);
-
-/*
- * These are the function pointers used to redirect malloc and such.
- */
-void * (*isns_malloc_fn)(size_t, const char *, unsigned int) = isns_malloc_default;
-void * (*isns_calloc_fn)(unsigned int, size_t,
- const char *, unsigned int) = isns_calloc_default;
-void * (*isns_realloc_fn)(void *, size_t,
- const char *, unsigned int) = isns_realloc_default;
-char * (*isns_strdup_fn)(const char *, const char *, unsigned int) = isns_strdup_default;
-void (*isns_free_fn)(void *, const char *, unsigned int) = isns_free_default;
-
-#define H_MAGIC 0xfeedbeef
-#define T_MAGIC 0xbadf00d
-#define CHUNK_OVERHEAD (sizeof(struct m_header) + sizeof(struct m_trailer))
-
-struct m_header {
- struct isns_list h_list;
- uint32_t h_magic;
- size_t h_size;
-
- const char * h_file;
- unsigned int h_line;
-};
-
-struct m_trailer {
- uint32_t t_magic[8];
- size_t t_size;
-};
-
-static ISNS_LIST_DECLARE(m_list);
-static void * m_low_addr;
-static void * m_high_addr;
-static int m_init = 0;
-
-static void
-__isns_check_chunk(const struct m_header *head)
-{
- const struct m_trailer *tail;
- int i;
-
- if ((void *) head < m_low_addr
- || (void *) head > m_high_addr) {
- isns_error("%s: m_list corrupted!\n", __FUNCTION__);
- abort();
- }
-
- if (head->h_magic != H_MAGIC) {
- isns_error("%s: m_list item %p with bad header magic %08x\n",
- __FUNCTION__, head, head->h_magic);
- isns_error(" Allocated from %s:%u\n",
- head->h_file, head->h_line);
- abort();
- }
-
- tail = ((void *) head) + sizeof(*head) + head->h_size;
- for (i = 0; i < 8; ++i) {
- if (tail->t_magic[i] == T_MAGIC)
- continue;
-
- isns_error("%s: m_list item %p with bad trailer magic[%d] %08x\n",
- __FUNCTION__, head, i, tail->t_magic[i]);
- isns_error(" Allocated from %s:%u\n",
- head->h_file, head->h_line);
- abort();
- }
-
- if (tail->t_size != head->h_size) {
- isns_error("%s: m_list item %p size mismatch; head=%u tail=%u\n",
- __FUNCTION__, head,
- head->h_size, tail->t_size);
- isns_error(" Allocated from %s:%u\n",
- head->h_file, head->h_line);
- abort();
- }
-}
-
-static void
-__isns_verify_all(void)
-{
- struct isns_list *pos, *next;
-
- isns_list_foreach(&m_list, pos, next) {
- __isns_check_chunk(isns_list_item(struct m_header, h_list, pos));
- }
-}
-
-void *
-__isns_malloc(size_t size, const char *file, unsigned int line)
-{
- struct m_header *head;
- struct m_trailer *tail;
- size_t true_size;
- void *ptr;
- int i;
-
- __isns_verify_all();
-
- true_size = size + sizeof(*head) + sizeof(*tail);
- isns_assert(size < true_size);
-
- ptr = malloc(true_size);
- if (!ptr)
- return NULL;
-
- if (!m_low_addr) {
- m_low_addr = m_high_addr = ptr;
- } else if (ptr < m_low_addr) {
- m_low_addr = ptr;
- } else if (ptr > m_high_addr) {
- m_high_addr = ptr;
- }
-
- head = ptr;
- head->h_magic = H_MAGIC;
- head->h_size = size;
- head->h_file = file;
- head->h_line = line;
- isns_list_append(&m_list, &head->h_list);
-
- ptr += sizeof(*head);
-
- tail = ptr + size;
- for (i = 0; i < 8; ++i)
- tail->t_magic[i] = T_MAGIC;
- tail->t_size = size;
-
- return ptr;
-}
-
-void *
-__isns_calloc(unsigned int nele, size_t size,
- const char *file, unsigned int line)
-{
- void *ptr;
-
- ptr = __isns_malloc(nele * size, file, line);
- if (ptr)
- memset(ptr, 0, nele * size);
- return ptr;
-}
-
-void *
-__isns_realloc(void *old, size_t new_size,
- const char *file, unsigned int line)
-{
- struct m_header *old_head = NULL;
- void *new;
-
- if (old) {
- old_head = (old - sizeof(struct m_header));
- __isns_check_chunk(old_head);
- }
-
- new = __isns_malloc(new_size, file, line);
- if (new && old) {
- memcpy(new, old, old_head->h_size);
- isns_free_fn(old, file, line);
- }
-
- return new;
-}
-
-
-char *
-__isns_strdup(const char *s, const char *file, unsigned int line)
-{
- size_t len;
- char *ptr;
-
- len = s? strlen(s) : 0;
- ptr = __isns_malloc(len + 1, file, line);
- if (ptr) {
- memcpy(ptr, s, len);
- ptr[len] = '\0';
- }
- return ptr;
-}
-
-void
-__isns_free(void *ptr, const char *file, unsigned int line)
-{
- struct m_header *head;
- size_t true_size;
-
- if (ptr == NULL)
- return;
-
- head = ptr - sizeof(struct m_header);
- __isns_check_chunk(head);
-
- /*
- printf("__isns_free(%u from %s:%u): freed by %s:%u\n",
- head->h_size, head->h_file, head->h_line,
- file, line);
- */
- true_size = head->h_size + CHUNK_OVERHEAD;
- isns_list_del(&head->h_list);
-
- memset(head, 0xa5, true_size);
- free(head);
-
- __isns_verify_all();
-}
-
-/*
- * Enable memory debugging
- */
-static void
-__isns_mdebug_init(void)
-{
- const char *tracefile;
-
- tracefile = getenv("ISNS_MTRACE");
- if (tracefile)
- isns_error("MTRACE not yet supported\n");
-
- if (getenv("ISNS_MDEBUG")) {
- isns_malloc_fn = __isns_malloc;
- isns_calloc_fn = __isns_calloc;
- isns_realloc_fn = __isns_realloc;
- isns_strdup_fn = __isns_strdup;
- isns_free_fn = __isns_free;
- isns_notice("Enabled memory debugging\n");
- }
-
- m_init = 1;
-}
-
-static inline void
-isns_mdebug_init(void)
-{
- if (!m_init)
- __isns_mdebug_init();
-}
-
-/*
- * Default implementations of malloc and friends
- */
-static void *
-isns_malloc_default(size_t size, const char *file, unsigned int line)
-{
- isns_mdebug_init();
- return malloc(size);
-}
-
-static void *
-isns_calloc_default(unsigned int nele, size_t size,
- const char *file, unsigned int line)
-{
- isns_mdebug_init();
- return calloc(nele, size);
-}
-
-static void *
-isns_realloc_default(void *old, size_t size,
- const char *file, unsigned int line)
-{
- isns_mdebug_init();
- return realloc(old, size);
-}
-
-static char *
-isns_strdup_default(const char *s, const char *file, unsigned int line)
-{
- isns_mdebug_init();
- return strdup(s);
-}
-
-static void
-isns_free_default(void *ptr, const char *file, unsigned int line)
-{
- isns_mdebug_init();
- return free(ptr);
-}
-#endif