diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2012-05-29 14:52:17 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2012-05-29 14:52:17 -0300 |
commit | 6efffb9acd65020687627866afe877f0f5071e8e (patch) | |
tree | 8e398d5a4125374f016e8fd4963c53e35ea02dae | |
parent | 51e8f08e609b20af6f70641855d9be5edb2f1328 (diff) | |
download | lua-6efffb9acd65020687627866afe877f0f5071e8e.tar.gz lua-6efffb9acd65020687627866afe877f0f5071e8e.tar.bz2 lua-6efffb9acd65020687627866afe877f0f5071e8e.zip |
only count in 'atomic' objects marked for the first time
-rw-r--r-- | lgc.c | 13 |
1 files changed, 8 insertions, 5 deletions
@@ -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 | ||
963 | static l_mem atomic (lua_State *L) { | 963 | static 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 | ||