diff options
author | Niklas Haas <git@haasn.xyz> | 2020-04-09 02:18:48 +0200 |
---|---|---|
committer | Niklas Haas <git@haasn.xyz> | 2020-04-09 02:21:09 +0200 |
commit | a67bda28409dd893617ef47f6e089fd753d7de78 (patch) | |
tree | 2c9b525b737274f3ecbd941c96dfbd267b21f039 /player/lua.c | |
parent | 1e780251aebc4103242cf60d9cba6aa2f6424f62 (diff) | |
download | mpv-a67bda28409dd893617ef47f6e089fd753d7de78.tar.bz2 mpv-a67bda28409dd893617ef47f6e089fd753d7de78.tar.xz |
lua: wrap existing allocator instead of reimplementing it
This is the proper fix for 1e7802. Turns out the solution is dead
simple: we can still set the allocator with lua_getallocf /
lua_setalloc.
This commit makes memory accounting work on luajit as well.
Diffstat (limited to 'player/lua.c')
-rw-r--r-- | player/lua.c | 28 |
1 files changed, 12 insertions, 16 deletions
diff --git a/player/lua.c b/player/lua.c index abc270900b..0b7a1a9489 100644 --- a/player/lua.c +++ b/player/lua.c @@ -90,6 +90,8 @@ struct script_ctx { struct mpv_handle *client; struct MPContext *mpctx; size_t lua_malloc_size; + lua_Alloc lua_allocf; + void *lua_alloc_ud; struct stats_ctx *stats; }; @@ -159,8 +161,9 @@ static void steal_node_alloctions(void *tmp, mpv_node *node) talloc_steal(tmp, node_get_alloc(node)); } -#ifndef HAVE_LUAJIT -// lua_Alloc compatible. Serves only to retrieve memory usage. +// lua_Alloc compatible. Serves only to track memory usage. This wraps the +// existing allocator, partly because luajit requires the use of its internal +// allocator on 64-bit platforms. static void *mp_lua_alloc(void *ud, void *ptr, size_t osize, size_t nsize) { struct script_ctx *ctx = ud; @@ -169,21 +172,15 @@ static void *mp_lua_alloc(void *ud, void *ptr, size_t osize, size_t nsize) if (!ptr) osize = 0; - if (nsize) { - ptr = realloc(ptr, nsize); - if (!ptr) - return NULL; - } else { - free(ptr); - ptr = NULL; - } + ptr = ctx->lua_allocf(ctx->lua_alloc_ud, ptr, osize, nsize); + if (nsize && !ptr) + return NULL; // allocation failed, so original memory left untouched ctx->lua_malloc_size = ctx->lua_malloc_size - osize + nsize; stats_size_value(ctx->stats, "mem", ctx->lua_malloc_size); return ptr; } -#endif static struct script_ctx *get_ctx(lua_State *L) { @@ -436,17 +433,16 @@ static int load_lua(struct mp_script_args *args) goto error_out; } -#if HAVE_LUAJIT - // luajit forces the use of its internal allocator, at least on 64-bit lua_State *L = ctx->state = luaL_newstate(); -#else - lua_State *L = ctx->state = lua_newstate(mp_lua_alloc, ctx); -#endif if (!L) { MP_FATAL(ctx, "Could not initialize Lua.\n"); goto error_out; } + // Wrap the internal allocator with our version that does accounting + ctx->lua_allocf = lua_getallocf(L, &ctx->lua_alloc_ud); + lua_setallocf(L, mp_lua_alloc, ctx); + if (mp_cpcall(L, run_lua, ctx)) { const char *err = "unknown error"; if (lua_type(L, -1) == LUA_TSTRING) // avoid allocation |