summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Maria Matejka <mq@ucw.cz>2018-01-23 16:32:12 +0100
committerMikael Magnusson <mikma@users.sourceforge.net>2019-02-22 23:12:41 +0100
commitbfd06659462cff84cc877d85d44dcd9603d2a43d (patch)
tree757b38576505dc8a29f8883a79d013801fc72632
parent0c16ef1b616179ed0a652f162f7e9035104a992d (diff)
Lua: using newthread()
-rw-r--r--lua/filter.c32
1 files changed, 24 insertions, 8 deletions
diff --git a/lua/filter.c b/lua/filter.c
index fa005354..97911148 100644
--- a/lua/filter.c
+++ b/lua/filter.c
@@ -9,6 +9,22 @@
/* Docs: http://pgl.yoyo.org/luai/i/luaL_dostring */
+static lua_State *global_lua_state = NULL;
+
+static inline lua_State * luaB_getstate(void) {
+ if (!global_lua_state) {
+ lua_State *L = luaL_newstate();
+ luaL_openlibs(L);
+ global_lua_state = L;
+ }
+
+ return lua_newthread(global_lua_state);
+}
+
+static inline void luaB_close(lua_State *L UNUSED) {
+ lua_pop(global_lua_state, 1);
+}
+
struct lua_new_filter_writer_data {
struct lua_filter_chunk *first, *last;
};
@@ -40,12 +56,11 @@ struct filter * lua_new_filter(struct f_inst *inst) {
return NULL;
}
- lua_State *L = luaL_newstate();
- luaL_openlibs(L);
+ lua_State *L = luaB_getstate();
int loadres = luaL_loadstring(L, string.val.s);
switch (loadres) {
case LUA_ERRMEM:
- lua_close(L);
+ luaB_close(L);
cf_error("Memory allocation error occured when loading lua chunk");
return NULL;
case LUA_ERRSYNTAX:
@@ -53,7 +68,7 @@ struct filter * lua_new_filter(struct f_inst *inst) {
const char *e = lua_tostring(L, -1);
char *ec = cfg_alloc(strlen(e) + 1);
strcpy(ec, e);
- lua_close(L);
+ luaB_close(L);
cf_error("Lua syntax error: %s", ec);
return NULL;
}
@@ -63,7 +78,7 @@ struct filter * lua_new_filter(struct f_inst *inst) {
struct lua_new_filter_writer_data lnfwd = {};
lua_dump(L, lua_new_filter_writer, &lnfwd, 0); /* No error to handle */
- lua_close(L);
+ luaB_close(L);
f->lua_chunk = lnfwd.first;
return f;
@@ -81,10 +96,11 @@ static const char *lua_interpret_reader(lua_State *L UNUSED, void *ud, size_t *s
}
struct f_val lua_interpret(struct lua_filter_chunk *chunk, struct rte **e, struct rta **a, struct ea_list **ea, struct linpool *lp, int flags) {
- lua_State *L = luaL_newstate();
- luaL_openlibs(L);
+ lua_State *L = luaB_getstate();
+
lua_bird_state *lbs = luaB_init(L, lp);
luaB_push_route(L, *e);
+
struct lua_filter_chunk **rptr = &chunk;
lua_load(L, lua_interpret_reader, rptr, "", "b");
int le = lua_pcall(L, 0, LUA_MULTRET, 0);
@@ -101,7 +117,7 @@ struct f_val lua_interpret(struct lua_filter_chunk *chunk, struct rte **e, struc
out = F_VAL(T_RETURN, i, F_ERROR);
}
- lua_close(L);
+ luaB_close(L);
return out;
}