From 3393fd7f257397199c6ecd143f956a19ee4a0cf7 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Mon, 1 Dec 1997 18:31:25 -0200 Subject: first version of "lua_close" --- lgc.c | 10 +++++----- lgc.h | 4 +++- lstate.c | 28 +++++++++++++++++++++++++++- lstring.c | 40 +++++++++++++++++++++++++++++++++++++++- lstring.h | 5 ++++- lua.c | 6 ++++-- lua.h | 3 ++- 7 files changed, 84 insertions(+), 12 deletions(-) diff --git a/lgc.c b/lgc.c index fd7a6bcb..203e9d93 100644 --- a/lgc.c +++ b/lgc.c @@ -1,5 +1,5 @@ /* -** $Id: lgc.c,v 1.8 1997/11/19 17:29:23 roberto Exp roberto $ +** $Id: lgc.c,v 1.9 1997/11/27 15:59:25 roberto Exp roberto $ ** Garbage Collector ** See Copyright Notice in lua.h */ @@ -108,7 +108,7 @@ static void invalidaterefs (void) -static void hashcallIM (Hash *l) +void luaC_hashcallIM (Hash *l) { TObject t; ttype(&t) = LUA_T_ARRAY; @@ -119,7 +119,7 @@ static void hashcallIM (Hash *l) } -static void strcallIM (TaggedString *l) +void luaC_strcallIM (TaggedString *l) { TObject o; ttype(&o) = LUA_T_USERDATA; @@ -259,8 +259,8 @@ long lua_collectgarbage (long limit) freefunc = (TProtoFunc *)listcollect(&(L->rootproto)); freeclos = (Closure *)listcollect(&(L->rootcl)); L->GCthreshold *= 4; /* to avoid GC during GC */ - hashcallIM(freetable); /* GC tag methods for tables */ - strcallIM(freestr); /* GC tag methods for userdata */ + luaC_hashcallIM(freetable); /* GC tag methods for tables */ + luaC_strcallIM(freestr); /* GC tag methods for userdata */ luaD_gcIM(&luaO_nilobject); /* GC tag method for nil (signal end of GC) */ luaH_free(freetable); luaS_free(freestr); diff --git a/lgc.h b/lgc.h index a7a9a77a..60a0b1ec 100644 --- a/lgc.h +++ b/lgc.h @@ -1,5 +1,5 @@ /* -** $Id: lgc.h,v 1.2 1997/10/23 16:26:37 roberto Exp roberto $ +** $Id: lgc.h,v 1.3 1997/11/19 17:29:23 roberto Exp roberto $ ** Garbage Collector ** See Copyright Notice in lua.h */ @@ -14,6 +14,8 @@ void luaC_checkGC (void); TObject* luaC_getref (int ref); int luaC_ref (TObject *o, int lock); +void luaC_hashcallIM (Hash *l); +void luaC_strcallIM (TaggedString *l); #endif diff --git a/lstate.c b/lstate.c index 69100ba3..9fd27212 100644 --- a/lstate.c +++ b/lstate.c @@ -1,5 +1,5 @@ /* -** $Id: lstate.c,v 1.1 1997/11/19 17:31:19 roberto Exp roberto $ +** $Id: lstate.c,v 1.2 1997/11/27 15:59:25 roberto Exp roberto $ ** Global State ** See Copyright Notice in lua.h */ @@ -7,6 +7,8 @@ #include "lbuiltin.h" #include "ldo.h" +#include "lfunc.h" +#include "lgc.h" #include "llex.h" #include "lmem.h" #include "lstate.h" @@ -48,3 +50,27 @@ void lua_open (void) luaB_predefine(); } + +void lua_close (void) +{ + TaggedString *alludata = luaS_collectudata(); + L->GCthreshold = MAX_INT; /* to avoid GC during GC */ + luaC_hashcallIM((Hash *)L->roottable.next); /* GC t.methods for tables */ + luaC_strcallIM(alludata); /* GC tag methods for userdata */ + luaD_gcIM(&luaO_nilobject); /* GC tag method for nil (signal end of GC) */ + luaH_free((Hash *)L->roottable.next); + luaF_freeproto((TProtoFunc *)L->rootproto.next); + luaF_freeclosure((Closure *)L->rootcl.next); + luaS_free(alludata); + luaS_freeall(); + luaM_free(L->stack.stack); + luaM_free(L->IMtable); + luaM_free(L->refArray); + luaM_free(L->Mbuffer); + luaM_free(L); + L = NULL; +#if DEBUG + printf("total de blocos: %ld\n", numblocks); + printf("total de memoria: %ld\n", totalmem); +#endif +} diff --git a/lstring.c b/lstring.c index b4e435df..6f3ba519 100644 --- a/lstring.c +++ b/lstring.c @@ -1,5 +1,5 @@ /* -** $Id: lstring.c,v 1.5 1997/11/19 17:29:23 roberto Exp roberto $ +** $Id: lstring.c,v 1.6 1997/11/21 19:00:46 roberto Exp roberto $ ** String table (keep all strings handled by Lua) ** See Copyright Notice in lua.h */ @@ -195,6 +195,44 @@ TaggedString *luaS_collector (void) } +TaggedString *luaS_collectudata (void) +{ + TaggedString *frees = NULL; + int i; + L->rootglobal.next = NULL; /* empty list of globals */ + for (i=0; istring_root[i]; + int j; + for (j=0; jsize; j++) { + TaggedString *t = tb->hash[j]; + if (t == NULL || t == &EMPTY || t->constindex != -1) + continue; /* get only user datas */ + t->head.next = (GCnode *)frees; + frees = t; + tb->hash[j] = ∅ + } + } + return frees; +} + + +void luaS_freeall (void) +{ + int i; + for (i=0; istring_root[i]; + int j; + for (j=0; jsize; j++) { + TaggedString *t = tb->hash[j]; + if (t == &EMPTY) continue; + luaM_free(t); + } + luaM_free(tb->hash); + } + luaM_free(L->string_root); +} + + void luaS_rawsetglobal (TaggedString *ts, TObject *newval) { ts->u.globalval = *newval; diff --git a/lstring.h b/lstring.h index b2c421e2..5f8d01f4 100644 --- a/lstring.h +++ b/lstring.h @@ -1,5 +1,5 @@ /* -** $Id: lstring.h,v 1.4 1997/11/19 17:29:23 roberto Exp roberto $ +** $Id: lstring.h,v 1.5 1997/11/26 18:53:45 roberto Exp roberto $ ** String table (keep all strings handled by Lua) ** See Copyright Notice in lua.h */ @@ -20,5 +20,8 @@ TaggedString *luaS_newfixedstring (char *str); void luaS_rawsetglobal (TaggedString *ts, TObject *newval); char *luaS_travsymbol (int (*fn)(TObject *)); int luaS_globaldefined (char *name); +TaggedString *luaS_collectudata (void); +void luaS_freeall (void); + #endif diff --git a/lua.c b/lua.c index 2484d3bc..2ebfc951 100644 --- a/lua.c +++ b/lua.c @@ -1,5 +1,5 @@ /* -** $Id: lua.c,v 1.4 1997/11/19 17:29:23 roberto Exp roberto $ +** $Id: lua.c,v 1.5 1997/11/21 19:00:46 roberto Exp roberto $ ** Lua stand-alone interpreter ** See Copyright Notice in lua.h */ @@ -82,7 +82,9 @@ int main (int argc, char *argv[]) } } } -/* lua_close(); */ +#if DEBUG + lua_close(); +#endif return 0; } diff --git a/lua.h b/lua.h index 7d05b2e9..3cc871dc 100644 --- a/lua.h +++ b/lua.h @@ -1,5 +1,5 @@ /* -** $Id: lua.h,v 1.6 1997/11/27 15:59:25 roberto Exp roberto $ +** $Id: lua.h,v 1.7 1997/11/27 18:25:14 roberto Exp roberto $ ** Lua - An Extensible Extension Language ** TeCGraf: Grupo de Tecnologia em Computacao Grafica, PUC-Rio, Brazil ** e-mail: lua@tecgraf.puc-rio.br @@ -55,6 +55,7 @@ typedef unsigned int lua_Object; void lua_open (void); +void lua_close (void); lua_Object lua_settagmethod (int tag, char *event); /* In: new method */ lua_Object lua_gettagmethod (int tag, char *event); -- cgit v1.2.3-55-g6feb