From 76953316d1283ab6324b59b914ef53a521408444 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Thu, 3 Nov 2022 16:37:13 -0300 Subject: [PATCH] Added a counter of the total number of existing objects It may simplify the control of the garbage collector. --- lgc.c | 2 ++ lstate.c | 2 ++ lstate.h | 1 + 3 files changed, 5 insertions(+) diff --git a/lgc.c b/lgc.c index 2e749902..20e9b4aa 100644 --- a/lgc.c +++ b/lgc.c @@ -259,6 +259,7 @@ GCObject *luaC_newobjdt (lua_State *L, int tt, size_t sz, size_t offset) { global_State *g = G(L); char *p = cast_charp(luaM_newobject(L, novariant(tt), sz)); GCObject *o = cast(GCObject *, p + offset); + g->totalobjs++; o->marked = luaC_white(g); o->tt = tt; o->next = g->allgc; @@ -768,6 +769,7 @@ static void freeupval (lua_State *L, UpVal *uv) { static void freeobj (lua_State *L, GCObject *o) { + G(L)->totalobjs--; switch (o->tt) { case LUA_VPROTO: luaF_freeproto(L, gco2p(o)); diff --git a/lstate.c b/lstate.c index 1fbefb4b..3091a00e 100644 --- a/lstate.c +++ b/lstate.c @@ -279,6 +279,7 @@ static void close_state (lua_State *L) { luaM_freearray(L, G(L)->strt.hash, G(L)->strt.size); freestack(L); lua_assert(gettotalbytes(g) == sizeof(LG)); + lua_assert(g->totalobjs == 1); (*g->frealloc)(g->ud, fromstate(L), sizeof(LG), 0); /* free main block */ } @@ -387,6 +388,7 @@ LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) { g->weak = g->ephemeron = g->allweak = NULL; g->twups = NULL; g->totalbytes = sizeof(LG); + g->totalobjs = 1; g->GCdebt = 0; g->lastatomic = 0; setivalue(&g->nilvalue, 0); /* to signal that state is not yet built */ diff --git a/lstate.h b/lstate.h index 2e907818..62ad61c6 100644 --- a/lstate.h +++ b/lstate.h @@ -250,6 +250,7 @@ typedef struct global_State { lua_Alloc frealloc; /* function to reallocate memory */ void *ud; /* auxiliary data to 'frealloc' */ l_mem totalbytes; /* number of bytes currently allocated - GCdebt */ + l_mem totalobjs; /* total number of objects allocated */ l_mem GCdebt; /* bytes allocated not yet compensated by the collector */ lu_mem GCestimate; /* an estimate of the non-garbage memory in use */ lu_mem lastatomic; /* see function 'genstep' in file 'lgc.c' */