aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2012-05-29 14:52:17 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2012-05-29 14:52:17 -0300
commit6efffb9acd65020687627866afe877f0f5071e8e (patch)
tree8e398d5a4125374f016e8fd4963c53e35ea02dae
parent51e8f08e609b20af6f70641855d9be5edb2f1328 (diff)
downloadlua-6efffb9acd65020687627866afe877f0f5071e8e.tar.gz
lua-6efffb9acd65020687627866afe877f0f5071e8e.tar.bz2
lua-6efffb9acd65020687627866afe877f0f5071e8e.zip
only count in 'atomic' objects marked for the first time
-rw-r--r--lgc.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/lgc.c b/lgc.c
index 64e8df97..5583d3a1 100644
--- a/lgc.c
+++ b/lgc.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lgc.c,v 2.128 2012/05/23 15:43:14 roberto Exp roberto $ 2** $Id: lgc.c,v 2.129 2012/05/28 20:41:00 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*/
@@ -962,7 +962,7 @@ void luaC_freeallobjects (lua_State *L) {
962 962
963static l_mem atomic (lua_State *L) { 963static l_mem atomic (lua_State *L) {
964 global_State *g = G(L); 964 global_State *g = G(L);
965 l_mem trav = g->GCmemtrav; 965 l_mem trav = -g->GCmemtrav; /* start counting work */
966 GCObject *origweak, *origall; 966 GCObject *origweak, *origall;
967 lua_assert(!iswhite(obj2gco(g->mainthread))); 967 lua_assert(!iswhite(obj2gco(g->mainthread)));
968 markobject(g, L); /* mark running thread */ 968 markobject(g, L); /* mark running thread */
@@ -971,6 +971,8 @@ static l_mem atomic (lua_State *L) {
971 markmt(g); /* mark basic metatables */ 971 markmt(g); /* mark basic metatables */
972 /* remark occasional upvalues of (maybe) dead threads */ 972 /* remark occasional upvalues of (maybe) dead threads */
973 remarkupvals(g); 973 remarkupvals(g);
974 propagateall(g); /* propagate changes */
975 trav += g->GCmemtrav; /* count work done til now */
974 /* traverse objects caught by write barrier and by 'remarkupvals' */ 976 /* traverse objects caught by write barrier and by 'remarkupvals' */
975 retraversegrays(g); 977 retraversegrays(g);
976 convergeephemerons(g); 978 convergeephemerons(g);
@@ -979,10 +981,11 @@ static l_mem atomic (lua_State *L) {
979 clearvalues(g, g->weak, NULL); 981 clearvalues(g, g->weak, NULL);
980 clearvalues(g, g->allweak, NULL); 982 clearvalues(g, g->allweak, NULL);
981 origweak = g->weak; origall = g->allweak; 983 origweak = g->weak; origall = g->allweak;
984 trav -= g->GCmemtrav; /* restart counting work */
982 separatetobefnz(L, 0); /* separate objects to be finalized */ 985 separatetobefnz(L, 0); /* separate objects to be finalized */
983 markbeingfnz(g); /* mark userdata that will be finalized */ 986 markbeingfnz(g); /* mark objects that will be finalized */
984 propagateall(g); /* remark, to propagate `preserveness' */ 987 propagateall(g); /* remark, to propagate `preserveness' */
985 trav = g->GCmemtrav - trav; /* avoid adding convergence twice */ 988 trav += g->GCmemtrav; /* add work done til now */
986 convergeephemerons(g); 989 convergeephemerons(g);
987 /* at this point, all resurrected objects are marked. */ 990 /* at this point, all resurrected objects are marked. */
988 /* remove dead objects from weak tables */ 991 /* remove dead objects from weak tables */
@@ -994,7 +997,7 @@ static l_mem atomic (lua_State *L) {
994 g->currentwhite = cast_byte(otherwhite(g)); /* flip current white */ 997 g->currentwhite = cast_byte(otherwhite(g)); /* flip current white */
995 entersweep(L); /* prepare to sweep strings */ 998 entersweep(L); /* prepare to sweep strings */
996 /*lua_checkmemory(L);*/ 999 /*lua_checkmemory(L);*/
997 return trav; /* reasonable estimate of the work done by 'atomic' */ 1000 return trav; /* estimate of the objects marked by 'atomic' */
998} 1001}
999 1002
1000 1003