| 523 | |
| 524 | |
| 525 | static void atomic (lua_State *L) { |
| 526 | global_State *g = G(L); |
| 527 | size_t udsize; /* total size of userdata to be finalized */ |
| 528 | /* remark occasional upvalues of (maybe) dead threads */ |
| 529 | remarkupvals(g); |
| 530 | /* traverse objects cautch by write barrier and by 'remarkupvals' */ |
| 531 | propagateall(g); |
| 532 | /* remark weak tables */ |
| 533 | g->gray = g->weak; |
| 534 | g->weak = NULL; |
| 535 | lua_assert(!iswhite(obj2gco(g->mainthread))); |
| 536 | markobject(g, L); /* mark running thread */ |
| 537 | markmt(g); /* mark basic metatables (again) */ |
| 538 | propagateall(g); |
| 539 | /* remark gray again */ |
| 540 | g->gray = g->grayagain; |
| 541 | g->grayagain = NULL; |
| 542 | propagateall(g); |
| 543 | udsize = luaC_separateudata(L, 0); /* separate userdata to be finalized */ |
| 544 | marktmu(g); /* mark `preserved' userdata */ |
| 545 | udsize += propagateall(g); /* remark, to propagate `preserveness' */ |
| 546 | cleartable(g->weak); /* remove collected objects from weak tables */ |
| 547 | /* flip current white */ |
| 548 | g->currentwhite = cast_byte(otherwhite(g)); |
| 549 | g->sweepstrgc = 0; |
| 550 | g->sweepgc = &g->rootgc; |
| 551 | g->gcstate = GCSsweepstring; |
| 552 | g->estimate = g->totalbytes - udsize; /* first estimate */ |
| 553 | } |
| 554 | |
| 555 | |
| 556 | static l_mem singlestep (lua_State *L) { |
no test coverage detected