aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2013-09-11 11:56:15 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2013-09-11 11:56:15 -0300
commit6ca7b63bce0ce4f1abf418dead256d3e51e41644 (patch)
treee854083edc691345b2499d37f65f3cf9c237d2c3
parent4eeb1831bee8c424a60b5ca05667b5d1c1bb662e (diff)
downloadlua-6ca7b63bce0ce4f1abf418dead256d3e51e41644.tar.gz
lua-6ca7b63bce0ce4f1abf418dead256d3e51e41644.tar.bz2
lua-6ca7b63bce0ce4f1abf418dead256d3e51e41644.zip
check for shrinking string table done only at the end of a GC cycle
-rw-r--r--lgc.c15
-rw-r--r--lstring.c4
2 files changed, 11 insertions, 8 deletions
diff --git a/lgc.c b/lgc.c
index be6ca0c1..62e3777f 100644
--- a/lgc.c
+++ b/lgc.c
@@ -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
762static 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*/
765static 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 }
diff --git a/lstring.c b/lstring.c
index bd40841d..c73e521c 100644
--- a/lstring.c
+++ b/lstring.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lstring.c,v 2.34 2013/09/05 19:31:49 roberto Exp roberto $ 2** $Id: lstring.c,v 2.35 2013/09/11 12:26:14 roberto Exp roberto $
3** String table (keeps all strings handled by Lua) 3** String table (keeps all strings handled by Lua)
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -118,8 +118,6 @@ LUAI_FUNC void luaS_remove (lua_State *L, TString *ts) {
118 p = &(*p)->tsv.hnext; 118 p = &(*p)->tsv.hnext;
119 *p = (*p)->tsv.hnext; /* remove element from its list */ 119 *p = (*p)->tsv.hnext; /* remove element from its list */
120 tb->nuse--; 120 tb->nuse--;
121 if (tb->nuse < tb->size/4)
122 luaS_resize(L, tb->size/2);
123} 121}
124 122
125 123