From 4a287a724e257dbc9cd9b8a0c48bd15451acd2fe Mon Sep 17 00:00:00 2001 From: Přemysl Janouch Date: Tue, 24 Nov 2015 21:52:16 +0100 Subject: degesch: Lua: add a "server" property to buffers --- degesch.c | 138 +++++++++++++++++++++++++++++++++++--------------------------- 1 file changed, 78 insertions(+), 60 deletions(-) diff --git a/degesch.c b/degesch.c index 90f441c..4cba07c 100644 --- a/degesch.c +++ b/degesch.c @@ -7362,40 +7362,6 @@ struct lua_buffer struct weak_ref_link *weak_ref; ///< A weak reference link }; -static int -lua_buffer_gc (lua_State *L) -{ - struct lua_buffer *wrapper = luaL_checkudata (L, 1, XLUA_BUFFER_METATABLE); - if (wrapper->buffer) - { - lua_cache_invalidate (L, wrapper->buffer); - buffer_weak_unref (wrapper->buffer, &wrapper->weak_ref); - wrapper->buffer = NULL; - } - return 0; -} - -static int -lua_buffer_log (lua_State *L) -{ - struct lua_buffer *wrapper = luaL_checkudata (L, 1, XLUA_BUFFER_METATABLE); - luaL_argcheck (L, wrapper->buffer, 1, "dead reference used"); - const char *message = luaL_checkstring (L, 2); - - struct buffer *buffer = wrapper->buffer; - log_full (wrapper->plugin->ctx, buffer->server, buffer, - BUFFER_LINE_STATUS, "#s", message); - return 0; -} - -static luaL_Reg lua_buffer_table[] = -{ - // TODO: some useful methods or values - { "__gc", lua_buffer_gc }, - { "log", lua_buffer_log }, - { NULL, NULL } -}; - static void lua_buffer_invalidate (void *object, void *user_data) { @@ -7433,6 +7399,84 @@ struct lua_server struct weak_ref_link *weak_ref; ///< A weak reference link }; +static void +lua_server_invalidate (void *object, void *user_data) +{ + struct lua_server *wrapper = user_data; + wrapper->server = NULL; + wrapper->weak_ref = NULL; + // This can in theory call the GC, order isn't arbitrary here + lua_cache_invalidate (wrapper->plugin->L, object); +} + +static void +lua_plugin_push_server (struct lua_plugin *plugin, struct server *server) +{ + lua_State *L = plugin->L; + if (lua_cache_get (L, server)) + return; + + struct lua_server *wrapper = lua_newuserdata (L, sizeof *wrapper); + luaL_setmetatable (L, XLUA_SERVER_METATABLE); + wrapper->plugin = plugin; + wrapper->server = server; + wrapper->weak_ref = server_weak_ref + (server, lua_server_invalidate, wrapper); + lua_cache_store (L, server, -1); +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +static int +lua_buffer_gc (lua_State *L) +{ + struct lua_buffer *wrapper = luaL_checkudata (L, 1, XLUA_BUFFER_METATABLE); + if (wrapper->buffer) + { + lua_cache_invalidate (L, wrapper->buffer); + buffer_weak_unref (wrapper->buffer, &wrapper->weak_ref); + wrapper->buffer = NULL; + } + return 0; +} + +static int +lua_buffer_get_server (lua_State *L) +{ + struct lua_buffer *wrapper = luaL_checkudata (L, 1, XLUA_BUFFER_METATABLE); + luaL_argcheck (L, wrapper->buffer, 1, "dead reference used"); + + if (wrapper->buffer->server) + lua_plugin_push_server (wrapper->plugin, wrapper->buffer->server); + else + lua_pushnil (L); + return 1; +} + +static int +lua_buffer_log (lua_State *L) +{ + struct lua_buffer *wrapper = luaL_checkudata (L, 1, XLUA_BUFFER_METATABLE); + luaL_argcheck (L, wrapper->buffer, 1, "dead reference used"); + const char *message = luaL_checkstring (L, 2); + + struct buffer *buffer = wrapper->buffer; + log_full (wrapper->plugin->ctx, buffer->server, buffer, + BUFFER_LINE_STATUS, "#s", message); + return 0; +} + +static luaL_Reg lua_buffer_table[] = +{ + // TODO: some useful methods or values + { "__gc", lua_buffer_gc }, + { "get_server", lua_buffer_get_server }, + { "log", lua_buffer_log }, + { NULL, NULL } +}; + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + static int lua_server_gc (lua_State *L) { @@ -7479,32 +7523,6 @@ static luaL_Reg lua_server_table[] = { NULL, NULL } }; -static void -lua_server_invalidate (void *object, void *user_data) -{ - struct lua_server *wrapper = user_data; - wrapper->server = NULL; - wrapper->weak_ref = NULL; - // This can in theory call the GC, order isn't arbitrary here - lua_cache_invalidate (wrapper->plugin->L, object); -} - -static void -lua_plugin_push_server (struct lua_plugin *plugin, struct server *server) -{ - lua_State *L = plugin->L; - if (lua_cache_get (L, server)) - return; - - struct lua_server *wrapper = lua_newuserdata (L, sizeof *wrapper); - luaL_setmetatable (L, XLUA_SERVER_METATABLE); - wrapper->plugin = plugin; - wrapper->server = server; - wrapper->weak_ref = server_weak_ref - (server, lua_server_invalidate, wrapper); - lua_cache_store (L, server, -1); -} - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #define XLUA_HOOK_METATABLE "hook" ///< Identifier for the Lua metatable -- cgit v1.2.3-70-g09d2