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
|
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
|
static void
|
||||||
lua_buffer_invalidate (void *object, void *user_data)
|
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
|
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
|
static int
|
||||||
lua_server_gc (lua_State *L)
|
lua_server_gc (lua_State *L)
|
||||||
{
|
{
|
||||||
|
@ -7479,32 +7523,6 @@ static luaL_Reg lua_server_table[] =
|
||||||
{ NULL, NULL }
|
{ 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
|
#define XLUA_HOOK_METATABLE "hook" ///< Identifier for the Lua metatable
|
||||||
|
|
Loading…
Reference in New Issue