diff --git a/libs/lua/lua-5.3.5/lgc.c b/libs/lua/lua-5.3.5/lgc.c index db4df82922..c4ea0e979d 100644 --- a/libs/lua/lua-5.3.5/lgc.c +++ b/libs/lua/lua-5.3.5/lgc.c @@ -210,8 +210,14 @@ GCObject *luaC_newobj (lua_State *L, int tt, size_t sz) { GCObject *o = cast(GCObject *, luaM_newobject(L, novariant(tt), sz)); o->marked = luaC_white(g); o->tt = tt; - o->next = g->allgc; - g->allgc = o; + if (g->gcmlock) { + white2gray(o); /* gray forever */ + o->next = g->fixedgc; + g->fixedgc = o; + } else { + o->next = g->allgc; + g->allgc = o; + } return o; } @@ -1176,4 +1182,7 @@ void luaC_fullgc (lua_State *L, int isemergency) { /* }====================================================== */ - +LUA_API void lua_mlock (lua_State *L, int en) { + global_State *g = G(L); + g->gcmlock = en; +} diff --git a/libs/lua/lua-5.3.5/lstate.c b/libs/lua/lua-5.3.5/lstate.c index c1a76643c3..06b505b6f3 100644 --- a/libs/lua/lua-5.3.5/lstate.c +++ b/libs/lua/lua-5.3.5/lstate.c @@ -328,6 +328,7 @@ LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) { g->gcfinnum = 0; g->gcpause = LUAI_GCPAUSE; g->gcstepmul = LUAI_GCMUL; + g->gcmlock = 0; for (i=0; i < LUA_NUMTAGS; i++) g->mt[i] = NULL; if (luaD_rawrunprotected(L, f_luaopen, NULL) != LUA_OK) { /* memory allocation error: free partial state */ diff --git a/libs/lua/lua-5.3.5/lstate.h b/libs/lua/lua-5.3.5/lstate.h index 56b3741000..0e8e4d0277 100644 --- a/libs/lua/lua-5.3.5/lstate.h +++ b/libs/lua/lua-5.3.5/lstate.h @@ -162,6 +162,7 @@ typedef struct global_State { unsigned int gcfinnum; /* number of finalizers to call in each GC step */ int gcpause; /* size of pause between successive GCs */ int gcstepmul; /* GC 'granularity' */ + int gcmlock; /* memory lock new objects - fixedgc */ lua_CFunction panic; /* to be called in unprotected errors */ struct lua_State *mainthread; const lua_Number *version; /* pointer to version number */ diff --git a/libs/lua/lua-5.3.5/lua.h b/libs/lua/lua-5.3.5/lua.h index c236e36095..b56fa91c8a 100644 --- a/libs/lua/lua-5.3.5/lua.h +++ b/libs/lua/lua-5.3.5/lua.h @@ -311,6 +311,8 @@ LUA_API int (lua_isyieldable) (lua_State *L); LUA_API int (lua_gc) (lua_State *L, int what, int data); +LUA_API void (lua_mlock) (lua_State *L, int enable); + /* ** miscellaneous functions