diff options
author | Robin Gareus <robin@gareus.org> | 2018-03-19 01:33:13 +0100 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2018-03-19 02:23:09 +0100 |
commit | f2ca0c144b8f74ddf1ed2845de413a8b2e42d832 (patch) | |
tree | 727b313cd407357979da9d5544064272e0103dce | |
parent | 20929347219355f63cb8e786e5201cd5f352d0af (diff) |
Customize Lua GC, add object-memory-lock API.
Add custom API to prevent Lua Objects from being garbage collected.
This is intended to for Ardour LuaBridge bindings (~1MB Objects:
tables, functions and userdata).
The bindings are persistent and the gc can skip them in mark & sweep
phases. This is a significant performance improvement for garbage
collection.
Note. The next version of Lua (5.4) will come with a generational-gc
rather than an incremental, so extending the API at this point in time
is acceptable.
-rw-r--r-- | libs/lua/lua-5.3.4/lgc.c | 15 | ||||
-rw-r--r-- | libs/lua/lua-5.3.4/lstate.c | 1 | ||||
-rw-r--r-- | libs/lua/lua-5.3.4/lstate.h | 1 | ||||
-rw-r--r-- | libs/lua/lua-5.3.4/lua.h | 2 |
4 files changed, 16 insertions, 3 deletions
diff --git a/libs/lua/lua-5.3.4/lgc.c b/libs/lua/lua-5.3.4/lgc.c index ba2c19e14e..3e9ca6e841 100644 --- a/libs/lua/lua-5.3.4/lgc.c +++ b/libs/lua/lua-5.3.4/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; } @@ -1175,4 +1181,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.4/lstate.c b/libs/lua/lua-5.3.4/lstate.c index 9194ac3419..b148d3d1bd 100644 --- a/libs/lua/lua-5.3.4/lstate.c +++ b/libs/lua/lua-5.3.4/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.4/lstate.h b/libs/lua/lua-5.3.4/lstate.h index a469466c44..a03f9c4c5b 100644 --- a/libs/lua/lua-5.3.4/lstate.h +++ b/libs/lua/lua-5.3.4/lstate.h @@ -144,6 +144,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.4/lua.h b/libs/lua/lua-5.3.4/lua.h index 26c0e2d698..0e1096e8ea 100644 --- a/libs/lua/lua-5.3.4/lua.h +++ b/libs/lua/lua-5.3.4/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 |