]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
If debugging, store a malloc circular log for easier debugging
authorMaria Matejka <mq@ucw.cz>
Fri, 31 May 2024 13:16:41 +0000 (15:16 +0200)
committerMaria Matejka <mq@ucw.cz>
Tue, 4 Jun 2024 08:11:36 +0000 (10:11 +0200)
lib/resource.h
lib/xmalloc.c

index 1c5519a27d8bfabe3687d5aa9c5808b037bc05c3..6b225c768257ef90df86a29152d7eb21c48d4505 100644 (file)
@@ -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
index 10bf28cfece73159fe8743397e2a7f1c9edea918..38f6d0cf868ad9e78fe5227a57cf46ce2a2d38f6 100644 (file)
 
 #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
 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