From 105ba9af8f0bd9a116f2571625b2ea39c49c20c1 Mon Sep 17 00:00:00 2001 From: Donald Lee Date: Sun, 4 Jul 2021 22:58:21 +0800 Subject: [PATCH] lib: Change frrscript to hold many Lua states Instead of 1 frrscript : 1 lua state, it is changed to 1 : N. The states are hashed with their function names. Signed-off-by: Donald Lee --- lib/frrscript.c | 34 ++++++++++++++++++++++++++++++++++ lib/frrscript.h | 21 +++++++++++++++++++-- 2 files changed, 53 insertions(+), 2 deletions(-) diff --git a/lib/frrscript.c b/lib/frrscript.c index 1a9f3639dd..d86e6acb12 100644 --- a/lib/frrscript.c +++ b/lib/frrscript.c @@ -102,6 +102,40 @@ static void codec_free(struct codec *c) } #endif + +unsigned int lua_function_hash_key(const void *data) +{ + const struct lua_function_state *lfs = data; + + return string_hash_make(lfs->name); +} + +bool lua_function_hash_cmp(const void *d1, const void *d2) +{ + const struct lua_function_state *lfs1 = d1; + const struct lua_function_state *lfs2 = d2; + + return strmatch(lfs1->name, lfs2->name); +} + +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 lua_function_state *lfs) +{ + XFREE(MTYPE_TMP, lfs->name); + lua_close(lfs->L); + XFREE(MTYPE_TMP, lfs); +} + /* Generic script APIs */ int _frrscript_call(struct frrscript *fs) diff --git a/lib/frrscript.h b/lib/frrscript.h index 8612c602f3..97e543eb00 100644 --- a/lib/frrscript.h +++ b/lib/frrscript.h @@ -40,14 +40,31 @@ struct frrscript_codec { decoder_func decoder; }; +struct lua_function_state { + const char *name; + lua_State *L; +}; + + struct frrscript { /* Script name */ char *name; - /* Lua state */ - struct lua_State *L; + /* Hash of Lua function name to Lua function state */ + struct hash *lua_function_hash; }; + +/* + * Hash related functions for lua_function_hash + */ + +void *lua_function_alloc(void *arg); + +unsigned int lua_function_hash_key(const void *data); + +bool lua_function_hash_cmp(const void *d1, const void *d2); + struct frrscript_env { /* Value type */ const char *typename;