aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2013-09-04 12:34:24 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2013-09-04 12:34:24 -0300
commit0ad15fc10041f59b5466fe902637b1a2fb64565d (patch)
tree89da5de9bfc3af18402ead7fa94fd6f784bc6e8e
parentaeff4f79fa10caef29617652aa49b77055f4045e (diff)
downloadlua-0ad15fc10041f59b5466fe902637b1a2fb64565d.tar.gz
lua-0ad15fc10041f59b5466fe902637b1a2fb64565d.tar.bz2
lua-0ad15fc10041f59b5466fe902637b1a2fb64565d.zip
better (and correct!) control of 'maybedead'
-rw-r--r--ltests.c39
1 files changed, 19 insertions, 20 deletions
diff --git a/ltests.c b/ltests.c
index a8890328..9edeb515 100644
--- a/ltests.c
+++ b/ltests.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ltests.c,v 2.152 2013/08/30 19:14:26 roberto Exp roberto $ 2** $Id: ltests.c,v 2.153 2013/09/03 15:37:10 roberto Exp roberto $
3** Internal Module for Debugging of the Lua Implementation 3** Internal Module for Debugging of the Lua Implementation
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -335,7 +335,7 @@ static void checkstack (global_State *g, lua_State *L1) {
335 335
336static void checkobject (global_State *g, GCObject *o, int maybedead) { 336static void checkobject (global_State *g, GCObject *o, int maybedead) {
337 if (isdead(g, o)) 337 if (isdead(g, o))
338 lua_assert(maybedead && issweepphase(g)); 338 lua_assert(maybedead);
339 else { 339 else {
340 lua_assert(g->gcstate != GCSpause || iswhite(o)); 340 lua_assert(g->gcstate != GCSpause || iswhite(o));
341 lua_assert(!islocal(o) || !testbit(gch(o)->marked, LOCALMARK)); 341 lua_assert(!islocal(o) || !testbit(gch(o)->marked, LOCALMARK));
@@ -431,20 +431,32 @@ int lua_checkmemory (lua_State *L) {
431 lua_assert(!isdead(g, gcvalue(&g->l_registry))); 431 lua_assert(!isdead(g, gcvalue(&g->l_registry)));
432 checkstack(g, g->mainthread); 432 checkstack(g, g->mainthread);
433 resetbit(g->mainthread->marked, TESTGRAYBIT); 433 resetbit(g->mainthread->marked, TESTGRAYBIT);
434 /* check 'allgc' list */ 434 lua_assert(g->sweepgc == NULL || issweepphase(g));
435 markgrays(g); 435 markgrays(g);
436 /* check 'localgc' list */
437 checkgray(g, g->localgc);
438 maybedead = (GCSatomic < g->gcstate && g->gcstate <= GCSsweeplocal);
439 for (o = g->localgc; o != NULL; o = gch(o)->next) {
440 checkobject(g, o, maybedead);
441 lua_assert(!tofinalize(o) && !testbit(o->gch.marked, LOCALMARK));
442 }
443 /* check 'allgc' list */
436 checkgray(g, g->allgc); 444 checkgray(g, g->allgc);
437 lua_assert(g->sweepgc == NULL || issweepphase(g)); 445 maybedead = (GCSatomic < g->gcstate && g->gcstate <= GCSsweepall);
438 maybedead = 0;
439 isthread = 0; /* not traversing threads (yet) */ 446 isthread = 0; /* not traversing threads (yet) */
440 for (o = g->allgc; o != NULL; o = gch(o)->next) { 447 for (o = g->allgc; o != NULL; o = gch(o)->next) {
441 if (g->sweepgc && o == *g->sweepgc)
442 maybedead = 1; /* part of the list not yet swept */
443 if (gch(o)->tt == LUA_TTHREAD) isthread = 1; /* now travesing threads... */ 448 if (gch(o)->tt == LUA_TTHREAD) isthread = 1; /* now travesing threads... */
444 else lua_assert(!isthread); /* ... and only threads */ 449 else lua_assert(!isthread); /* ... and only threads */
445 checkobject(g, o, maybedead); 450 checkobject(g, o, maybedead);
446 lua_assert(!tofinalize(o) && testbit(o->gch.marked, LOCALMARK)); 451 lua_assert(!tofinalize(o) && testbit(o->gch.marked, LOCALMARK));
447 } 452 }
453 /* check 'localfin' list */
454 checkgray(g, g->localfin);
455 for (o = g->localfin; o != NULL; o = gch(o)->next) {
456 checkobject(g, o, 0);
457 lua_assert(tofinalize(o) && !testbit(o->gch.marked, LOCALMARK));
458 lua_assert(gch(o)->tt == LUA_TUSERDATA || gch(o)->tt == LUA_TTABLE);
459 }
448 /* check 'finobj' list */ 460 /* check 'finobj' list */
449 checkgray(g, g->finobj); 461 checkgray(g, g->finobj);
450 for (o = g->finobj; o != NULL; o = gch(o)->next) { 462 for (o = g->finobj; o != NULL; o = gch(o)->next) {
@@ -460,19 +472,6 @@ int lua_checkmemory (lua_State *L) {
460 lua_assert(!isdead(g, o) && tofinalize(o)); 472 lua_assert(!isdead(g, o) && tofinalize(o));
461 lua_assert(gch(o)->tt == LUA_TUSERDATA || gch(o)->tt == LUA_TTABLE); 473 lua_assert(gch(o)->tt == LUA_TUSERDATA || gch(o)->tt == LUA_TTABLE);
462 } 474 }
463 /* check 'localgc' list */
464 checkgray(g, g->localgc);
465 for (o = g->localgc; o != NULL; o = gch(o)->next) {
466 checkobject(g, o, 1);
467 lua_assert(!tofinalize(o) && !testbit(o->gch.marked, LOCALMARK));
468 }
469 /* check 'localfin' list */
470 checkgray(g, g->localfin);
471 for (o = g->localfin; o != NULL; o = gch(o)->next) {
472 checkobject(g, o, 0);
473 lua_assert(tofinalize(o) && !testbit(o->gch.marked, LOCALMARK));
474 lua_assert(gch(o)->tt == LUA_TUSERDATA || gch(o)->tt == LUA_TTABLE);
475 }
476 return 0; 475 return 0;
477} 476}
478 477