|
@@ -1,5 +1,5 @@
|
|
|
/*
|
|
|
-** $Id: lgc.c,v 1.1 1997/09/16 19:25:59 roberto Exp roberto $
|
|
|
+** $Id: lgc.c,v 1.2 1997/09/26 15:02:26 roberto Exp roberto $
|
|
|
** Garbage Collector
|
|
|
** See Copyright Notice in lua.h
|
|
|
*/
|
|
@@ -137,31 +137,25 @@ static void strcallIM (TaggedString *l)
|
|
|
|
|
|
|
|
|
|
|
|
-static GCnode *listcollect (GCnode **root)
|
|
|
+static GCnode *listcollect (GCnode *l)
|
|
|
{
|
|
|
- GCnode *curr = *root, *prev = NULL, *frees = NULL;
|
|
|
- while (curr) {
|
|
|
- GCnode *next = curr->next;
|
|
|
- if (!curr->marked) {
|
|
|
- if (prev == NULL)
|
|
|
- *root = next;
|
|
|
- else
|
|
|
- prev->next = next;
|
|
|
- curr->next = frees;
|
|
|
- frees = curr;
|
|
|
+ GCnode *frees = NULL;
|
|
|
+ while (l) {
|
|
|
+ GCnode *next = l->next;
|
|
|
+ l->marked = 0;
|
|
|
+ while (next && !next->marked) {
|
|
|
+ l->next = next->next;
|
|
|
+ next->next = frees;
|
|
|
+ frees = next;
|
|
|
+ next = l->next;
|
|
|
--luaO_nentities;
|
|
|
}
|
|
|
- else {
|
|
|
- curr->marked = 0;
|
|
|
- prev = curr;
|
|
|
- }
|
|
|
- curr = next;
|
|
|
+ l = next;
|
|
|
}
|
|
|
return frees;
|
|
|
}
|
|
|
|
|
|
|
|
|
-
|
|
|
static void strmark (TaggedString *s)
|
|
|
{
|
|
|
if (!s->head.marked)
|
|
@@ -280,9 +274,9 @@ long lua_collectgarbage (long limit)
|
|
|
markall();
|
|
|
invalidaterefs();
|
|
|
freestr = luaS_collector();
|
|
|
- freetable = (Hash *)listcollect((GCnode **)&luaH_root);
|
|
|
- freefunc = (TProtoFunc *)listcollect((GCnode **)&luaF_root);
|
|
|
- freeclos = (Closure *)listcollect((GCnode **)&luaF_rootcl);
|
|
|
+ freetable = (Hash *)listcollect(&luaH_root);
|
|
|
+ freefunc = (TProtoFunc *)listcollect(&luaF_root);
|
|
|
+ freeclos = (Closure *)listcollect(&luaF_rootcl);
|
|
|
recovered = recovered-luaO_nentities;
|
|
|
/*printf("==total %ld coletados %ld\n", luaO_nentities+recovered, recovered);*/
|
|
|
luaC_threshold = (limit == 0) ? 2*luaO_nentities : luaO_nentities+limit;
|