aboutsummaryrefslogtreecommitdiff
path: root/lgc.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2014-04-04 14:01:04 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2014-04-04 14:01:04 -0300
commit4a248836746a0942c6f923ad0265c87ba85a3d35 (patch)
treec7ed772ed6bbb80bf6ffa9f6c9d744741d152d1a /lgc.c
parent97378326412b8e39ff2e0b839d5fad085dbc57ea (diff)
downloadlua-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.c16
1 files changed, 8 insertions, 8 deletions
diff --git a/lgc.c b/lgc.c
index 680c0ac2..fb7bc456 100644
--- a/lgc.c
+++ b/lgc.c
@@ -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
966static l_mem atomic (lua_State *L) { 966static 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;