Lines Matching refs:g

34 #define makewhite(g,x)	\  argument
35 ((x)->gch.marked = cast_byte(((x)->gch.marked & maskmarks) | luaC_white(g)))
52 #define markvalue(g,o) { checkconsistency(o); \ argument
53 if (iscollectable(o) && iswhite(gcvalue(o))) reallymarkobject(g,gcvalue(o)); }
55 #define markobject(g,t) { if (iswhite(obj2gco(t))) \ argument
56 reallymarkobject(g, obj2gco(t)); }
59 #define setthreshold(g) (g->GCthreshold = (g->estimate/100) * g->gcpause) argument
69 static void reallymarkobject (global_State *g, GCObject *o) { in reallymarkobject() argument
70 lua_assert(iswhite(o) && !isdead(g, o)); in reallymarkobject()
79 if (mt) markobject(g, mt); in reallymarkobject()
80 markobject(g, gco2u(o)->env); in reallymarkobject()
85 markvalue(g, uv->v); in reallymarkobject()
91 gco2cl(o)->c.gclist = g->gray; in reallymarkobject()
92 g->gray = o; in reallymarkobject()
96 gco2h(o)->gclist = g->gray; in reallymarkobject()
97 g->gray = o; in reallymarkobject()
101 gco2th(o)->gclist = g->gray; in reallymarkobject()
102 g->gray = o; in reallymarkobject()
106 gco2p(o)->gclist = g->gray; in reallymarkobject()
107 g->gray = o; in reallymarkobject()
115 static void marktmu (global_State *g) { in marktmu() argument
116 GCObject *u = g->tmudata; in marktmu()
120 makewhite(g, u); /* may be marked, if left from previous GC */ in marktmu()
121 reallymarkobject(g, u); in marktmu()
122 } while (u != g->tmudata); in marktmu()
129 global_State *g = G(L); in luaC_separateudata() local
131 GCObject **p = &g->mainthread->next; in luaC_separateudata()
145 if (g->tmudata == NULL) /* list is empty? */ in luaC_separateudata()
146 g->tmudata = curr->gch.next = curr; /* creates a circular list */ in luaC_separateudata()
148 curr->gch.next = g->tmudata->gch.next; in luaC_separateudata()
149 g->tmudata->gch.next = curr; in luaC_separateudata()
150 g->tmudata = curr; in luaC_separateudata()
158 static int traversetable (global_State *g, Table *h) { in traversetable() argument
164 markobject(g, h->metatable); in traversetable()
165 mode = gfasttm(g, h->metatable, TM_MODE); in traversetable()
173 h->gclist = g->weak; /* must be cleared after GC, ... */ in traversetable()
174 g->weak = obj2gco(h); /* ... so put in the appropriate list */ in traversetable()
181 markvalue(g, &h->array[i]); in traversetable()
191 if (!weakkey) markvalue(g, gkey(n)); in traversetable()
192 if (!weakvalue) markvalue(g, gval(n)); in traversetable()
203 static void traverseproto (global_State *g, Proto *f) { in traverseproto() argument
207 markvalue(g, &f->k[i]); in traverseproto()
214 markobject(g, f->p[i]); in traverseproto()
224 static void traverseclosure (global_State *g, Closure *cl) { in traverseclosure() argument
225 markobject(g, cl->c.env); in traverseclosure()
229 markvalue(g, &cl->c.upvalue[i]); in traverseclosure()
234 markobject(g, cl->l.p); in traverseclosure()
236 markobject(g, cl->l.upvals[i]); in traverseclosure()
256 static void traversestack (global_State *g, lua_State *l) { in traversestack() argument
259 markvalue(g, gt(l)); in traversestack()
266 markvalue(g, o); in traversestack()
277 static l_mem propagatemark (global_State *g) { in propagatemark() argument
278 GCObject *o = g->gray; in propagatemark()
284 g->gray = h->gclist; in propagatemark()
285 if (traversetable(g, h)) /* table is weak? */ in propagatemark()
292 g->gray = cl->c.gclist; in propagatemark()
293 traverseclosure(g, cl); in propagatemark()
299 g->gray = th->gclist; in propagatemark()
300 th->gclist = g->grayagain; in propagatemark()
301 g->grayagain = o; in propagatemark()
303 traversestack(g, th); in propagatemark()
309 g->gray = p->gclist; in propagatemark()
310 traverseproto(g, p); in propagatemark()
323 static size_t propagateall (global_State *g) { in propagateall() argument
325 while (g->gray) m += propagatemark(g); in propagateall()
409 global_State *g = G(L); in sweeplist() local
410 int deadmask = otherwhite(g); in sweeplist()
415 lua_assert(!isdead(g, curr) || testbit(curr->gch.marked, FIXEDBIT)); in sweeplist()
416 makewhite(g, curr); /* make it white (for next cycle) */ in sweeplist()
420 lua_assert(isdead(g, curr) || deadmask == bitmask(SFIXEDBIT)); in sweeplist()
422 if (curr == g->rootgc) /* is the first element of the list? */ in sweeplist()
423 g->rootgc = curr->gch.next; /* adjust first */ in sweeplist()
432 global_State *g = G(L); in checkSizes() local
434 if (g->strt.nuse < cast(lu_int32, g->strt.size/4) && in checkSizes()
435 g->strt.size > MINSTRTABSIZE*2) in checkSizes()
436 luaS_resize(L, g->strt.size/2); /* table is too big */ in checkSizes()
438 if (luaZ_sizebuffer(&g->buff) > LUA_MINBUFFER*2) { /* buffer too big? */ in checkSizes()
439 size_t newsize = luaZ_sizebuffer(&g->buff) / 2; in checkSizes()
440 luaZ_resizebuffer(L, &g->buff, newsize); in checkSizes()
446 global_State *g = G(L); in GCTM() local
447 GCObject *o = g->tmudata->gch.next; /* get first element */ in GCTM()
451 if (o == g->tmudata) /* last element? */ in GCTM()
452 g->tmudata = NULL; in GCTM()
454 g->tmudata->gch.next = udata->uv.next; in GCTM()
455 udata->uv.next = g->mainthread->next; /* return it to `root' list */ in GCTM()
456 g->mainthread->next = o; in GCTM()
457 makewhite(g, o); in GCTM()
461 lu_mem oldt = g->GCthreshold; in GCTM()
463 g->GCthreshold = 2*g->totalbytes; /* avoid GC steps */ in GCTM()
469 g->GCthreshold = oldt; /* restore threshold */ in GCTM()
484 global_State *g = G(L); in luaC_freeall() local
486 g->currentwhite = WHITEBITS | bitmask(SFIXEDBIT); /* mask to collect all elements */ in luaC_freeall()
487 sweepwholelist(L, &g->rootgc); in luaC_freeall()
488 for (i = 0; i < g->strt.size; i++) /* free all string lists */ in luaC_freeall()
489 sweepwholelist(L, &g->strt.hash[i]); in luaC_freeall()
493 static void markmt (global_State *g) { in markmt() argument
496 if (g->mt[i]) markobject(g, g->mt[i]); in markmt()
502 global_State *g = G(L); in markroot() local
503 g->gray = NULL; in markroot()
504 g->grayagain = NULL; in markroot()
505 g->weak = NULL; in markroot()
506 markobject(g, g->mainthread); in markroot()
508 markvalue(g, gt(g->mainthread)); in markroot()
509 markvalue(g, registry(L)); in markroot()
510 markmt(g); in markroot()
511 g->gcstate = GCSpropagate; in markroot()
515 static void remarkupvals (global_State *g) { in remarkupvals() argument
517 for (uv = g->uvhead.u.l.next; uv != &g->uvhead; uv = uv->u.l.next) { in remarkupvals()
520 markvalue(g, uv->v); in remarkupvals()
526 global_State *g = G(L); in atomic() local
529 remarkupvals(g); in atomic()
531 propagateall(g); in atomic()
533 g->gray = g->weak; in atomic()
534 g->weak = NULL; in atomic()
535 lua_assert(!iswhite(obj2gco(g->mainthread))); in atomic()
536 markobject(g, L); /* mark running thread */ in atomic()
537 markmt(g); /* mark basic metatables (again) */ in atomic()
538 propagateall(g); in atomic()
540 g->gray = g->grayagain; in atomic()
541 g->grayagain = NULL; in atomic()
542 propagateall(g); in atomic()
544 marktmu(g); /* mark `preserved' userdata */ in atomic()
545 udsize += propagateall(g); /* remark, to propagate `preserveness' */ in atomic()
546 cleartable(g->weak); /* remove collected objects from weak tables */ in atomic()
548 g->currentwhite = cast_byte(otherwhite(g)); in atomic()
549 g->sweepstrgc = 0; in atomic()
550 g->sweepgc = &g->rootgc; in atomic()
551 g->gcstate = GCSsweepstring; in atomic()
552 g->estimate = g->totalbytes - udsize; /* first estimate */ in atomic()
557 global_State *g = G(L); in singlestep() local
559 switch (g->gcstate) { in singlestep()
565 if (g->gray) in singlestep()
566 return propagatemark(g); in singlestep()
573 lu_mem old = g->totalbytes; in singlestep()
574 sweepwholelist(L, &g->strt.hash[g->sweepstrgc++]); in singlestep()
575 if (g->sweepstrgc >= g->strt.size) /* nothing more to sweep? */ in singlestep()
576 g->gcstate = GCSsweep; /* end sweep-string phase */ in singlestep()
577 lua_assert(old >= g->totalbytes); in singlestep()
578 g->estimate -= old - g->totalbytes; in singlestep()
582 lu_mem old = g->totalbytes; in singlestep()
583 g->sweepgc = sweeplist(L, g->sweepgc, GCSWEEPMAX); in singlestep()
584 if (*g->sweepgc == NULL) { /* nothing more to sweep? */ in singlestep()
586 g->gcstate = GCSfinalize; /* end sweep phase */ in singlestep()
588 lua_assert(old >= g->totalbytes); in singlestep()
589 g->estimate -= old - g->totalbytes; in singlestep()
593 if (g->tmudata) { in singlestep()
595 if (g->estimate > GCFINALIZECOST) in singlestep()
596 g->estimate -= GCFINALIZECOST; in singlestep()
600 g->gcstate = GCSpause; /* end collection */ in singlestep()
601 g->gcdept = 0; in singlestep()
611 global_State *g = G(L); in luaC_step() local
612 l_mem lim = (GCSTEPSIZE/100) * g->gcstepmul; in luaC_step()
615 g->gcdept += g->totalbytes - g->GCthreshold; in luaC_step()
618 if (g->gcstate == GCSpause) in luaC_step()
621 if (g->gcstate != GCSpause) { in luaC_step()
622 if (g->gcdept < GCSTEPSIZE) in luaC_step()
623 g->GCthreshold = g->totalbytes + GCSTEPSIZE; /* - lim/g->gcstepmul;*/ in luaC_step()
625 g->gcdept -= GCSTEPSIZE; in luaC_step()
626 g->GCthreshold = g->totalbytes; in luaC_step()
630 setthreshold(g); in luaC_step()
636 global_State *g = G(L); in luaC_fullgc() local
637 if (g->gcstate <= GCSpropagate) { in luaC_fullgc()
639 g->sweepstrgc = 0; in luaC_fullgc()
640 g->sweepgc = &g->rootgc; in luaC_fullgc()
642 g->gray = NULL; in luaC_fullgc()
643 g->grayagain = NULL; in luaC_fullgc()
644 g->weak = NULL; in luaC_fullgc()
645 g->gcstate = GCSsweepstring; in luaC_fullgc()
647 lua_assert(g->gcstate != GCSpause && g->gcstate != GCSpropagate); in luaC_fullgc()
649 while (g->gcstate != GCSfinalize) { in luaC_fullgc()
650 lua_assert(g->gcstate == GCSsweepstring || g->gcstate == GCSsweep); in luaC_fullgc()
654 while (g->gcstate != GCSpause) { in luaC_fullgc()
657 setthreshold(g); in luaC_fullgc()
662 global_State *g = G(L); in luaC_barrierf() local
663 lua_assert(isblack(o) && iswhite(v) && !isdead(g, v) && !isdead(g, o)); in luaC_barrierf()
664 lua_assert(g->gcstate != GCSfinalize && g->gcstate != GCSpause); in luaC_barrierf()
667 if (g->gcstate == GCSpropagate) in luaC_barrierf()
668 reallymarkobject(g, v); /* restore invariant */ in luaC_barrierf()
670 makewhite(g, o); /* mark as white just to avoid other barriers */ in luaC_barrierf()
675 global_State *g = G(L); in luaC_barrierback() local
677 lua_assert(isblack(o) && !isdead(g, o)); in luaC_barrierback()
678 lua_assert(g->gcstate != GCSfinalize && g->gcstate != GCSpause); in luaC_barrierback()
680 t->gclist = g->grayagain; in luaC_barrierback()
681 g->grayagain = o; in luaC_barrierback()
686 global_State *g = G(L); in luaC_link() local
687 o->gch.next = g->rootgc; in luaC_link()
688 g->rootgc = o; in luaC_link()
689 o->gch.marked = luaC_white(g); in luaC_link()
695 global_State *g = G(L); in luaC_linkupval() local
697 o->gch.next = g->rootgc; /* link upvalue into `rootgc' list */ in luaC_linkupval()
698 g->rootgc = o; in luaC_linkupval()
700 if (g->gcstate == GCSpropagate) { in luaC_linkupval()
705 makewhite(g, o); in luaC_linkupval()
706 lua_assert(g->gcstate != GCSfinalize && g->gcstate != GCSpause); in luaC_linkupval()