diff --git a/hash.c b/hash.c index 37a02605..84368876 100644 --- a/hash.c +++ b/hash.c @@ -3,7 +3,7 @@ ** hash manager for lua */ -char *rcs_hash="$Id: hash.c,v 2.16 1994/11/14 18:41:15 roberto Exp roberto $"; +char *rcs_hash="$Id: hash.c,v 2.17 1994/11/16 17:38:08 roberto Exp roberto $"; #include "mem.h" #include "opcode.h" @@ -183,9 +183,10 @@ static void call_fallbacks (void) ** Garbage collection to arrays ** Delete all unmarked arrays. */ -void lua_hashcollector (void) +int lua_hashcollector (void) { Hash *curr_array = listhead, *prev = NULL; + int counter = 0; call_fallbacks(); while (curr_array != NULL) { @@ -195,7 +196,7 @@ void lua_hashcollector (void) if (prev == NULL) listhead = next; else prev->next = next; hashdelete(curr_array); - ++lua_recovered; + ++counter; } else { @@ -204,6 +205,7 @@ void lua_hashcollector (void) } curr_array = next; } + return counter; } @@ -215,10 +217,9 @@ void lua_hashcollector (void) */ Hash *lua_createarray (int nhash) { - Hash *array = hashcreate(nhash); - if (lua_nentity == lua_block) - lua_pack(); - lua_nentity++; + Hash *array; + lua_pack(); + array = hashcreate(nhash); array->next = listhead; listhead = array; return array; diff --git a/hash.h b/hash.h index ba94dd99..cfb0ee5c 100644 --- a/hash.h +++ b/hash.h @@ -2,7 +2,7 @@ ** hash.h ** hash manager for lua ** Luiz Henrique de Figueiredo - 17 Aug 90 -** $Id: hash.h,v 2.4 1994/09/08 16:51:49 celes Exp roberto $ +** $Id: hash.h,v 2.5 1994/11/14 18:41:15 roberto Exp roberto $ */ #ifndef hash_h @@ -27,7 +27,7 @@ typedef struct Hash int lua_equalObj (Object *t1, Object *t2); Hash *lua_createarray (int nhash); void lua_hashmark (Hash *h); -void lua_hashcollector (void); +int lua_hashcollector (void); Object *lua_hashget (Hash *t, Object *ref); Object *lua_hashdefine (Hash *t, Object *ref); void lua_next (void); diff --git a/opcode.c b/opcode.c index b6955aee..1451894e 100644 --- a/opcode.c +++ b/opcode.c @@ -3,7 +3,7 @@ ** TecCGraf - PUC-Rio */ -char *rcs_opcode="$Id: opcode.c,v 3.12 1994/11/16 16:03:48 roberto Exp roberto $"; +char *rcs_opcode="$Id: opcode.c,v 3.13 1994/11/16 17:38:08 roberto Exp $"; #include #include @@ -454,8 +454,8 @@ int lua_storesubscript (void) lua_Object lua_createTable (int initSize) { adjustC(0); - tag(top) = LUA_T_ARRAY; avalue(top) = lua_createarray(initSize); + tag(top) = LUA_T_ARRAY; top++; CBase++; /* incorporate object in the stack */ return Ref(top-1); @@ -585,8 +585,9 @@ int lua_pushnumber (real n) int lua_pushstring (char *s) { lua_checkstack(top-stack+1); + svalue(top) = lua_createstring(s); tag(top) = LUA_T_STRING; - svalue(top++) = lua_createstring(s); + top++; return 0; } @@ -843,8 +844,8 @@ static int lua_execute (Byte *pc, int base) { CodeWord size; get_word(size,pc); - tag(top) = LUA_T_ARRAY; avalue(top) = lua_createarray(size.w); + tag(top) = LUA_T_ARRAY; top++; } break; diff --git a/table.c b/table.c index e52fcd4a..ab5fd5e8 100644 --- a/table.c +++ b/table.c @@ -3,7 +3,7 @@ ** Module to control static tables */ -char *rcs_table="$Id: table.c,v 2.18 1994/11/16 16:03:48 roberto Exp roberto $"; +char *rcs_table="$Id: table.c,v 2.19 1994/11/16 17:39:16 roberto Exp $"; #include @@ -33,12 +33,8 @@ static Long lua_maxconstant = 0; char *lua_file[MAXFILE]; int lua_nfile; -/* Variables to controll garbage collection */ #define GARBAGE_BLOCK 256 -Word lua_block=GARBAGE_BLOCK; /* when garbage collector will be called */ -Word lua_nentity; /* counter of new entities (strings and arrays) */ -Word lua_recovered; /* counter of recovered entities (strings and arrays) */ - +#define MIN_GARBAGE_BLOCK 10 static void lua_nextvar (void); @@ -168,22 +164,18 @@ void lua_markobject (Object *o) */ void lua_pack (void) { - /* mark stack objects */ - lua_travstack(lua_markobject); - - /* mark symbol table objects */ - lua_travsymbol(lua_markobject); - - /* mark locked objects */ - luaI_travlock(lua_markobject); - - lua_recovered=0; - - lua_strcollector(); - lua_hashcollector(); - - lua_nentity = 0; /* reset counter */ - lua_block=2*lua_block-3*lua_recovered/2U; /* adapt block size */ + static int block = GARBAGE_BLOCK; /* when garbage collector will be called */ + static int nentity = 0; /* counter of new entities (strings and arrays) */ + int recovered = 0; + if (nentity++ < block) return; + lua_travstack(lua_markobject); /* mark stack objects */ + lua_travsymbol(lua_markobject); /* mark symbol table objects */ + luaI_travlock(lua_markobject); /* mark locked objects */ + recovered += lua_strcollector(); + recovered += lua_hashcollector(); + nentity = 0; /* reset counter */ + block=2*block-3*recovered/2; /* adapt block size */ + if (block < MIN_GARBAGE_BLOCK) block = MIN_GARBAGE_BLOCK; } diff --git a/table.h b/table.h index 1433814d..1cc3fcca 100644 --- a/table.h +++ b/table.h @@ -1,7 +1,7 @@ /* ** Module to control static tables ** TeCGraf - PUC-Rio -** $Id: table.h,v 2.5 1994/11/14 21:40:14 roberto Exp roberto $ +** $Id: table.h,v 2.6 1994/11/16 16:03:48 roberto Exp roberto $ */ #ifndef table_h @@ -15,10 +15,6 @@ extern char **lua_constant; extern char *lua_file[]; extern int lua_nfile; -extern Word lua_block; -extern Word lua_nentity; -extern Word lua_recovered; - void lua_initconstant (void); int luaI_findsymbolbyname (char *name); diff --git a/tree.c b/tree.c index e58a7dca..58f25de4 100644 --- a/tree.c +++ b/tree.c @@ -3,7 +3,7 @@ ** TecCGraf - PUC-Rio */ -char *rcs_tree="$Id: tree.c,v 1.6 1994/11/16 17:38:08 roberto Exp roberto $"; +char *rcs_tree="$Id: tree.c,v 1.7 1994/11/16 18:09:11 roberto Exp roberto $"; #include @@ -55,14 +55,13 @@ static TreeNode *tree_create (TreeNode **node, char *str) char *lua_strcreate (char *str) { - StringNode *newString = (StringNode *)luaI_malloc(sizeof(StringNode)+ - strlen(str)); + StringNode *newString; + lua_pack(); + newString = (StringNode *)luaI_malloc(sizeof(StringNode)+strlen(str)); newString->mark = UNMARKED_STRING; strcpy(newString->str, str); newString->next = string_root; string_root = newString; - if (lua_nentity == lua_block) lua_pack (); - lua_nentity++; return newString->str; } @@ -77,9 +76,10 @@ TreeNode *lua_constcreate (char *str) ** Garbage collection function. ** This function traverse the string list freeing unindexed strings */ -void lua_strcollector (void) +int lua_strcollector (void) { StringNode *curr = string_root, *prev = NULL; + int counter = 0; while (curr) { StringNode *next = curr->next; @@ -88,7 +88,7 @@ void lua_strcollector (void) if (prev == NULL) string_root = next; else prev->next = next; luaI_free(curr); - ++lua_recovered; + ++counter; } else { @@ -97,6 +97,7 @@ void lua_strcollector (void) } curr = next; } + return counter; } /* diff --git a/tree.h b/tree.h index 7587f4ec..aa7a44c4 100644 --- a/tree.h +++ b/tree.h @@ -1,7 +1,7 @@ /* ** tree.h ** TecCGraf - PUC-Rio -** $Id: tree.h,v 1.2 1994/11/14 21:40:14 roberto Exp roberto $ +** $Id: tree.h,v 1.3 1994/11/16 16:03:48 roberto Exp roberto $ */ #ifndef tree_h @@ -30,7 +30,7 @@ typedef struct TreeNode char *lua_strcreate (char *str); TreeNode *lua_constcreate (char *str); -void lua_strcollector (void); +int lua_strcollector (void); TreeNode *lua_varnext (char *n); #endif