]> git.proxmox.com Git - mirror_frr.git/blobdiff - lib/memory.c
Merge pull request #7220 from idryzhov/fix-clear-isis
[mirror_frr.git] / lib / memory.c
index 87cba69fc51536b579f01997fe6351ad29ee7ff2..2c902d123b5826bffe85701047e435eec77195db 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
@@ -32,13 +35,22 @@ struct memgroup **mg_insert = &mg_first;
 
 DEFINE_MGROUP(LIB, "libfrr")
 DEFINE_MTYPE(LIB, TMP, "Temporary memory")
-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 +63,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
 }
 
@@ -137,13 +157,13 @@ static int qmem_exit_walker(void *arg, struct memgroup *mg, struct memtype *mt)
 
        if (!mt) {
                fprintf(eda->fp,
-                       "%s: showing active allocations in "
-                       "memory group %s\n",
+                       "%s: showing active allocations in memory group %s\n",
                        eda->prefix, mg->name);
 
        } else if (mt->n_alloc) {
                char size[32];
-               eda->error++;
+               if (!mg->active_at_exit)
+                       eda->error++;
                snprintf(size, sizeof(size), "%10zu", mt->size);
                fprintf(eda->fp, "%s: memstats:  %-30s: %6zu * %s\n",
                        eda->prefix, mt->name, mt->n_alloc,