new API function to force garbage collection.

This commit is contained in:
Roberto Ierusalimschy 1997-05-26 11:42:51 -03:00
parent 9d6f4e48a6
commit e1249970c2
3 changed files with 18 additions and 8 deletions

View File

@ -5,7 +5,7 @@
** Also provides some predefined lua functions. ** Also provides some predefined lua functions.
*/ */
char *rcs_inout="$Id: inout.c,v 2.57 1997/04/06 14:14:27 roberto Exp roberto $"; char *rcs_inout="$Id: inout.c,v 2.58 1997/04/15 17:32:47 roberto Exp roberto $";
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
@ -310,6 +310,11 @@ static void rawsettable (void)
} }
static void luaI_collectgarbage (void)
{
lua_pushnumber(lua_collectgarbage(luaL_opt_number(1, 0)));
}
/* /*
** Internal functions ** Internal functions
@ -320,6 +325,7 @@ static struct {
} int_funcs[] = { } int_funcs[] = {
{"assert", luaI_assert}, {"assert", luaI_assert},
{"call", luaI_call}, {"call", luaI_call},
{"callgc", luaI_collectgarbage},
{"dofile", lua_internaldofile}, {"dofile", lua_internaldofile},
{"dostring", lua_internaldostring}, {"dostring", lua_internaldostring},
{"error", luaI_error}, {"error", luaI_error},

5
lua.h
View File

@ -2,7 +2,7 @@
** LUA - An Extensible Extension Language ** LUA - An Extensible Extension Language
** TeCGraf: Grupo de Tecnologia em Computacao Grafica, PUC-Rio, Brazil ** TeCGraf: Grupo de Tecnologia em Computacao Grafica, PUC-Rio, Brazil
** e-mail: lua@tecgraf.puc-rio.br ** e-mail: lua@tecgraf.puc-rio.br
** $Id: lua.h,v 4.2 1997/04/04 22:24:51 roberto Exp roberto $ ** $Id: lua.h,v 4.3 1997/04/15 16:52:20 roberto Exp roberto $
*/ */
@ -84,6 +84,9 @@ void lua_unref (int ref);
lua_Object lua_createtable (void); lua_Object lua_createtable (void);
long lua_collectgarbage (long limit);
/* =============================================================== */ /* =============================================================== */
/* some useful macros */ /* some useful macros */

13
table.c
View File

@ -3,7 +3,7 @@
** Module to control static tables ** Module to control static tables
*/ */
char *rcs_table="$Id: table.c,v 2.68 1997/04/07 14:48:53 roberto Exp roberto $"; char *rcs_table="$Id: table.c,v 2.69 1997/05/14 18:38:29 roberto Exp roberto $";
#include "luamem.h" #include "luamem.h"
#include "auxlib.h" #include "auxlib.h"
@ -29,7 +29,7 @@ Word lua_nconstant = 0;
static Long lua_maxconstant = 0; static Long lua_maxconstant = 0;
#define GARBAGE_BLOCK 50 #define GARBAGE_BLOCK 100
void luaI_initsymbol (void) void luaI_initsymbol (void)
@ -189,7 +189,7 @@ static void markall (void)
} }
static void lua_collectgarbage (void) long lua_collectgarbage (long limit)
{ {
long recovered = 0; long recovered = 0;
Hash *freetable; Hash *freetable;
@ -199,21 +199,22 @@ static void lua_collectgarbage (void)
freetable = luaI_hashcollector(&recovered); freetable = luaI_hashcollector(&recovered);
freestr = luaI_strcollector(&recovered); freestr = luaI_strcollector(&recovered);
freefunc = luaI_funccollector(&recovered); freefunc = luaI_funccollector(&recovered);
gc_block = 2*(gc_block-recovered);
gc_nentity -= recovered; gc_nentity -= recovered;
gc_block = (limit == 0) ? 2*(gc_block-recovered) : gc_nentity+limit;
luaI_hashcallIM(freetable); luaI_hashcallIM(freetable);
luaI_strcallIM(freestr); luaI_strcallIM(freestr);
call_nilIM(); call_nilIM();
luaI_hashfree(freetable); luaI_hashfree(freetable);
luaI_strfree(freestr); luaI_strfree(freestr);
luaI_funcfree(freefunc); luaI_funcfree(freefunc);
return recovered;
} }
void lua_pack (void) void lua_pack (void)
{ {
if (gc_nentity++ >= gc_block) if (++gc_nentity >= gc_block)
lua_collectgarbage(); lua_collectgarbage(0);
} }