| 6525 | |
| 6526 | |
| 6527 | static void atomic (lua_State *L) { |
| 6528 | global_State *g = G(L); |
| 6529 | size_t udsize; /* total size of userdata to be finalized */ |
| 6530 | /* remark occasional upvalues of (maybe) dead threads */ |
| 6531 | remarkupvals(g); |
| 6532 | /* traverse objects cautch by write barrier and by 'remarkupvals' */ |
| 6533 | propagateall(g); |
| 6534 | /* remark weak tables */ |
| 6535 | g->gray = g->weak; |
| 6536 | g->weak = NULL; |
| 6537 | lua_assert(!iswhite(obj2gco(g->mainthread))); |
| 6538 | markobject(g, L); /* mark running thread */ |
| 6539 | markmt(g); /* mark basic metatables (again) */ |
| 6540 | propagateall(g); |
| 6541 | /* remark gray again */ |
| 6542 | g->gray = g->grayagain; |
| 6543 | g->grayagain = NULL; |
| 6544 | propagateall(g); |
| 6545 | udsize = luaC_separateudata(L, 0); /* separate userdata to be finalized */ |
| 6546 | marktmu(g); /* mark `preserved' userdata */ |
| 6547 | udsize += propagateall(g); /* remark, to propagate `preserveness' */ |
| 6548 | cleartable(g->weak); /* remove collected objects from weak tables */ |
| 6549 | /* flip current white */ |
| 6550 | g->currentwhite = cast_byte(otherwhite(g)); |
| 6551 | g->sweepstrgc = 0; |
| 6552 | g->sweepgc = &g->rootgc; |
| 6553 | g->gcstate = GCSsweepstring; |
| 6554 | g->estimate = g->totalbytes - udsize; /* first estimate */ |
| 6555 | } |
| 6556 | |
| 6557 | |
| 6558 | static l_mem singlestep (lua_State *L) { |
no test coverage detected