added basic ssl support to ircu
[ircu2.10.12-pk.git] / ircd / memdebug.c
index 15db3795b4002589f89db6d8ea1b2ea0d44d076a..af7e53011c9da53eaf8529d7fc9db160371846d9 100644 (file)
@@ -1,11 +1,14 @@
 #include <sys/types.h>
 #include "ircd.h"
 #include "ircd_alloc.h"
+#include "ircd_log.h"
 #include "client.h"
 #include "s_debug.h"
+#include "send.h"
 #include <stdlib.h>
+#include <string.h>
 
-#include <assert.h>
+/* #include <assert.h> -- Now using assert in ircd_log.h */
 
 #ifdef MDEBUG
 
@@ -26,9 +29,10 @@ void GC_set_leak_handler(void (*)(void*, int));
 void GC_gcollect(void);
 extern int GC_find_leak;
 
+/** Header block to track an allocated block's information. */
 struct MemHeader
 {
-  u_int32_t magic;
+  uint32_t magic;
   char type[32];
   char file[32];
   int line;
@@ -36,6 +40,10 @@ struct MemHeader
   time_t since;
 };
 
+/** Overwrite \a len byte at \a p with 0xDEADBEEF.
+ * @param[out] p Memory buffer to overwrite.
+ * @param[in] len Number of bytes to overwrite.
+ */
 void
 memfrob(void *p, size_t len)
 {
@@ -47,16 +55,23 @@ memfrob(void *p, size_t len)
   for (s = (char*)p, se = s + (len & ~3) - 4;
        s <= se;
        s += 4)
-    *(u_int32_t*)s = *(u_int32_t*)pat;
+    *(uint32_t*)s = *(uint32_t*)pat;
   for (se = s; se < s; s++)
     *s = pat[i++];
 }
 
-static size_t mdbg_bytes_allocated = 0, mdbg_blocks_allocated = 0;
+/** Total number of bytes allocated. */
+static size_t mdbg_bytes_allocated = 0;
+/** Total number of blocks allocated. */
+static size_t mdbg_blocks_allocated = 0;
+/** Last Unix time that we ran garbage collection. */
 static time_t last_gcollect = 0;
-
+/** Minimum interval for garbage collection. */
 #define GC_FREQ 5
 
+/** Check whether we should run garbage collection.
+ * If so, do it.
+ */
 void
 dbg_check_gcollect(void)
 {
@@ -66,6 +81,13 @@ dbg_check_gcollect(void)
   last_gcollect = CurrentTime;
 }
 
+/** Allocate a block of memory.
+ * @param[in] size Number of bytes needed.
+ * @param[in] type Memory operation for block.
+ * @param[in] file File name of allocating function.
+ * @param[in] line Line number of allocating function.
+ * @return Pointer to the newly allocated block.
+ */
 void*
 dbg_malloc(size_t size, const char *type, const char *file, int line)
 {
@@ -85,6 +107,13 @@ dbg_malloc(size_t size, const char *type, const char *file, int line)
   return (void*)(mh + 1);
 }
 
+/** Allocate a zero-initialized block of memory.
+ * @param[in] size Number of bytes needed.
+ * @param[in] type Memory operation for block.
+ * @param[in] file File name of allocating function.
+ * @param[in] line Line number of allocating function.
+ * @return Pointer to the newly allocated block.
+ */
 void*
 dbg_malloc_zero(size_t size, const char *type, const char *file, int line)
 {
@@ -103,6 +132,39 @@ dbg_malloc_zero(size_t size, const char *type, const char *file, int line)
   return (void*)(mh + 1);
 }
 
+/** Extend an allocated block of memory.
+ * @param[in] ptr Pointer to currently allocated block of memory (may be NULL).
+ * @param[in] size Minimum number of bytes for new block.
+ * @param[in] file File name of allocating function.
+ * @param[in] line Line number of allocating function.
+ * @return Pointer to the extended block of memory.
+ */
+void*
+dbg_realloc(void *ptr, size_t size, const char *file, int line)
+{
+  struct MemHeader *mh, *mh2;
+  if (ptr == NULL)
+    return dbg_malloc(size, "realloc", file, line);
+  mh = (struct MemHeader*)ptr - 1;
+  assert(mh->magic == 0xA110CA7E);
+  if (mh->length >= size)
+    return mh;
+  mh2 = dbg_malloc(size, "realloc", file, line);
+  if (mh2 == NULL)
+  {
+    dbg_free(mh+1, file, line);
+    return NULL;
+  }
+  memcpy(mh2+1, mh+1, mh->length);
+  dbg_free(mh+1, file, line);
+  return (void*)(mh2+1);
+}
+
+/** Deallocate a block of memory.
+ * @param[in] ptr Pointer to currently allocated block of memory (may be NULL).
+ * @param[in] file File name of deallocating function.
+ * @param[in] line Line number of deallocating function.
+ */
 void
 dbg_free(void *ptr, const char *file, int line)
 {
@@ -119,6 +181,9 @@ dbg_free(void *ptr, const char *file, int line)
   dbg_check_gcollect();
 }
 
+/** Report number of bytes currently allocated.
+ * @return Number of bytes allocated.
+ */
 size_t
 fda_get_byte_count(void)
 {
@@ -126,6 +191,9 @@ fda_get_byte_count(void)
   return mdbg_bytes_allocated;
 }
 
+/** Report number of blocks currently allocated.
+ * @return Number of blocks allocated.
+ */
 size_t
 fda_get_block_count(void)
 {
@@ -134,6 +202,10 @@ fda_get_block_count(void)
 
 #include <stdio.h>
 
+/** Callback for when the garbage collector detects a memory leak.
+ * @param[in] p Pointer to leaked memory.
+ * @param[in] sz Length of the block.
+ */
 void
 dbg_memory_leaked(void *p, int sz)
 {
@@ -152,6 +224,7 @@ dbg_memory_leaked(void *p, int sz)
          CurrentTime - mh->since));
 }
 
+/** Initialize the memory debugging subsystem. */
 void
 mem_dbg_initialise(void)
 {