From 1371661156f2d97d0a27edb3b63de10376639800 Mon Sep 17 00:00:00 2001 From: Maria Matejka Date: Fri, 31 May 2024 15:16:41 +0200 Subject: [PATCH] If debugging, store a malloc circular log for easier debugging --- lib/resource.h | 2 +- lib/xmalloc.c | 29 +++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/lib/resource.h b/lib/resource.h index 1c5519a2..6b225c76 100644 --- a/lib/resource.h +++ b/lib/resource.h @@ -179,7 +179,7 @@ void resource_sys_init(void); #define xrealloc bird_xrealloc void *xmalloc(unsigned); void *xrealloc(void *, unsigned); -#define xfree(x) free(x) +void xfree(void *); #endif #endif diff --git a/lib/xmalloc.c b/lib/xmalloc.c index 10bf28cf..38f6d0cf 100644 --- a/lib/xmalloc.c +++ b/lib/xmalloc.c @@ -10,9 +10,25 @@ #include "nest/bird.h" #include "lib/resource.h" +#include "lib/timer.h" #ifndef HAVE_LIBDMALLOC +#if DEBUGGING +struct minfo { + void *ptr; + uint size; + uint action; + uint thread_id; + btime time; +} minfo_block[65536]; +_Atomic uint minfo_pos; + +#define MINFO(p, s, a) minfo_block[atomic_fetch_add_explicit(&minfo_pos, 1, memory_order_acq_rel) % 65536] = (struct minfo) { .ptr = p, .size = s, .action = a, .thread_id = THIS_THREAD_ID, .time = current_time_now(), } +#else +#define MINFO(...) +#endif + /** * xmalloc - malloc with checking * @size: block size @@ -26,7 +42,10 @@ void * xmalloc(uint size) { + void *p = malloc(size); + MINFO(p, size, 1); + if (p) return p; die("Unable to allocate %d bytes of memory", size); @@ -47,9 +66,19 @@ void * xrealloc(void *ptr, uint size) { void *p = realloc(ptr, size); + + MINFO(ptr, 0, 2); + MINFO(p, size, 3); + if (p) return p; die("Unable to allocate %d bytes of memory", size); } + +void xfree(void *p) +{ + MINFO(p, 0, 4); + free(p); +} #endif