Release all memory when using the builtin allocator.

Blocks >128K are not kept in the segment list and were not destroyed.
This commit is contained in:
Mike Pall 2010-09-13 19:48:31 +02:00
parent c88169dc46
commit 32bfececc5

View File

@ -155,26 +155,21 @@ static TValue *cpluaopen(lua_State *L, lua_CFunction dummy, void *ud)
static void close_state(lua_State *L)
{
global_State *g = G(L);
lj_func_closeuv(L, tvref(L->stack));
lj_gc_freeall(g);
lua_assert(gcref(g->gc.root) == obj2gco(L));
lua_assert(g->strnum == 0);
lj_trace_freestate(g);
lj_mem_freevec(g, g->strhash, g->strmask+1, GCRef);
lj_str_freebuf(g, &g->tmpbuf);
lj_mem_freevec(g, tvref(L->stack), L->stacksize, TValue);
lua_assert(g->gc.total == sizeof(GG_State));
#ifndef LUAJIT_USE_SYSMALLOC
if (g->allocf == lj_alloc_f) {
#if LJ_HASJIT
lj_mcode_free(G2J(g));
#endif
if (g->allocf == lj_alloc_f)
lj_alloc_destroy(g->allocd);
} else
else
#endif
{
lj_func_closeuv(L, tvref(L->stack));
lj_gc_freeall(g);
lua_assert(gcref(g->gc.root) == obj2gco(L));
lua_assert(g->strnum == 0);
lj_trace_freestate(g);
lj_mem_freevec(g, g->strhash, g->strmask+1, GCRef);
lj_str_freebuf(g, &g->tmpbuf);
lj_mem_freevec(g, tvref(L->stack), L->stacksize, TValue);
lua_assert(g->gc.total == sizeof(GG_State));
g->allocf(g->allocd, G2GG(g), sizeof(GG_State), 0);
}
}
#if LJ_64