degesch: Lua: add a "server" property to buffers
This commit is contained in:
parent
87e1236b30
commit
4a287a724e
138
degesch.c
138
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
|
||||
|
Loading…
Reference in New Issue
Block a user