diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2001-04-17 14:35:54 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2001-04-17 14:35:54 -0300 |
commit | beee01b170c5fea9ed4527b28b9221d2df1baaba (patch) | |
tree | 82263b6e128ffe09fe3da63de16c626522320dfc /lgc.c | |
parent | 6473f965ca699719b3b9908008f15da48cc2e6f1 (diff) | |
download | lua-beee01b170c5fea9ed4527b28b9221d2df1baaba.tar.gz lua-beee01b170c5fea9ed4527b28b9221d2df1baaba.tar.bz2 lua-beee01b170c5fea9ed4527b28b9221d2df1baaba.zip |
re-implementation of refs through weak tables
Diffstat (limited to 'lgc.c')
-rw-r--r-- | lgc.c | 35 |
1 files changed, 3 insertions, 32 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lgc.c,v 1.95 2001/03/26 14:31:49 roberto Exp roberto $ | 2 | ** $Id: lgc.c,v 1.96 2001/04/11 14:42:41 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 | */ |
@@ -111,15 +111,6 @@ static void markstacks (lua_State *L, GCState *st) { | |||
111 | } | 111 | } |
112 | 112 | ||
113 | 113 | ||
114 | static void marklock (global_State *G, GCState *st) { | ||
115 | int i; | ||
116 | for (i=0; i<G->nref; i++) { | ||
117 | if (G->refArray[i].st == LOCK) | ||
118 | markobject(st, &G->refArray[i].o); | ||
119 | } | ||
120 | } | ||
121 | |||
122 | |||
123 | static void marktagmethods (global_State *G, GCState *st) { | 114 | static void marktagmethods (global_State *G, GCState *st) { |
124 | int t; | 115 | int t; |
125 | for (t=0; t<G->ntag; t++) { | 116 | for (t=0; t<G->ntag; t++) { |
@@ -176,8 +167,9 @@ static void markall (lua_State *L) { | |||
176 | st.tmark = NULL; | 167 | st.tmark = NULL; |
177 | marktagmethods(G(L), &st); /* mark tag methods */ | 168 | marktagmethods(G(L), &st); /* mark tag methods */ |
178 | markstacks(L, &st); /* mark all stacks */ | 169 | markstacks(L, &st); /* mark all stacks */ |
179 | marklock(G(L), &st); /* mark locked objects */ | ||
180 | marktable(&st, G(L)->type2tag); | 170 | marktable(&st, G(L)->type2tag); |
171 | marktable(&st, G(L)->registry); | ||
172 | marktable(&st, G(L)->weakregistry); | ||
181 | for (;;) { /* mark tables and closures */ | 173 | for (;;) { /* mark tables and closures */ |
182 | if (st.cmark) { | 174 | if (st.cmark) { |
183 | Closure *f = st.cmark; /* get first closure from list */ | 175 | Closure *f = st.cmark; /* get first closure from list */ |
@@ -208,26 +200,6 @@ static int hasmark (const TObject *o) { | |||
208 | } | 200 | } |
209 | 201 | ||
210 | 202 | ||
211 | /* macro for internal debugging; check if a link of free refs is valid */ | ||
212 | #define VALIDLINK(L, st,n) (NONEXT <= (st) && (st) < (n)) | ||
213 | |||
214 | static void invalidaterefs (global_State *G) { | ||
215 | int n = G->nref; | ||
216 | int i; | ||
217 | for (i=0; i<n; i++) { | ||
218 | struct Ref *r = &G->refArray[i]; | ||
219 | if (r->st == HOLD && !hasmark(&r->o)) | ||
220 | r->st = COLLECTED; | ||
221 | lua_assert((r->st == LOCK && hasmark(&r->o)) || | ||
222 | (r->st == HOLD && hasmark(&r->o)) || | ||
223 | r->st == COLLECTED || | ||
224 | r->st == NONEXT || | ||
225 | (r->st < n && VALIDLINK(L, G->refArray[r->st].st, n))); | ||
226 | } | ||
227 | lua_assert(VALIDLINK(L, G->refFree, n)); | ||
228 | } | ||
229 | |||
230 | |||
231 | static void invalidatetable (Hash *h) { | 203 | static void invalidatetable (Hash *h) { |
232 | int i; | 204 | int i; |
233 | for (i=0; i<h->size; i++) { | 205 | for (i=0; i<h->size; i++) { |
@@ -408,7 +380,6 @@ void luaC_collect (lua_State *L, int all) { | |||
408 | 380 | ||
409 | void luaC_collectgarbage (lua_State *L) { | 381 | void luaC_collectgarbage (lua_State *L) { |
410 | markall(L); | 382 | markall(L); |
411 | invalidaterefs(G(L)); /* check unlocked references */ | ||
412 | invalidatetables(G(L)); | 383 | invalidatetables(G(L)); |
413 | luaC_collect(L, 0); | 384 | luaC_collect(L, 0); |
414 | checkMbuffer(L); | 385 | checkMbuffer(L); |