diff --git a/include/haproxy/hlua.h b/include/haproxy/hlua.h index 21e4534af..fb535f282 100644 --- a/include/haproxy/hlua.h +++ b/include/haproxy/hlua.h @@ -54,6 +54,7 @@ int hlua_post_init(); void hlua_applet_tcp_fct(struct appctx *ctx); void hlua_applet_http_fct(struct appctx *ctx); struct task *hlua_process_task(struct task *task, void *context, unsigned int state); +const char *hlua_show_current_location(const char *pfx); #else /* USE_LUA */ @@ -67,6 +68,7 @@ struct task *hlua_process_task(struct task *task, void *context, unsigned int st static inline void hlua_init() { } static inline int hlua_post_init() { return 1; } static inline void hlua_ctx_destroy(struct hlua *lua) { } +static inline const char *hlua_show_current_location(const char *pfx) { return NULL; } #endif /* USE_LUA */ diff --git a/src/hlua.c b/src/hlua.c index 0959be51c..dd39397de 100644 --- a/src/hlua.c +++ b/src/hlua.c @@ -1124,6 +1124,31 @@ static inline void hlua_sethlua(struct hlua *hlua) *hlua_store = hlua; } +/* Will return a non-NULL string indicating the Lua call trace if the caller + * currently is executing from within a Lua function. One line per entry will + * be emitted, and each extra line will be prefixed with . If a current + * Lua function is not detected, NULL is returned. + */ +const char *hlua_show_current_location(const char *pfx) +{ + lua_State *L; + lua_Debug ar; + + /* global or per-thread stack initializing ? */ + if (hlua_state_id != -1 && (L = hlua_states[hlua_state_id]) && lua_getstack(L, 0, &ar)) + return hlua_traceback(L, pfx); + + /* per-thread stack running ? */ + if (hlua_states[tid + 1] && (L = hlua_states[tid + 1]) && lua_getstack(L, 0, &ar)) + return hlua_traceback(L, pfx); + + /* global stack running ? */ + if (hlua_states[0] && (L = hlua_states[0]) && lua_getstack(L, 0, &ar)) + return hlua_traceback(L, pfx); + + return NULL; +} + /* This function is used to send logs. It try to send on screen (stderr) * and on the default syslog server. */