MINOR: add hlua_yield_asap() helper

When called, this function will try to enforce a yield (if available) as
soon as possible. Indeed, automatic yield is already enforced every X
Lua instructions. However, there may be some cases where we know after
running heavy operation that we should yield already to avoid taking too
much CPU at once.

This is what this function offers, instead of asking the user to manually
yield using "core.yield()" from Lua itself after using an expensive
Lua method offered by haproxy, we can directly enforce the yield without
the need to do it in the Lua script.
This commit is contained in:
Aurelien DARRAGON 2025-04-30 16:37:56 +02:00
parent df50d3e39f
commit 97363015a5
2 changed files with 15 additions and 0 deletions

View File

@ -50,6 +50,7 @@
#define HLUA_INIT(__hlua) do { (__hlua)->T = 0; } while(0)
/* Lua HAProxy integration functions. */
void hlua_yield_asap(lua_State *L);
const char *hlua_traceback(lua_State *L, const char* sep);
void hlua_ctx_destroy(struct hlua *lua);
void hlua_init();

View File

@ -1979,6 +1979,20 @@ void hlua_hook(lua_State *L, lua_Debug *ar)
lua_sethook(hlua->T, hlua_hook, LUA_MASKRET|LUA_MASKCOUNT, hlua_get_nb_instruction(hlua));
}
/* tries to yield as soon as possible if the context permits it */
void hlua_yield_asap(lua_State *L)
{
struct hlua *hlua;
/* Get hlua struct, or NULL if we execute from main lua state */
hlua = hlua_gethlua(L);
if (!hlua)
return;
/* enforce hook for current hlua ctx on the next Lua instruction */
lua_sethook(hlua->T, hlua_hook, LUA_MASKCOUNT, 1);
}
/* This function start or resumes the Lua stack execution. If the flag
* "yield_allowed" if no set and the LUA stack execution returns a yield
* The function return an error.