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 /lib | |
| 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)
Diffstat (limited to 'lib')
| -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 */  | 
