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 <dlqs@gmx.com>
This commit is contained in:
Donald Lee 2021-07-04 22:58:21 +08:00
parent 432bb280fb
commit 105ba9af8f
2 changed files with 53 additions and 2 deletions

View file

@ -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)

View file

@ -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;