Added SILC Thread Queue API
[silc.git] / lib / silcutil / stacktrace.c
index 1a93192647fb7623deba80a6d136677701cbc05a..9f335e44258dffe481751c37de03a3fb05a2a61d 100644 (file)
@@ -1,10 +1,10 @@
 /*
 
-  stacktrace.c 
+  stacktrace.c
 
   Author: Pekka Riikonen <priikone@silcnet.org>
 
-  Copyright (C) 2002 Pekka Riikonen
+  Copyright (C) 2002, 2007 Pekka Riikonen
 
   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
@@ -26,7 +26,11 @@ static unsigned long st_blocks_count = 0;
 static SilcBool dump = FALSE;
 static SilcBool malloc_check = FALSE;
 
-#define SILC_ST_DEPTH 10
+#ifdef SILC_DEBUG
+#define SILC_ST_DEPTH 15
+#else
+#define SILC_ST_DEPTH 8
+#endif /* SILC_DEBUG */
 
 /* Memory block with stack trace */
 typedef struct SilcStBlockStruct {
@@ -148,6 +152,8 @@ void silc_st_free(void *ptr, const char *file, int line)
     st_blocks = stack->next;
 
   st_blocks_count--;
+
+  memset(stack, 'F', SILC_ST_GET_SIZE(stack->size));
   free(stack);
 }
 
@@ -191,7 +197,7 @@ void silc_st_dump(void)
     for (s = stack; s; s = s->next) {
       if (s->file == stack->file && s->line == stack->line &&
          s->depth == stack->depth &&
-         !memcmp(s->stack, stack->stack, 
+         !memcmp(s->stack, stack->stack,
                  (s->depth * sizeof(stack->stack[0])))) {
        blocks++;
        bytes += s->size;
@@ -203,14 +209,14 @@ void silc_st_dump(void)
       fprintf(fp, "<stacktrace>%s:%d: #blocks=%lu, bytes=%lu\n",
              stack->file, stack->line, blocks, bytes);
       for (i = 0; i < stack->depth; i++)
-       fprintf(fp, "<pc>%p\n", stack->stack[i]);
+       fprintf(fp, "\tpc=%p\n", stack->stack[i]);
     }
   }
 
   if (!leaks) {
     fprintf(stderr, "\nNo memory leaks\n");
   } else {
-    fprintf(stderr, 
+    fprintf(stderr,
            "-----------------------------------------\n"
            "-----------------------------------------\n"
            " Memory leaks dumped to 'stacktrace.log'\n"