commit 42224ca5538293f2b4a217e813bc437ca673b3cf
parent 426d3e43bdec4b1ab2b0aed1844396c27f64872f
Author: Roberto Ierusalimschy <roberto@inf.puc-rio.br>
Date: Fri, 2 Feb 2001 14:22:58 -0200
loop of 'dostring' may never reclaim memory
Diffstat:
4 files changed, 12 insertions(+), 5 deletions(-)
diff --git a/bugs b/bugs
@@ -255,3 +255,7 @@ Thu Feb 1 11:55:45 EDT 2001
>> lua_pushuserdata(L, NULL) is buggy
(by Edgar Toernig; since 4.0)
+** ldo.c
+Fri Feb 2 14:06:40 EDT 2001
+>> «while 1 dostring[[print('hello\n')]] end» never reclaims memory
+(by Andrew Paton; since 4.0b)
diff --git a/ldo.c b/ldo.c
@@ -1,5 +1,5 @@
/*
-** $Id: ldo.c,v 1.120 2001/02/01 17:40:48 roberto Exp roberto $
+** $Id: ldo.c,v 1.121 2001/02/02 15:13:05 roberto Exp roberto $
** Stack and Call structure of Lua
** See Copyright Notice in lua.h
*/
@@ -251,7 +251,9 @@ static int protectedparser (lua_State *L, ZIO *z, int bin) {
int status;
LUA_LOCK(L);
p.z = z; p.bin = bin;
- luaC_checkGC(L);
+ /* before parsing, give a (good) chance to GC */
+ if (G(L)->nblocks/8 >= G(L)->GCthreshold/10)
+ luaC_collectgarbage(L);
old_blocks = G(L)->nblocks;
status = luaD_runprotected(L, f_parser, &p);
if (status == 0) {
diff --git a/lgc.c b/lgc.c
@@ -1,5 +1,5 @@
/*
-** $Id: lgc.c,v 1.84 2001/02/01 17:40:48 roberto Exp roberto $
+** $Id: lgc.c,v 1.85 2001/02/02 15:13:05 roberto Exp roberto $
** Garbage Collector
** See Copyright Notice in lua.h
*/
@@ -375,7 +375,7 @@ void luaC_collect (lua_State *L, int all) {
}
-static void luaC_collectgarbage (lua_State *L) {
+void luaC_collectgarbage (lua_State *L) {
markall(L);
invalidaterefs(G(L)); /* check unlocked references */
luaC_collect(L, 0);
diff --git a/lgc.h b/lgc.h
@@ -1,5 +1,5 @@
/*
-** $Id: lgc.h,v 1.7 1999/11/22 13:12:07 roberto Exp roberto $
+** $Id: lgc.h,v 1.8 2000/10/02 14:47:43 roberto Exp roberto $
** Garbage Collector
** See Copyright Notice in lua.h
*/
@@ -12,6 +12,7 @@
void luaC_collect (lua_State *L, int all);
+void luaC_collectgarbage (lua_State *L);
void luaC_checkGC (lua_State *L);