projects
/
collectd.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
lua plugin: Don't destroy interpreter early
[collectd.git]
/
src
/
lua.c
diff --git
a/src/lua.c
b/src/lua.c
index
8cfb704
..
b5d3ce5
100644
(file)
--- a/
src/lua.c
+++ b/
src/lua.c
@@
-28,36
+28,26
@@
* Ruben Kerkhof <ruben at rubenkerkhof.com>
**/
* Ruben Kerkhof <ruben at rubenkerkhof.com>
**/
-/* <lua5.1/luaconf.h> 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 "collectd.h"
+#include "plugin.h"
+#include "utils/common/common.h"
+#include "utils_lua.h"
/* Include the Lua API header files. */
#include <lauxlib.h>
#include <lua.h>
#include <lualib.h>
/* Include the Lua API header files. */
#include <lauxlib.h>
#include <lua.h>
#include <lualib.h>
-#include "utils_lua.h"
#include <pthread.h>
#include <pthread.h>
-#if COLLECT_DEBUG && __GNUC__
-#undef sprintf
-#pragma GCC poison sprintf
-#endif
-
typedef struct lua_script_s {
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;
lua_State *lua_state;
struct lua_script_s *next;
} lua_script_t;
typedef struct {
lua_State *lua_state;
- c
onst c
har *lua_function_name;
+ char *lua_function_name;
pthread_mutex_t lock;
int callback_id;
} clua_callback_data_t;
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) /* {{{ */
{
* 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;
}
return -1;
}
+ /* Copy the thread pointer */
+ lua_pushvalue(L, idx);
+
luaL_ref(L, LUA_REGISTRYINDEX);
luaL_ref(L, LUA_REGISTRYINDEX);
- lua_pop(L, 1); /* -1 = 0 */
return 0;
} /* }}} int clua_store_thread */
return 0;
} /* }}} int clua_store_thread */
@@
-272,6
+258,13
@@
static int lua_cb_dispatch_values(lua_State *L) /* {{{ */
return 0;
} /* }}} lua_cb_dispatch_values */
return 0;
} /* }}} lua_cb_dispatch_values */
+static void lua_cb_free(void *data) {
+ clua_callback_data_t *cb = data;
+ free(cb->lua_function_name);
+ pthread_mutex_destroy(&cb->lock);
+ free(cb);
+}
+
static int lua_cb_register_read(lua_State *L) /* {{{ */
{
int nargs = lua_gettop(L);
static int lua_cb_register_read(lua_State *L) /* {{{ */
{
int nargs = lua_gettop(L);
@@
-303,13
+296,14
@@
static int lua_cb_register_read(lua_State *L) /* {{{ */
cb->lua_function_name = strdup(function_name);
pthread_mutex_init(&cb->lock, NULL);
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");
if (status != 0)
return luaL_error(L, "%s", "plugin_register_complex_read failed");
@@
-350,7
+344,7
@@
static int lua_cb_register_write(lua_State *L) /* {{{ */
int status = plugin_register_write(/* name = */ function_name,
/* callback = */ clua_write,
&(user_data_t){
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)
});
if (status != 0)
@@
-391,7
+385,6
@@
static void lua_script_free(lua_script_t *script) /* {{{ */
script->lua_state = NULL;
}
script->lua_state = NULL;
}
- sfree(script->script_path);
sfree(script);
lua_script_free(next);
sfree(script);
lua_script_free(next);
@@
-455,14
+448,7
@@
static int lua_script_load(const char *script_path) /* {{{ */
return status;
}
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));
if (status != 0) {
ERROR("Lua plugin: luaL_loadfile failed: %s",
lua_tostring(script->lua_state, -1));
@@
-484,10
+470,7
@@
static int lua_script_load(const char *script_path) /* {{{ */
status);
else
ERROR("Lua plugin: Executing script \"%s\" failed:\n%s",
status);
else
ERROR("Lua plugin: Executing script \"%s\" failed:\n%s",
- script->script_path, errmsg);
-
- lua_script_free(script);
- return -1;
+ script_path, errmsg);
}
/* Append this script to the global list of scripts. */
}
/* Append this script to the global list of scripts. */
@@
-501,6
+484,9
@@
static int lua_script_load(const char *script_path) /* {{{ */
scripts = script;
}
scripts = script;
}
+ if (status != 0)
+ return -1;
+
return 0;
} /* }}} int lua_script_load */
return 0;
} /* }}} int lua_script_load */