summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@nvidia.com>2024-08-08 13:54:12 -0400
committerDonald Sharp <sharpd@nvidia.com>2024-08-08 14:24:59 -0400
commitdb986aded4eb6b3bd76010c196378f43b6e02015 (patch)
tree9950c224c87445be788762cbd7ac552f069a4db0
parentbc16c8ce8d928e4f59f106a4beea0b29fdbe4b44 (diff)
lib: Cleanup memory associated with modules on shutdown
Signed-off-by: Donald Sharp <sharpd@nvidia.com>
-rw-r--r--lib/libfrr.c2
-rw-r--r--lib/module.c12
-rw-r--r--lib/module.h1
3 files changed, 15 insertions, 0 deletions
diff --git a/lib/libfrr.c b/lib/libfrr.c
index 328c6ec8b2..8ea38368b7 100644
--- a/lib/libfrr.c
+++ b/lib/libfrr.c
@@ -1267,6 +1267,8 @@ void frr_fini(void)
/* frrmod_init -> nothing needed / hooks */
rcu_shutdown();
+ frrmod_terminate();
+
/* also log memstats to stderr when stderr goes to a file*/
if (debug_memstats_at_exit || !isatty(STDERR_FILENO))
have_leftovers = log_memstats(stderr, di->name);
diff --git a/lib/module.c b/lib/module.c
index af7d20c3da..9d178bb0e4 100644
--- a/lib/module.c
+++ b/lib/module.c
@@ -202,3 +202,15 @@ void frrmod_unload(struct frrmod_runtime *module)
{
}
#endif
+
+void frrmod_terminate(void)
+{
+ struct frrmod_runtime *rtinfo = frrmod_list;
+
+ while (rtinfo) {
+ XFREE(MTYPE_MODULE_LOADNAME, rtinfo->load_name);
+ XFREE(MTYPE_MODULE_LOADARGS, rtinfo->load_args);
+
+ rtinfo = rtinfo->next;
+ }
+}
diff --git a/lib/module.h b/lib/module.h
index cd2be474e7..1810b335f6 100644
--- a/lib/module.h
+++ b/lib/module.h
@@ -79,6 +79,7 @@ extern union _frrmod_runtime_u _frrmod_this_module;
extern struct frrmod_runtime *frrmod_list;
extern void frrmod_init(struct frrmod_runtime *modinfo);
+extern void frrmod_terminate(void);
extern struct frrmod_runtime *frrmod_load(const char *spec, const char *dir,
void (*pFerrlog)(const void *,
const char *),