From: Maria Matejka Date: Fri, 31 May 2024 13:16:41 +0000 (+0200) Subject: If debugging, store a malloc circular log for easier debugging X-Git-Tag: v3.0.0~198 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=31d5ffa4a95c25c36d42f5dddbd2abf82ddc32b9;p=thirdparty%2Fbird.git If debugging, store a malloc circular log for easier debugging --- diff --git a/lib/resource.h b/lib/resource.h index 1c5519a27..6b225c768 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 10bf28cfe..38f6d0cf8 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