Thierry, while instrumenting my malloc/free functions to debug a problem, I was hit by a malloc/realloc inconsistency in the Lua allocator. The problem is that luaL_newstate() uses malloc() to create its first objects and only after this one we change the allocator to use ours. Thus on the first realloc() call it fails because it tries to reallocate using one function something allocated differently earlier.
I found some info regarding the fact that instead it was possible to use lua_newstate() and pass it the allocator to use. So that's what I did and it solve the problem for me. I think that it results in more accurately accounting the memory in use by the Lua stack since even the very first malloc is counted now. But could you take a quick look to ensure I didn't overlook anything ? I'm attaching the patch, if you're fine with it I can merge it. Thanks, Willy
>From a1ee4ff02e0755d9c8237615fe5ca7124c70c1ad Mon Sep 17 00:00:00 2001 From: Willy Tarreau <w...@1wt.eu> Date: Wed, 12 Apr 2017 21:40:29 +0200 Subject: MINOR: lua: ensure the memory allocator is used all the time luaL_setstate() uses malloc() to initialize the first objects, and only after this we replace the allocator. This creates trouble when replacing the standard memory allocators during debugging sessions since the new allocator is used to realloc() an area previously allocated using the default malloc(). Lua provides lua_newstate() in addition to luaL_newstate(), which takes an allocator for the initial malloc. This is exactly what we need, and this patch does this and fixes the problem. This has no impact outside of debugging sessions and there's no need to backport this. --- src/hlua.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hlua.c b/src/hlua.c index 5383fe9..9b59194 100644 --- a/src/hlua.c +++ b/src/hlua.c @@ -7182,7 +7182,7 @@ void hlua_init(void) gL.Mref = LUA_REFNIL; gL.flags = 0; LIST_INIT(&gL.com); - gL.T = luaL_newstate(); + gL.T = lua_newstate(hlua_alloc, &hlua_global_allocator); hlua_sethlua(&gL); gL.Tref = LUA_REFNIL; gL.task = NULL; -- 1.7.12.1