diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2013-09-11 11:09:55 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2013-09-11 11:09:55 -0300 |
commit | dd373a8f665e5e22ad3ad75401aa9fe3bbb2afc8 (patch) | |
tree | d475246f43edc6de6e1ebf491b274e9d9a5c1c24 /ltests.c | |
parent | 7061fe1d56f40e9d22a226423079da808fb41f66 (diff) | |
download | lua-dd373a8f665e5e22ad3ad75401aa9fe3bbb2afc8.tar.gz lua-dd373a8f665e5e22ad3ad75401aa9fe3bbb2afc8.tar.bz2 lua-dd373a8f665e5e22ad3ad75401aa9fe3bbb2afc8.zip |
threads are kept in a separated GC list, linked after the main thread
Diffstat (limited to 'ltests.c')
-rw-r--r-- | ltests.c | 19 |
1 files changed, 12 insertions, 7 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: ltests.c,v 2.156 2013/09/11 12:26:14 roberto Exp roberto $ | 2 | ** $Id: ltests.c,v 2.157 2013/09/11 12:47:48 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 | */ |
@@ -423,7 +423,6 @@ int lua_checkmemory (lua_State *L) { | |||
423 | global_State *g = G(L); | 423 | global_State *g = G(L); |
424 | GCObject *o; | 424 | GCObject *o; |
425 | int maybedead; | 425 | int maybedead; |
426 | int isthread; | ||
427 | if (keepinvariant(g)) { | 426 | if (keepinvariant(g)) { |
428 | lua_assert(!iswhite(obj2gco(g->mainthread))); | 427 | lua_assert(!iswhite(obj2gco(g->mainthread))); |
429 | lua_assert(!iswhite(gcvalue(&g->l_registry))); | 428 | lua_assert(!iswhite(gcvalue(&g->l_registry))); |
@@ -443,14 +442,20 @@ int lua_checkmemory (lua_State *L) { | |||
443 | /* check 'allgc' list */ | 442 | /* check 'allgc' list */ |
444 | checkgray(g, g->allgc); | 443 | checkgray(g, g->allgc); |
445 | maybedead = (GCSatomic < g->gcstate && g->gcstate <= GCSsweepall); | 444 | maybedead = (GCSatomic < g->gcstate && g->gcstate <= GCSsweepall); |
446 | isthread = 0; /* not traversing threads (yet) */ | ||
447 | for (o = g->allgc; o != NULL; o = gch(o)->next) { | 445 | for (o = g->allgc; o != NULL; o = gch(o)->next) { |
448 | if (gch(o)->tt == LUA_TTHREAD) isthread = 1; /* now travesing threads... */ | ||
449 | else lua_assert(!isthread); /* ... and only threads */ | ||
450 | checkobject(g, o, maybedead); | 446 | checkobject(g, o, maybedead); |
451 | lua_assert(!tofinalize(o) && testbit(o->gch.marked, LOCALMARK)); | 447 | lua_assert(!tofinalize(o) && testbit(o->gch.marked, LOCALMARK)); |
452 | lua_assert(testbit(o->gch.marked, NOLOCALBIT)); | 448 | lua_assert(testbit(o->gch.marked, NOLOCALBIT)); |
453 | } | 449 | } |
450 | /* check thread list */ | ||
451 | checkgray(g, obj2gco(g->mainthread)); | ||
452 | maybedead = (GCSatomic < g->gcstate && g->gcstate <= GCSsweepthreads); | ||
453 | for (o = obj2gco(g->mainthread); o != NULL; o = gch(o)->next) { | ||
454 | checkobject(g, o, maybedead); | ||
455 | lua_assert(!tofinalize(o) && testbit(o->gch.marked, LOCALMARK)); | ||
456 | lua_assert(testbit(o->gch.marked, NOLOCALBIT)); | ||
457 | lua_assert(gch(o)->tt == LUA_TTHREAD); | ||
458 | } | ||
454 | /* check 'localfin' list */ | 459 | /* check 'localfin' list */ |
455 | checkgray(g, g->localfin); | 460 | checkgray(g, g->localfin); |
456 | for (o = g->localfin; o != NULL; o = gch(o)->next) { | 461 | for (o = g->localfin; o != NULL; o = gch(o)->next) { |
@@ -650,8 +655,8 @@ static int gc_local (lua_State *L) { | |||
650 | 655 | ||
651 | static int gc_state (lua_State *L) { | 656 | static int gc_state (lua_State *L) { |
652 | static const char *statenames[] = {"propagate", "atomic", | 657 | static const char *statenames[] = {"propagate", "atomic", |
653 | "sweeplocal", "sweeplocfin", "sweepfin", "sweepall", "sweeptobefnz", | 658 | "sweeplocal", "sweeplocfin", "sweepfin", "sweepall", |
654 | "sweepmainth", "pause", ""}; | 659 | "sweeptobefnz", "sweepthreads", "sweepend", "pause", ""}; |
655 | int option = luaL_checkoption(L, 1, "", statenames); | 660 | int option = luaL_checkoption(L, 1, "", statenames); |
656 | if (option == GCSpause + 1) { | 661 | if (option == GCSpause + 1) { |
657 | lua_pushstring(L, statenames[G(L)->gcstate]); | 662 | lua_pushstring(L, statenames[G(L)->gcstate]); |