]> git.puffer.fish Git - mirror/frr.git/commitdiff
lib: Change frrscript to hold many Lua states
authorDonald Lee <dlqs@gmx.com>
Sun, 4 Jul 2021 14:58:21 +0000 (22:58 +0800)
committerDonald Lee <dlqs@gmx.com>
Sat, 17 Jul 2021 22:32:03 +0000 (06:32 +0800)
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>
lib/frrscript.c
lib/frrscript.h

index 1a9f3639dd66ed7d2be326fa7772bdb62b369f81..d86e6acb1274e2cc5c9ed6931703e19f65d88b1d 100644 (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)
index 8612c602f3ca317a2115186b54720f48bfec487d..97e543eb00e825d114ef9cbcb7f0b365f9a63c18 100644 (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;