summaryrefslogtreecommitdiff
path: root/lgc.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2000-08-28 14:57:04 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2000-08-28 14:57:04 -0300
commit9fdf73bc9a6b4c6afbfff1d8181fface6b1c6761 (patch)
treeda8d97d954e5ffabf9ff275df725f1e0a3a5b3e6 /lgc.c
parentf1fd9b5c2c21f24d25d7813f431a3495702ebea6 (diff)
downloadlua-9fdf73bc9a6b4c6afbfff1d8181fface6b1c6761.tar.gz
lua-9fdf73bc9a6b4c6afbfff1d8181fface6b1c6761.tar.bz2
lua-9fdf73bc9a6b4c6afbfff1d8181fface6b1c6761.zip
first version for new API
Diffstat (limited to 'lgc.c')
-rw-r--r--lgc.c42
1 files changed, 39 insertions, 3 deletions
diff --git a/lgc.c b/lgc.c
index 1e26ed51..f6768dd2 100644
--- a/lgc.c
+++ b/lgc.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lgc.c,v 1.62 2000/08/09 19:16:57 roberto Exp roberto $ 2** $Id: lgc.c,v 1.63 2000/08/22 17:44:17 roberto Exp roberto $
3** Garbage Collector 3** Garbage Collector
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -11,7 +11,6 @@
11#include "lgc.h" 11#include "lgc.h"
12#include "lmem.h" 12#include "lmem.h"
13#include "lobject.h" 13#include "lobject.h"
14#include "lref.h"
15#include "lstate.h" 14#include "lstate.h"
16#include "lstring.h" 15#include "lstring.h"
17#include "ltable.h" 16#include "ltable.h"
@@ -145,6 +144,43 @@ static void markall (lua_State *L) {
145} 144}
146 145
147 146
147static int hasmark (const TObject *o) {
148 /* valid only for locked objects */
149 switch (o->ttype) {
150 case TAG_STRING: case TAG_USERDATA:
151 return tsvalue(o)->marked;
152 case TAG_TABLE:
153 return ismarked(hvalue(o));
154 case TAG_LCLOSURE: case TAG_CCLOSURE:
155 return ismarked(clvalue(o)->mark);
156 default: /* number */
157 return 1;
158 }
159}
160
161
162/* macro for internal debugging; check if a link of free refs is valid */
163#define VALIDLINK(L, st,n) (NONEXT <= (st) && (st) < (n))
164
165static void invalidaterefs (lua_State *L) {
166 int n = L->refSize;
167 int i;
168 for (i=0; i<n; i++) {
169 struct Ref *r = &L->refArray[i];
170 if (r->st == HOLD && !hasmark(&r->o))
171 r->st = COLLECTED;
172 LUA_ASSERT((r->st == LOCK && hasmark(&r->o)) ||
173 (r->st == HOLD && hasmark(&r->o)) ||
174 r->st == COLLECTED ||
175 r->st == NONEXT ||
176 (r->st < n && VALIDLINK(L, L->refArray[r->st].st, n)),
177 "inconsistent ref table");
178 }
179 LUA_ASSERT(VALIDLINK(L, L->refFree, n), "inconsistent ref table");
180}
181
182
183
148static void collectproto (lua_State *L) { 184static void collectproto (lua_State *L) {
149 Proto **p = &L->rootproto; 185 Proto **p = &L->rootproto;
150 Proto *next; 186 Proto *next;
@@ -300,7 +336,7 @@ void luaC_collect (lua_State *L, int all) {
300long lua_collectgarbage (lua_State *L, long limit) { 336long lua_collectgarbage (lua_State *L, long limit) {
301 unsigned long recovered = L->nblocks; /* to subtract `nblocks' after gc */ 337 unsigned long recovered = L->nblocks; /* to subtract `nblocks' after gc */
302 markall(L); 338 markall(L);
303 luaR_invalidaterefs(L); 339 invalidaterefs(L);
304 luaC_collect(L, 0); 340 luaC_collect(L, 0);
305 recovered = recovered - L->nblocks; 341 recovered = recovered - L->nblocks;
306 L->GCthreshold = (limit == 0) ? 2*L->nblocks : L->nblocks+limit; 342 L->GCthreshold = (limit == 0) ? 2*L->nblocks : L->nblocks+limit;