diff options
| author | Donald Sharp <sharpd@nvidia.com> | 2022-10-11 13:21:03 -0400 |
|---|---|---|
| committer | Mergify <37929162+mergify[bot]@users.noreply.github.com> | 2022-10-13 05:09:09 +0000 |
| commit | 96d28f747c570290d451ad19a1ff8eddc834d35d (patch) | |
| tree | d4b83cc33ad784ba4c0fb314741049f5feae6c57 | |
| parent | 65cabf8076ff5809d2a61debec94d52b9a407067 (diff) | |
lib: Free some memory in scripting subsystem at shutdown
Pre:
staticd: showing active allocations in memory group libfrr
staticd: memstats: Scripting : 16 * (variably sized)
staticd: memstats: Hash : 2 * (variably sized)
staticd: memstats: Hash Bucket : 8 * 32
staticd: memstats: Hash Index : 1 * (variably sized)
staticd: memstats: Link List : 1 * 40
staticd: memstats: Link Node : 1 * 24
staticd: showing active allocations in memory group logging subsystem
staticd: memstats: log file target : 1 * 88
staticd: showing active allocations in memory group staticd
Post:
staticd: showing active allocations in memory group libfrr
staticd: showing active allocations in memory group logging subsystem
staticd: memstats: log file target : 1 * 88
staticd: showing active allocations in memory group staticd
Signed-off-by: Donald Sharp <sharpd@nvidia.com>
(cherry picked from commit ca28a0f6faef1e0b547966fef49d6987903684b0)
| -rw-r--r-- | lib/frrscript.c | 28 | ||||
| -rw-r--r-- | lib/frrscript.h | 5 | ||||
| -rw-r--r-- | lib/libfrr.c | 4 |
3 files changed, 28 insertions, 9 deletions
diff --git a/lib/frrscript.c b/lib/frrscript.c index a19bd0c3db..2e56932613 100644 --- a/lib/frrscript.c +++ b/lib/frrscript.c @@ -184,13 +184,14 @@ static void *codec_alloc(void *arg) return e; } -#if 0 -static void codec_free(struct codec *c) +static void codec_free(void *data) { - XFREE(MTYPE_TMP, c->typename); - XFREE(MTYPE_TMP, c); + struct frrscript_codec *c = data; + char *constworkaroundandihateit = (char *)c->typename; + + XFREE(MTYPE_SCRIPT, constworkaroundandihateit); + XFREE(MTYPE_SCRIPT, c); } -#endif /* Lua function hash utils */ @@ -212,17 +213,18 @@ bool lua_function_hash_cmp(const void *d1, const void *d2) void *lua_function_alloc(void *arg) { struct lua_function_state *tmp = arg; - struct lua_function_state *lfs = XCALLOC(MTYPE_SCRIPT, sizeof(struct lua_function_state)); + lfs->name = tmp->name; lfs->L = tmp->L; return lfs; } -static void lua_function_free(struct hash_bucket *b, void *data) +static void lua_function_free(void *data) { - struct lua_function_state *lfs = (struct lua_function_state *)b->data; + struct lua_function_state *lfs = data; + lua_close(lfs->L); XFREE(MTYPE_SCRIPT, lfs); } @@ -409,7 +411,8 @@ fail: void frrscript_delete(struct frrscript *fs) { - hash_iterate(fs->lua_function_hash, lua_function_free, NULL); + hash_clean(fs->lua_function_hash, lua_function_free); + hash_free(fs->lua_function_hash); XFREE(MTYPE_SCRIPT, fs->name); XFREE(MTYPE_SCRIPT, fs); } @@ -425,4 +428,11 @@ void frrscript_init(const char *sd) frrscript_register_type_codecs(frrscript_codecs_lib); } +void frrscript_fini(void) +{ + hash_clean(codec_hash, codec_free); + hash_free(codec_hash); + + frrscript_names_destroy(); +} #endif /* HAVE_SCRIPTING */ diff --git a/lib/frrscript.h b/lib/frrscript.h index 4db3e6f1b2..7fa01f70d1 100644 --- a/lib/frrscript.h +++ b/lib/frrscript.h @@ -162,6 +162,11 @@ void frrscript_register_type_codecs(struct frrscript_codec *codecs); void frrscript_init(const char *scriptdir); /* + * On shutdown clean up memory associated with the scripting subsystem + */ +void frrscript_fini(void); + +/* * This macro is mapped to every (name, value) in frrscript_call, * so this in turn maps them onto their encoders */ diff --git a/lib/libfrr.c b/lib/libfrr.c index f5aecd9f75..aee6981854 100644 --- a/lib/libfrr.c +++ b/lib/libfrr.c @@ -1219,6 +1219,10 @@ void frr_fini(void) db_close(); #endif log_ref_fini(); + +#ifdef HAVE_SCRIPTING + frrscript_fini(); +#endif frr_pthread_finish(); zprivs_terminate(di->privs); /* signal_init -> nothing needed */ |
