summaryrefslogtreecommitdiffstats
path: root/src/lua/lua_buffer.c
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@rambler-co.ru>2012-07-26 21:50:13 +0400
committerVsevolod Stakhov <vsevolod@rambler-co.ru>2012-07-26 21:50:13 +0400
commite1a8ed50131891516f5da6e22aae69a306147d38 (patch)
tree61002cf909d2d41553b94b8ed654d0f2f3567a67 /src/lua/lua_buffer.c
parent2e615083e475c7390c667695b9e659fa5ba4da5f (diff)
downloadrspamd-e1a8ed50131891516f5da6e22aae69a306147d38.tar.gz
rspamd-e1a8ed50131891516f5da6e22aae69a306147d38.zip
* Add lua worker type and lua worker bindings.
* Add lua utility library for basic utils. * Fixes lua_buffer code. Fix lua loading error. Added some other lua utility functions.
Diffstat (limited to 'src/lua/lua_buffer.c')
-rw-r--r--src/lua/lua_buffer.c41
1 files changed, 16 insertions, 25 deletions
diff --git a/src/lua/lua_buffer.c b/src/lua/lua_buffer.c
index bb5b1ea8c..9c18ef5cf 100644
--- a/src/lua/lua_buffer.c
+++ b/src/lua/lua_buffer.c
@@ -34,14 +34,14 @@ LUA_FUNCTION_DEF (io_dispatcher, set_policy);
LUA_FUNCTION_DEF (io_dispatcher, write);
LUA_FUNCTION_DEF (io_dispatcher, pause);
LUA_FUNCTION_DEF (io_dispatcher, restore);
-LUA_FUNCTION_DEF (io_dispatcher, delete);
+LUA_FUNCTION_DEF (io_dispatcher, destroy);
static const struct luaL_reg io_dispatcherlib_m[] = {
LUA_INTERFACE_DEF (io_dispatcher, set_policy),
LUA_INTERFACE_DEF (io_dispatcher, write),
LUA_INTERFACE_DEF (io_dispatcher, pause),
LUA_INTERFACE_DEF (io_dispatcher, restore),
- {"__gc", lua_io_dispatcher_delete},
+ LUA_INTERFACE_DEF (io_dispatcher, destroy),
{"__tostring", lua_class_tostring},
{NULL, NULL}
};
@@ -90,12 +90,12 @@ lua_io_read_cb (f_str_t * in, void *arg)
need_unlock = TRUE;
}
/* callback (dispatcher, data) */
+ lua_rawgeti (cbdata->L, LUA_REGISTRYINDEX, cbdata->cbref_read);
pdispatcher = lua_newuserdata (cbdata->L, sizeof (struct rspamd_io_dispatcher_s *));
lua_setclass (cbdata->L, "rspamd{io_dispatcher}", -1);
*pdispatcher = cbdata->d;
lua_pushlstring (cbdata->L, in->begin, in->len);
- lua_rawgeti (cbdata->L, LUA_REGISTRYINDEX, cbdata->cbref_read);
if (lua_pcall (cbdata->L, 2, 1, 0) != 0) {
msg_info ("call to session finalizer failed: %s", lua_tostring (cbdata->L, -1));
}
@@ -107,16 +107,6 @@ lua_io_read_cb (f_str_t * in, void *arg)
g_mutex_unlock (lua_mtx);
}
- if (!res) {
- /* Unref callbacks */
- luaL_unref (cbdata->L, LUA_REGISTRYINDEX, cbdata->cbref_read);
- if (cbdata->cbref_write) {
- luaL_unref (cbdata->L, LUA_REGISTRYINDEX, cbdata->cbref_write);
- }
- luaL_unref (cbdata->L, LUA_REGISTRYINDEX, cbdata->cbref_err);
- g_slice_free1 (sizeof (struct lua_dispatcher_cbdata), cbdata);
- }
-
return res;
}
@@ -132,12 +122,13 @@ lua_io_write_cb (void *arg)
if (g_mutex_trylock (lua_mtx)) {
need_unlock = TRUE;
}
+ lua_rawgeti (cbdata->L, LUA_REGISTRYINDEX, cbdata->cbref_read);
/* callback (dispatcher) */
pdispatcher = lua_newuserdata (cbdata->L, sizeof (struct rspamd_io_dispatcher_s *));
lua_setclass (cbdata->L, "rspamd{io_dispatcher}", -1);
*pdispatcher = cbdata->d;
- lua_rawgeti (cbdata->L, LUA_REGISTRYINDEX, cbdata->cbref_read);
+
if (lua_pcall (cbdata->L, 1, 1, 0) != 0) {
msg_info ("call to session finalizer failed: %s", lua_tostring (cbdata->L, -1));
}
@@ -148,14 +139,6 @@ lua_io_write_cb (void *arg)
if (need_unlock) {
g_mutex_unlock (lua_mtx);
}
-
- if (!res) {
- /* Unref callbacks */
- luaL_unref (cbdata->L, LUA_REGISTRYINDEX, cbdata->cbref_read);
- luaL_unref (cbdata->L, LUA_REGISTRYINDEX, cbdata->cbref_write);
- luaL_unref (cbdata->L, LUA_REGISTRYINDEX, cbdata->cbref_err);
- g_slice_free1 (sizeof (struct lua_dispatcher_cbdata), cbdata);
- }
}
return res;
@@ -173,12 +156,12 @@ lua_io_err_cb (GError * err, void *arg)
need_unlock = TRUE;
}
/* callback (dispatcher, err) */
+ lua_rawgeti (cbdata->L, LUA_REGISTRYINDEX, cbdata->cbref_err);
pdispatcher = lua_newuserdata (cbdata->L, sizeof (struct rspamd_io_dispatcher_s *));
lua_setclass (cbdata->L, "rspamd{io_dispatcher}", -1);
*pdispatcher = cbdata->d;
lua_pushstring (cbdata->L, err->message);
- lua_rawgeti (cbdata->L, LUA_REGISTRYINDEX, cbdata->cbref_read);
if (lua_pcall (cbdata->L, 2, 0, 0) != 0) {
msg_info ("call to session finalizer failed: %s", lua_tostring (cbdata->L, -1));
}
@@ -234,8 +217,12 @@ lua_io_dispatcher_create (lua_State *L)
tv_num = lua_tonumber (L, 6);
tv.tv_sec = trunc (tv_num);
tv.tv_usec = modf (tv_num, &tmp) * 1000.;
+ io_dispatcher = rspamd_create_dispatcher (cbdata->base, fd, BUFFER_LINE, lua_io_read_cb, lua_io_write_cb, lua_io_err_cb, &tv, cbdata);
+ }
+ else {
+ io_dispatcher = rspamd_create_dispatcher (cbdata->base, fd, BUFFER_LINE, lua_io_read_cb, lua_io_write_cb, lua_io_err_cb, NULL, cbdata);
}
- io_dispatcher = rspamd_create_dispatcher (cbdata->base, fd, BUFFER_LINE, lua_io_read_cb, lua_io_write_cb, lua_io_err_cb, &tv, cbdata);
+
cbdata->d = io_dispatcher;
/* Push result */
pdispatcher = lua_newuserdata (L, sizeof (struct rspamd_io_dispatcher_s *));
@@ -338,7 +325,7 @@ lua_io_dispatcher_restore (lua_State *L)
}
static int
-lua_io_dispatcher_delete (lua_State *L)
+lua_io_dispatcher_destroy (lua_State *L)
{
struct rspamd_io_dispatcher_s *io_dispatcher = lua_check_io_dispatcher (L);
@@ -369,10 +356,14 @@ luaopen_io_dispatcher (lua_State * L)
luaL_openlib (L, NULL, io_dispatcherlib_m, 0);
luaL_openlib(L, "rspamd_io_dispatcher", io_dispatcherlib_f, 0);
+ lua_pop(L, 1); /* remove metatable from stack */
+
/* Simple event class */
lua_newclass (L, "rspamd{ev_base}", null_reg);
luaL_openlib (L, "rspamd_ev_base", null_reg, 0);
+ lua_pop(L, 1); /* remove metatable from stack */
+
/* Set buffer types globals */
lua_pushnumber (L, BUFFER_LINE);
lua_setglobal (L, "IO_BUFFER_LINE");