summaryrefslogtreecommitdiffstats
path: root/src/lua/lua_common.c
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/lua_common.c
parent6eec897d8c3e01159556f41b8bb938cacfc0c084 (diff)
downloadrspamd-7d40df5184f0aa6facde77e088d0751d4c475c6a.tar.gz
rspamd-7d40df5184f0aa6facde77e088d0751d4c475c6a.zip
[Fix] Various reload leak fixing
Diffstat (limited to 'src/lua/lua_common.c')
-rw-r--r--src/lua/lua_common.c28
1 files changed, 28 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);
+ }
+}