X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=ircd%2Fmemdebug.c;h=af7e53011c9da53eaf8529d7fc9db160371846d9;hb=refs%2Fheads%2Fupstream;hp=5e97813e213895356bfb3be424fa1e71d9bf8817;hpb=592e569802dbc1d90a0095d6f8fed409d6bf8c39;p=ircu2.10.12-pk.git diff --git a/ircd/memdebug.c b/ircd/memdebug.c index 5e97813..af7e530 100644 --- a/ircd/memdebug.c +++ b/ircd/memdebug.c @@ -1,11 +1,14 @@ #include #include "ircd.h" #include "ircd_alloc.h" +#include "ircd_log.h" #include "client.h" #include "s_debug.h" +#include "send.h" #include +#include -#include +/* #include -- 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,13 @@ 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) { @@ -124,6 +160,11 @@ dbg_realloc(void *ptr, size_t size, const char *file, int 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) { @@ -140,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) { @@ -147,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) { @@ -155,6 +202,10 @@ fda_get_block_count(void) #include +/** 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) { @@ -173,6 +224,7 @@ dbg_memory_leaked(void *p, int sz) CurrentTime - mh->since)); } +/** Initialize the memory debugging subsystem. */ void mem_dbg_initialise(void) {