remove ssm and add string id

This commit is contained in:
Cloud Wu
2019-06-18 14:09:36 +08:00
committed by 云风
parent 7032f21d18
commit 5d26fb3f18
20 changed files with 183 additions and 1172 deletions

View File

@@ -193,12 +193,7 @@ void luaC_upvalbarrier_ (lua_State *L, UpVal *uv) {
void luaC_fix (lua_State *L, GCObject *o) {
global_State *g = G(L);
if (o->tt == LUA_TSHRSTR) {
luaS_fix(g, gco2ts(o));
return;
}
if (g->allgc != o)
return; /* if object is not 1st in 'allgc' list, it is in global short string table */
lua_assert(g->allgc == o); /* object must be 1st in 'allgc' list! */
white2gray(o); /* they will be gray forever */
g->allgc = o->next; /* remove object from 'allgc' list */
o->next = g->fixedgc; /* link it to 'fixedgc' list */
@@ -239,22 +234,22 @@ GCObject *luaC_newobj (lua_State *L, int tt, size_t sz) {
*/
static void reallymarkobject (global_State *g, GCObject *o) {
reentry:
if (isshared(o))
return;
white2gray(o);
switch (o->tt) {
case LUA_TSHRSTR: {
luaS_mark(g, gco2ts(o));
gray2black(o);
g->GCmemtrav += sizelstring(gco2ts(o)->shrlen);
break;
}
case LUA_TLNGSTR: {
if (!isshared(o)) {
white2gray(o);
gray2black(o);
g->GCmemtrav += sizelstring(gco2ts(o)->u.lnglen);
}
gray2black(o);
g->GCmemtrav += sizelstring(gco2ts(o)->u.lnglen);
break;
}
case LUA_TUSERDATA: {
TValue uvalue;
white2gray(o);
markobjectN(g, gco2u(o)->metatable); /* mark its metatable */
gray2black(o);
g->GCmemtrav += sizeudata(gco2u(o));
@@ -266,34 +261,23 @@ static void reallymarkobject (global_State *g, GCObject *o) {
break;
}
case LUA_TLCL: {
if (!isshared(o)) {
white2gray(o);
linkgclist(gco2lcl(o), g->gray);
}
linkgclist(gco2lcl(o), g->gray);
break;
}
case LUA_TCCL: {
white2gray(o);
linkgclist(gco2ccl(o), g->gray);
break;
}
case LUA_TTABLE: {
if (!isshared(o)) {
white2gray(o);
linkgclist(gco2t(o), g->gray);
}
linkgclist(gco2t(o), g->gray);
break;
}
case LUA_TTHREAD: {
white2gray(o);
linkgclist(gco2th(o), g->gray);
break;
}
case LUA_TPROTO: {
if (!isshared(o)) {
white2gray(o);
linkgclist(gco2p(o), g->gray);
}
linkgclist(gco2p(o), g->gray);
break;
}
default: lua_assert(0); break;
@@ -724,6 +708,10 @@ static void freeobj (lua_State *L, GCObject *o) {
case LUA_TTABLE: luaH_free(L, gco2t(o)); break;
case LUA_TTHREAD: luaE_freethread(L, gco2th(o)); break;
case LUA_TUSERDATA: luaM_freemem(L, o, sizeudata(gco2u(o))); break;
case LUA_TSHRSTR:
luaS_remove(L, gco2ts(o)); /* remove it from hash table */
luaM_freemem(L, o, sizelstring(gco2ts(o)->shrlen));
break;
case LUA_TLNGSTR: {
luaM_freemem(L, o, sizelstring(gco2ts(o)->u.lnglen));
break;
@@ -789,6 +777,19 @@ static GCObject **sweeptolive (lua_State *L, GCObject **p) {
** =======================================================
*/
/*
** If possible, shrink string table
*/
static void checkSizes (lua_State *L, global_State *g) {
if (g->gckind != KGC_EMERGENCY) {
l_mem olddebt = g->GCdebt;
if (g->strt.nuse < g->strt.size / 4) /* string table too big? */
luaS_resize(L, g->strt.size / 2); /* shrink it a little */
g->GCestimate += g->GCdebt - olddebt; /* update estimate */
}
}
static GCObject *udata2finalize (global_State *g) {
GCObject *o = g->tobefnz; /* get first element */
lua_assert(tofinalize(o));
@@ -979,6 +980,7 @@ void luaC_freeallobjects (lua_State *L) {
sweepwholelist(L, &g->finobj);
sweepwholelist(L, &g->allgc);
sweepwholelist(L, &g->fixedgc); /* collect fixed objects */
lua_assert(g->strt.nuse == 0);
}
@@ -1024,7 +1026,6 @@ static l_mem atomic (lua_State *L) {
clearvalues(g, g->allweak, origall);
luaS_clearcache(g);
g->currentwhite = cast_byte(otherwhite(g)); /* flip current white */
luaS_collect(g, 0); /* send short strings set to gc thread */
work += g->GCmemtrav; /* complete counting */
return work; /* estimate of memory marked by 'atomic' */
}
@@ -1050,7 +1051,7 @@ static lu_mem singlestep (lua_State *L) {
global_State *g = G(L);
switch (g->gcstate) {
case GCSpause: {
g->GCmemtrav = 0;
g->GCmemtrav = g->strt.size * sizeof(GCObject*);
restartcollection(g);
g->gcstate = GCSpropagate;
return g->GCmemtrav;
@@ -1082,6 +1083,7 @@ static lu_mem singlestep (lua_State *L) {
}
case GCSswpend: { /* finish sweeps */
makewhite(g, g->mainthread); /* sweep main thread */
checkSizes(L, g);
g->gcstate = GCScallfin;
return 0;
}