X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Flua.c;h=8dc78d00000d9c8e2674580f44038418782e8e70;hb=cc459b3cccf832e08d5c5bae12add775a915ae01;hp=8cfb70459991317048e6cdeb0b6be27146c95cdf;hpb=af12cc40e48331f8c98294239cef60393218a46d;p=collectd.git diff --git a/src/lua.c b/src/lua.c index 8cfb7045..8dc78d00 100644 --- a/src/lua.c +++ b/src/lua.c @@ -28,36 +28,26 @@ * Ruben Kerkhof **/ -/* defines a macro using "sprintf". Although not used here, - * GCC will complain about the macro definition. */ -#define DONT_POISON_SPRINTF_YET - -#include "common.h" -#include "plugin.h" #include "collectd.h" +#include "plugin.h" +#include "utils/common/common.h" +#include "utils_lua.h" /* Include the Lua API header files. */ #include #include #include -#include "utils_lua.h" #include -#if COLLECT_DEBUG && __GNUC__ -#undef sprintf -#pragma GCC poison sprintf -#endif - typedef struct lua_script_s { - char *script_path; lua_State *lua_state; struct lua_script_s *next; } lua_script_t; typedef struct { lua_State *lua_state; - const char *lua_function_name; + char *lua_function_name; pthread_mutex_t lock; int callback_id; } clua_callback_data_t; @@ -89,18 +79,14 @@ static int clua_load_callback(lua_State *L, int callback_ref) /* {{{ */ * garbage collector. */ static int clua_store_thread(lua_State *L, int idx) /* {{{ */ { - if (idx < 0) - idx += lua_gettop(L) + 1; - - /* Copy the thread pointer */ - lua_pushvalue(L, idx); /* +1 = 3 */ - if (!lua_isthread(L, -1)) { - lua_pop(L, 3); /* -3 = 0 */ + if (!lua_isthread(L, idx)) { return -1; } + /* Copy the thread pointer */ + lua_pushvalue(L, idx); + luaL_ref(L, LUA_REGISTRYINDEX); - lua_pop(L, 1); /* -1 = 0 */ return 0; } /* }}} int clua_store_thread */ @@ -272,6 +258,12 @@ static int lua_cb_dispatch_values(lua_State *L) /* {{{ */ return 0; } /* }}} lua_cb_dispatch_values */ +static void lua_cb_free(void *data) { + clua_callback_data_t *cb = data; + free(cb->lua_function_name); + free(cb); +} + static int lua_cb_register_read(lua_State *L) /* {{{ */ { int nargs = lua_gettop(L); @@ -303,13 +295,14 @@ static int lua_cb_register_read(lua_State *L) /* {{{ */ cb->lua_function_name = strdup(function_name); pthread_mutex_init(&cb->lock, NULL); - int status = plugin_register_complex_read(/* group = */ "lua", - /* name = */ function_name, - /* callback = */ clua_read, - /* interval = */ 0, - &(user_data_t){ - .data = cb, - }); + int status = + plugin_register_complex_read(/* group = */ "lua", + /* name = */ function_name, + /* callback = */ clua_read, + /* interval = */ 0, + &(user_data_t){ + .data = cb, .free_func = lua_cb_free, + }); if (status != 0) return luaL_error(L, "%s", "plugin_register_complex_read failed"); @@ -350,7 +343,7 @@ static int lua_cb_register_write(lua_State *L) /* {{{ */ int status = plugin_register_write(/* name = */ function_name, /* callback = */ clua_write, &(user_data_t){ - .data = cb, + .data = cb, .free_func = lua_cb_free, }); if (status != 0) @@ -391,7 +384,6 @@ static void lua_script_free(lua_script_t *script) /* {{{ */ script->lua_state = NULL; } - sfree(script->script_path); sfree(script); lua_script_free(next); @@ -455,14 +447,7 @@ static int lua_script_load(const char *script_path) /* {{{ */ return status; } - script->script_path = strdup(script_path); - if (script->script_path == NULL) { - ERROR("Lua plugin: strdup failed."); - lua_script_free(script); - return -1; - } - - status = luaL_loadfile(script->lua_state, script->script_path); + status = luaL_loadfile(script->lua_state, script_path); if (status != 0) { ERROR("Lua plugin: luaL_loadfile failed: %s", lua_tostring(script->lua_state, -1)); @@ -484,7 +469,7 @@ static int lua_script_load(const char *script_path) /* {{{ */ status); else ERROR("Lua plugin: Executing script \"%s\" failed:\n%s", - script->script_path, errmsg); + script_path, errmsg); lua_script_free(script); return -1;