diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2013-09-11 11:56:15 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2013-09-11 11:56:15 -0300 |
commit | 6ca7b63bce0ce4f1abf418dead256d3e51e41644 (patch) | |
tree | e854083edc691345b2499d37f65f3cf9c237d2c3 /lgc.c | |
parent | 4eeb1831bee8c424a60b5ca05667b5d1c1bb662e (diff) | |
download | lua-6ca7b63bce0ce4f1abf418dead256d3e51e41644.tar.gz lua-6ca7b63bce0ce4f1abf418dead256d3e51e41644.tar.bz2 lua-6ca7b63bce0ce4f1abf418dead256d3e51e41644.zip |
check for shrinking string table done only at the end of a GC cycle
Diffstat (limited to 'lgc.c')
-rw-r--r-- | lgc.c | 15 |
1 files changed, 10 insertions, 5 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lgc.c,v 2.162 2013/09/11 14:09:55 roberto Exp roberto $ | 2 | ** $Id: lgc.c,v 2.163 2013/09/11 14:47:08 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 | */ |
@@ -759,10 +759,15 @@ static GCObject **sweeptolive (lua_State *L, GCObject **p, int *n) { | |||
759 | ** ======================================================= | 759 | ** ======================================================= |
760 | */ | 760 | */ |
761 | 761 | ||
762 | static void checkBuffer (lua_State *L) { | 762 | /* |
763 | global_State *g = G(L); | 763 | ** If possible, free concatenation buffer and shrink string table |
764 | if (g->gckind != KGC_EMERGENCY) | 764 | */ |
765 | static void checkSizes (lua_State *L, global_State *g) { | ||
766 | if (g->gckind != KGC_EMERGENCY) { | ||
765 | luaZ_freebuffer(L, &g->buff); /* free concatenation buffer */ | 767 | luaZ_freebuffer(L, &g->buff); /* free concatenation buffer */ |
768 | if (g->strt.nuse < g->strt.size / 4) /* string table too big? */ | ||
769 | luaS_resize(L, g->strt.size / 2); /* shrink it a little */ | ||
770 | } | ||
766 | } | 771 | } |
767 | 772 | ||
768 | 773 | ||
@@ -1171,7 +1176,7 @@ static lu_mem singlestep (lua_State *L) { | |||
1171 | } | 1176 | } |
1172 | case GCSswpend: { /* finish sweeps */ | 1177 | case GCSswpend: { /* finish sweeps */ |
1173 | makewhite(g, obj2gco(g->mainthread)); /* sweep main thread */ | 1178 | makewhite(g, obj2gco(g->mainthread)); /* sweep main thread */ |
1174 | checkBuffer(L); | 1179 | checkSizes(L, g); |
1175 | g->gcstate = GCSpause; /* finish collection */ | 1180 | g->gcstate = GCSpause; /* finish collection */ |
1176 | return GCSWEEPCOST; | 1181 | return GCSWEEPCOST; |
1177 | } | 1182 | } |