diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2000-08-28 14:57:04 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2000-08-28 14:57:04 -0300 |
commit | 9fdf73bc9a6b4c6afbfff1d8181fface6b1c6761 (patch) | |
tree | da8d97d954e5ffabf9ff275df725f1e0a3a5b3e6 /lgc.c | |
parent | f1fd9b5c2c21f24d25d7813f431a3495702ebea6 (diff) | |
download | lua-9fdf73bc9a6b4c6afbfff1d8181fface6b1c6761.tar.gz lua-9fdf73bc9a6b4c6afbfff1d8181fface6b1c6761.tar.bz2 lua-9fdf73bc9a6b4c6afbfff1d8181fface6b1c6761.zip |
first version for new API
Diffstat (limited to 'lgc.c')
-rw-r--r-- | lgc.c | 42 |
1 files changed, 39 insertions, 3 deletions
@@ -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 | ||
147 | static 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 | |||
165 | static 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 | |||
148 | static void collectproto (lua_State *L) { | 184 | static 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) { | |||
300 | long lua_collectgarbage (lua_State *L, long limit) { | 336 | long 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; |