summaryrefslogtreecommitdiffstats
path: root/src/lua
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2017-01-17 19:19:47 +0000
committerVsevolod Stakhov <vsevolod@highsecure.ru>2017-01-17 19:19:47 +0000
commit7d40df5184f0aa6facde77e088d0751d4c475c6a (patch)
tree8c54b8eb817da0dee480bebd66d46bd83ee73898 /src/lua
parent6eec897d8c3e01159556f41b8bb938cacfc0c084 (diff)
downloadrspamd-7d40df5184f0aa6facde77e088d0751d4c475c6a.tar.gz
rspamd-7d40df5184f0aa6facde77e088d0751d4c475c6a.zip
[Fix] Various reload leak fixing
Diffstat (limited to 'src/lua')
-rw-r--r--src/lua/lua_common.c28
-rw-r--r--src/lua/lua_common.h9
2 files changed, 37 insertions, 0 deletions
diff --git a/src/lua/lua_common.c b/src/lua/lua_common.c
index b9eabe790..7f4cea7b7 100644
--- a/src/lua/lua_common.c
+++ b/src/lua/lua_common.c
@@ -1264,3 +1264,31 @@ lua_worker_get_pid (lua_State *L)
return 1;
}
+
+struct rspamd_lua_ref_cbdata {
+ lua_State *L;
+ gint cbref;
+};
+
+static void
+rspamd_lua_ref_dtor (gpointer p)
+{
+ struct rspamd_lua_ref_cbdata *cbdata = p;
+
+ luaL_unref (cbdata->L, LUA_REGISTRYINDEX, cbdata->cbref);
+}
+
+void
+rspamd_lua_add_ref_dtor (lua_State *L, rspamd_mempool_t *pool,
+ gint ref)
+{
+ struct rspamd_lua_ref_cbdata *cbdata;
+
+ if (ref != -1) {
+ cbdata = rspamd_mempool_alloc (pool, sizeof (*cbdata));
+ cbdata->cbref = ref;
+ cbdata->L = L;
+
+ rspamd_mempool_add_destructor (pool, rspamd_lua_ref_dtor, cbdata);
+ }
+}
diff --git a/src/lua/lua_common.h b/src/lua/lua_common.h
index dbb46c822..ecf46d32e 100644
--- a/src/lua/lua_common.h
+++ b/src/lua/lua_common.h
@@ -360,5 +360,14 @@ void lua_call_finish_script (lua_State *L, struct
gboolean rspamd_lua_run_postloads (lua_State *L, struct rspamd_config *cfg,
struct event_base *ev_base, struct rspamd_worker *w);
+/**
+ * Adds new destructor for a local function for specific pool
+ * @param L
+ * @param pool
+ * @param ref
+ */
+void rspamd_lua_add_ref_dtor (lua_State *L, rspamd_mempool_t *pool,
+ gint ref);
+
#endif /* WITH_LUA */
#endif /* RSPAMD_LUA_H */