diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2014-04-04 14:01:04 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2014-04-04 14:01:04 -0300 |
commit | 4a248836746a0942c6f923ad0265c87ba85a3d35 (patch) | |
tree | c7ed772ed6bbb80bf6ffa9f6c9d744741d152d1a /lgc.c | |
parent | 97378326412b8e39ff2e0b839d5fad085dbc57ea (diff) | |
download | lua-4a248836746a0942c6f923ad0265c87ba85a3d35.tar.gz lua-4a248836746a0942c6f923ad0265c87ba85a3d35.tar.bz2 lua-4a248836746a0942c6f923ad0265c87ba85a3d35.zip |
'GCmemtrav' does not need to track the entire collection, only each
single step individually
Diffstat (limited to 'lgc.c')
-rw-r--r-- | lgc.c | 16 |
1 files changed, 8 insertions, 8 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lgc.c,v 2.180 2014/04/01 14:06:59 roberto Exp roberto $ | 2 | ** $Id: lgc.c,v 2.181 2014/04/02 16:44:42 roberto Exp roberto $ |
3 | ** Garbage Collector | 3 | ** Garbage Collector |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -965,8 +965,9 @@ void luaC_freeallobjects (lua_State *L) { | |||
965 | 965 | ||
966 | static l_mem atomic (lua_State *L) { | 966 | static l_mem atomic (lua_State *L) { |
967 | global_State *g = G(L); | 967 | global_State *g = G(L); |
968 | l_mem work = -cast(l_mem, g->GCmemtrav); /* start counting work */ | 968 | l_mem work; |
969 | GCObject *origweak, *origall; | 969 | GCObject *origweak, *origall; |
970 | g->GCmemtrav = 0; /* start counting work */ | ||
970 | lua_assert(!iswhite(obj2gco(g->mainthread))); | 971 | lua_assert(!iswhite(obj2gco(g->mainthread))); |
971 | g->gcstate = GCSinsideatomic; | 972 | g->gcstate = GCSinsideatomic; |
972 | markobject(g, L); /* mark running thread */ | 973 | markobject(g, L); /* mark running thread */ |
@@ -976,10 +977,10 @@ static l_mem atomic (lua_State *L) { | |||
976 | /* remark occasional upvalues of (maybe) dead threads */ | 977 | /* remark occasional upvalues of (maybe) dead threads */ |
977 | remarkupvals(g); | 978 | remarkupvals(g); |
978 | propagateall(g); /* propagate changes */ | 979 | propagateall(g); /* propagate changes */ |
979 | work += g->GCmemtrav; /* stop counting (do not (re)count grays) */ | 980 | work = g->GCmemtrav; /* stop counting (do not (re)count grays) */ |
980 | /* traverse objects caught by write barrier and by 'remarkupvals' */ | 981 | /* traverse objects caught by write barrier and by 'remarkupvals' */ |
981 | retraversegrays(g); | 982 | retraversegrays(g); |
982 | work -= g->GCmemtrav; /* restart counting */ | 983 | g->GCmemtrav = 0; /* restart counting */ |
983 | convergeephemerons(g); | 984 | convergeephemerons(g); |
984 | /* at this point, all strongly accessible objects are marked. */ | 985 | /* at this point, all strongly accessible objects are marked. */ |
985 | /* Clear values from weak tables, before checking finalizers */ | 986 | /* Clear values from weak tables, before checking finalizers */ |
@@ -991,7 +992,7 @@ static l_mem atomic (lua_State *L) { | |||
991 | g->gcfinnum = 1; /* there may be objects to be finalized */ | 992 | g->gcfinnum = 1; /* there may be objects to be finalized */ |
992 | markbeingfnz(g); /* mark objects that will be finalized */ | 993 | markbeingfnz(g); /* mark objects that will be finalized */ |
993 | propagateall(g); /* remark, to propagate 'resurrection' */ | 994 | propagateall(g); /* remark, to propagate 'resurrection' */ |
994 | work -= g->GCmemtrav; /* restart counting */ | 995 | g->GCmemtrav = 0; /* restart counting */ |
995 | convergeephemerons(g); | 996 | convergeephemerons(g); |
996 | /* at this point, all resurrected objects are marked. */ | 997 | /* at this point, all resurrected objects are marked. */ |
997 | /* remove dead objects from weak tables */ | 998 | /* remove dead objects from weak tables */ |
@@ -1026,19 +1027,18 @@ static lu_mem singlestep (lua_State *L) { | |||
1026 | global_State *g = G(L); | 1027 | global_State *g = G(L); |
1027 | switch (g->gcstate) { | 1028 | switch (g->gcstate) { |
1028 | case GCSpause: { | 1029 | case GCSpause: { |
1029 | /* start to count memory traversed */ | ||
1030 | g->GCmemtrav = g->strt.size * sizeof(GCObject*); | 1030 | g->GCmemtrav = g->strt.size * sizeof(GCObject*); |
1031 | restartcollection(g); | 1031 | restartcollection(g); |
1032 | g->gcstate = GCSpropagate; | 1032 | g->gcstate = GCSpropagate; |
1033 | return g->GCmemtrav; | 1033 | return g->GCmemtrav; |
1034 | } | 1034 | } |
1035 | case GCSpropagate: { | 1035 | case GCSpropagate: { |
1036 | lu_mem oldtrav = g->GCmemtrav; | 1036 | g->GCmemtrav = 0; |
1037 | lua_assert(g->gray); | 1037 | lua_assert(g->gray); |
1038 | propagatemark(g); | 1038 | propagatemark(g); |
1039 | if (g->gray == NULL) /* no more `gray' objects? */ | 1039 | if (g->gray == NULL) /* no more `gray' objects? */ |
1040 | g->gcstate = GCSatomic; /* finish propagate phase */ | 1040 | g->gcstate = GCSatomic; /* finish propagate phase */ |
1041 | return g->GCmemtrav - oldtrav; /* memory traversed in this step */ | 1041 | return g->GCmemtrav; /* memory traversed in this step */ |
1042 | } | 1042 | } |
1043 | case GCSatomic: { | 1043 | case GCSatomic: { |
1044 | lu_mem work; | 1044 | lu_mem work; |