]> git.proxmox.com Git - mirror_frr.git/blobdiff - lib/memory.c
zebra, lib: fix the ZEBRA_INTERFACE_VRF_UPDATE zapi message
[mirror_frr.git] / lib / memory.c
index 87cba69fc51536b579f01997fe6351ad29ee7ff2..fee23a75ac67e1d11463c102b2e68a87444ba1b5 100644 (file)
@@ -20,6 +20,9 @@
 #ifdef HAVE_MALLOC_H
 #include <malloc.h>
 #endif
+#ifdef HAVE_MALLOC_NP_H
+#include <malloc_np.h>
+#endif
 #ifdef HAVE_MALLOC_MALLOC_H
 #include <malloc/malloc.h>
 #endif
@@ -36,9 +39,19 @@ DEFINE_MTYPE(LIB, PREFIX_FLOWSPEC, "Prefix Flowspec")
 
 static inline void mt_count_alloc(struct memtype *mt, size_t size, void *ptr)
 {
+       size_t current;
        size_t oldsize;
 
-       atomic_fetch_add_explicit(&mt->n_alloc, 1, memory_order_relaxed);
+       current = 1 + atomic_fetch_add_explicit(&mt->n_alloc, 1,
+                                               memory_order_relaxed);
+
+       oldsize = atomic_load_explicit(&mt->n_max, memory_order_relaxed);
+       if (current > oldsize)
+               /* note that this may fail, but approximation is sufficient */
+               atomic_compare_exchange_weak_explicit(&mt->n_max, &oldsize,
+                                                     current,
+                                                     memory_order_relaxed,
+                                                     memory_order_relaxed);
 
        oldsize = atomic_load_explicit(&mt->size, memory_order_relaxed);
        if (oldsize == 0)
@@ -51,7 +64,15 @@ static inline void mt_count_alloc(struct memtype *mt, size_t size, void *ptr)
 #ifdef HAVE_MALLOC_USABLE_SIZE
        size_t mallocsz = malloc_usable_size(ptr);
 
-       atomic_fetch_add_explicit(&mt->total, mallocsz, memory_order_relaxed);
+       current = mallocsz + atomic_fetch_add_explicit(&mt->total, mallocsz,
+                                                      memory_order_relaxed);
+       oldsize = atomic_load_explicit(&mt->max_size, memory_order_relaxed);
+       if (current > oldsize)
+               /* note that this may fail, but approximation is sufficient */
+               atomic_compare_exchange_weak_explicit(&mt->max_size, &oldsize,
+                                                     current,
+                                                     memory_order_relaxed,
+                                                     memory_order_relaxed);
 #endif
 }