diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2001-06-12 15:43:13 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2001-06-12 15:43:13 -0300 |
| commit | 89e8303f4ea5f1041f3633db7948e7aef17b5226 (patch) | |
| tree | d3f6853fd3bc177c4ba728aa71051cd29ba57c89 /lgc.c | |
| parent | 89c301d180ef4ef3887fbf54fe2fd43a5c8d183a (diff) | |
| download | lua-89e8303f4ea5f1041f3633db7948e7aef17b5226.tar.gz lua-89e8303f4ea5f1041f3633db7948e7aef17b5226.tar.bz2 lua-89e8303f4ea5f1041f3633db7948e7aef17b5226.zip | |
more robust treatment of GC tag methods (now they can create new
objects while running...)
Diffstat (limited to 'lgc.c')
| -rw-r--r-- | lgc.c | 29 |
1 files changed, 7 insertions, 22 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lgc.c,v 1.101 2001/06/07 15:01:21 roberto Exp roberto $ | 2 | ** $Id: lgc.c,v 1.102 2001/06/08 19:01:38 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 | */ |
| @@ -18,18 +18,6 @@ | |||
| 18 | #include "ltm.h" | 18 | #include "ltm.h" |
| 19 | 19 | ||
| 20 | 20 | ||
| 21 | /* | ||
| 22 | ** optional lock for GC | ||
| 23 | ** (when Lua calls GC tag methods it unlocks the regular lock) | ||
| 24 | */ | ||
| 25 | #ifndef lua_lockgc | ||
| 26 | #define lua_lockgc(L) { | ||
| 27 | #endif | ||
| 28 | |||
| 29 | #ifndef lua_unlockgc | ||
| 30 | #define lua_unlockgc(L) } | ||
| 31 | #endif | ||
| 32 | |||
| 33 | 21 | ||
| 34 | typedef struct GCState { | 22 | typedef struct GCState { |
| 35 | Hash *tmark; /* list of marked tables to be visited */ | 23 | Hash *tmark; /* list of marked tables to be visited */ |
| @@ -281,7 +269,7 @@ static void collecttable (lua_State *L) { | |||
| 281 | } | 269 | } |
| 282 | 270 | ||
| 283 | 271 | ||
| 284 | static void collectudata (lua_State *L) { | 272 | void luaC_collectudata (lua_State *L) { |
| 285 | Udata **p = &G(L)->rootudata; | 273 | Udata **p = &G(L)->rootudata; |
| 286 | Udata *next; | 274 | Udata *next; |
| 287 | while ((next = *p) != NULL) { | 275 | while ((next = *p) != NULL) { |
| @@ -351,9 +339,8 @@ static void callgcTM (lua_State *L, const TObject *obj) { | |||
| 351 | } | 339 | } |
| 352 | 340 | ||
| 353 | 341 | ||
| 354 | static void callgcTMudata (lua_State *L) { | 342 | void luaC_callgcTMudata (lua_State *L) { |
| 355 | int tag; | 343 | int tag; |
| 356 | G(L)->GCthreshold = 2*G(L)->nblocks; /* avoid GC during tag methods */ | ||
| 357 | for (tag=G(L)->ntag-1; tag>=0; tag--) { /* for each tag (in reverse order) */ | 344 | for (tag=G(L)->ntag-1; tag>=0; tag--) { /* for each tag (in reverse order) */ |
| 358 | Udata *udata; | 345 | Udata *udata; |
| 359 | while ((udata = G(L)->TMtable[tag].collected) != NULL) { | 346 | while ((udata = G(L)->TMtable[tag].collected) != NULL) { |
| @@ -368,14 +355,14 @@ static void callgcTMudata (lua_State *L) { | |||
| 368 | 355 | ||
| 369 | 356 | ||
| 370 | void luaC_collect (lua_State *L, int all) { | 357 | void luaC_collect (lua_State *L, int all) { |
| 371 | lua_lockgc(L); | 358 | luaC_collectudata(L); |
| 372 | collectudata(L); | ||
| 373 | callgcTMudata(L); | ||
| 374 | collectstrings(L, all); | 359 | collectstrings(L, all); |
| 375 | collecttable(L); | 360 | collecttable(L); |
| 376 | collectproto(L); | 361 | collectproto(L); |
| 377 | collectclosure(L); | 362 | collectclosure(L); |
| 378 | lua_unlockgc(L); | 363 | checkMbuffer(L); |
| 364 | G(L)->GCthreshold = 2*G(L)->nblocks; /* set new threshold */ | ||
| 365 | luaC_callgcTMudata(L); | ||
| 379 | } | 366 | } |
| 380 | 367 | ||
| 381 | 368 | ||
| @@ -383,8 +370,6 @@ void luaC_collectgarbage (lua_State *L) { | |||
| 383 | markall(L); | 370 | markall(L); |
| 384 | invalidatetables(G(L)); | 371 | invalidatetables(G(L)); |
| 385 | luaC_collect(L, 0); | 372 | luaC_collect(L, 0); |
| 386 | checkMbuffer(L); | ||
| 387 | G(L)->GCthreshold = 2*G(L)->nblocks; /* set new threshold */ | ||
| 388 | callgcTM(L, &luaO_nilobject); | 373 | callgcTM(L, &luaO_nilobject); |
| 389 | } | 374 | } |
| 390 | 375 | ||
