MINOR: hlua: add a new hlua_show_current_location() function

This function may be used to try to show where some Lua code is currently
being executed. It tries hard to detect the initialization phase, both for
the global and the per-thread states, and for runtime states. This intends
to be used by error handlers to provide the users with indications about
what Lua code was being executed when the error triggered.
This commit is contained in:
Willy Tarreau 2022-06-19 17:39:33 +02:00
parent 5c143404ea
commit 0b7b639d7e
2 changed files with 27 additions and 0 deletions

View File

@ -54,6 +54,7 @@ int hlua_post_init();
void hlua_applet_tcp_fct(struct appctx *ctx); void hlua_applet_tcp_fct(struct appctx *ctx);
void hlua_applet_http_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); 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 */ #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 void hlua_init() { }
static inline int hlua_post_init() { return 1; } static inline int hlua_post_init() { return 1; }
static inline void hlua_ctx_destroy(struct hlua *lua) { } 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 */ #endif /* USE_LUA */

View File

@ -1124,6 +1124,31 @@ static inline void hlua_sethlua(struct hlua *hlua)
*hlua_store = 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 <pfx>. 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) /* This function is used to send logs. It try to send on screen (stderr)
* and on the default syslog server. * and on the default syslog server.
*/ */