merge with/from trunk at r35190
[blender.git] / intern / guardedalloc / intern / mallocn.c
index 0a0c9485a39d754df63435b423be870f87d122d0..17fd16eb8af8d95eac78e7cf77433e5e955dd575 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*
  * $Id$
  * ***** BEGIN GPL LICENSE BLOCK *****
  *
  * ***** END GPL LICENSE BLOCK *****
  */
 
+/** \file guardedalloc/intern/mallocn.c
+ *  \ingroup MEM
+ */
+
+
 /**
 
  * $Id$
 
 #include "MEM_guardedalloc.h"
 
+/* Only for debugging:
+ * lets you count the allocations so as to find the allocator of unfreed memory
+ * in situations where the leak is predictable */
+
+// #define DEBUG_MEMCOUNTER
+
+#ifdef DEBUG_MEMCOUNTER
+#define DEBUG_MEMCOUNTER_ERROR_VAL 0 /* set this to the value that isnt being freed */
+static int _mallocn_count = 0;
+
+/* breakpoint here */
+static void memcount_raise(const char *name)
+{
+       fprintf(stderr, "%s: memcount-leak, %d\n", name, _mallocn_count);
+}
+#endif
+
 /* --------------------------------------------------------------------- */
 /* Data definition                                                       */
 /* --------------------------------------------------------------------- */
@@ -122,23 +144,24 @@ static int malloc_debug_memset= 0;
 
 static void print_error(const char *str, ...)
 {
-       char buf[1024];
+       char buf[512];
        va_list ap;
 
        va_start(ap, str);
-       vsprintf(buf, str, ap);
+       vsnprintf(buf, sizeof(buf), str, ap);
        va_end(ap);
+       buf[sizeof(buf) - 1] = '\0';
 
        if (error_callback) error_callback(buf);
 }
 
-static void mem_lock_thread()
+static void mem_lock_thread(void)
 {
        if (thread_lock_callback)
                thread_lock_callback();
 }
 
-static void mem_unlock_thread()
+static void mem_unlock_thread(void)
 {
        if (thread_unlock_callback)
                thread_unlock_callback();
@@ -442,7 +465,7 @@ static void MEM_printmemlist_internal( int pydict )
        }
        while(membl) {
                if (pydict) {
-                       fprintf(stderr, "{'len':" SIZET_FORMAT ", 'name':'''%s''', 'pointer':'%p'},\\\n", SIZET_ARG(membl->len), membl->name, membl+1);
+                       fprintf(stderr, "{'len':" SIZET_FORMAT ", 'name':'''%s''', 'pointer':'%p'},\\\n", SIZET_ARG(membl->len), membl->name, (void *)(membl+1));
                } else {
 #ifdef DEBUG_MEMCOUNTER
                        print_error("%s len: " SIZET_FORMAT " %p, count: %d\n", membl->name, SIZET_ARG(membl->len), membl+1, membl->_count);
@@ -540,7 +563,7 @@ short WMEM_freeN(void *vmemh)
 }
 
 /*special macro-wrapped MEM_freeN that keeps track of where MEM_freeN is called.*/
-short _MEM_freeN(void *vmemh, char *file, int line)            /* anders compileertie niet meer */
+short _MEM_freeN(void *vmemh, const char *file, int line)              /* anders compileertie niet meer */
 {
        short error = 0;
        MemTail *memt;
@@ -819,4 +842,18 @@ int MEM_get_memory_blocks_in_use(void)
        return _totblock;
 }
 
+#ifndef NDEBUG
+const char *MEM_name_ptr(void *vmemh)
+{
+       if (vmemh) {
+               MemHead *memh= vmemh;
+               memh--;
+               return memh->name;
+       }
+       else {
+               return "MEM_name_ptr(NULL)";
+       }
+}
+#endif
+
 /* eof */