mirror of
https://github.com/cloudwu/skynet.git
synced 2026-07-24 20:23:06 +00:00
remove ssm and add string id
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user