Ejemplo n.º 1
0
static l_mem singlestep (lua_State *L) {
  global_State *g = G(L);
  switch (g->gcstate) {
    case GCSpause: {
      if (!isgenerational(g))
        markroot(g);  /* start a new collection */
      /* in any case, root must be marked */
      lua_assert(!iswhite(obj2gco(g->mainthread))
              && !iswhite(gcvalue(&g->l_registry)));
      g->gcstate = GCSpropagate;
      return GCROOTCOST;
    }
    case GCSpropagate: {
      if (g->gray)
        return propagatemark(g);
      else {  /* no more `gray' objects */
        g->gcstate = GCSatomic;  /* finish mark phase */
        atomic(L);
        return GCATOMICCOST;
      }
    }
    case GCSsweepstring: {
      if (g->sweepstrgc < g->strt.size) {
        sweepwholelist(L, &g->strt.hash[g->sweepstrgc++]);
        return GCSWEEPCOST;
      }
      else {  /* no more strings to sweep */
        g->sweepgc = &g->finobj;  /* prepare to sweep finalizable objects */
        g->gcstate = GCSsweepudata;
        return 0;
      }
    }
    case GCSsweepudata: {
      if (*g->sweepgc) {
        g->sweepgc = sweeplist(L, g->sweepgc, GCSWEEPMAX);
        return GCSWEEPMAX*GCSWEEPCOST;
      }
      else {
        g->sweepgc = &g->allgc;  /* go to next phase */
        g->gcstate = GCSsweep;
        return GCSWEEPCOST;
      }
    }
    case GCSsweep: {
      if (*g->sweepgc) {
        g->sweepgc = sweeplist(L, g->sweepgc, GCSWEEPMAX);
        return GCSWEEPMAX*GCSWEEPCOST;
      }
      else {
        /* sweep main thread */
        GCObject *mt = obj2gco(g->mainthread);
        sweeplist(L, &mt, 1);
        checkSizes(L);
        g->gcstate = GCSpause;  /* finish collection */
        return GCSWEEPCOST;
      }
    }
    default: lua_assert(0); return 0;
  }
}
Ejemplo n.º 2
0
/*
** performs a basic GC step even if the collector is stopped
*/
void luaC_forcestep (lua_State *L) {
  global_State *g = G(L);
  int i;
  if (isgenerational(g)) generationalcollection(L);
  else step(L);
  for (i = 0; i < GCFINALIZENUM && g->tobefnz; i++)
    GCTM(L, 1);  /* Call a few pending finalizers */
}
Ejemplo n.º 3
0
/*
** performs a basic GC step
*/
void luaC_forcestep (lua_State *L) {
	global_State *g = G(L);
	int i;
	if (isgenerational(g)) generationalcollection(L);
	else incstep(L);
	/* run a few finalizers (or all of them at the end of a collect cycle) */
	for (i = 0; g->tobefnz && (i < GCFINALIZENUM || g->gcstate == GCSpause); i++)
	GCTM(L, 1);  /* call one finalizer */
}
Ejemplo n.º 4
0
/*
** barrier that moves collector forward, that is, mark the white object
** being pointed by a black object.
*/
void luaC_barrier_ (lua_State *L, GCObject *o, GCObject *v) {
  global_State *g = G(L);
  lua_assert(isblack(o) && iswhite(v) && !isdead(g, v) && !isdead(g, o));
  lua_assert(isgenerational(g) || g->gcstate != GCSpause);
  lua_assert(gch(o)->tt != LUA_TTABLE);
  if (keepinvariant(g))  /* must keep invariant? */
    reallymarkobject(g, v);  /* restore invariant */
  else {  /* sweep phase */
    lua_assert(issweepphase(g));
    makewhite(g, o);  /* mark main obj. as white to avoid other barriers */
  }
}
Ejemplo n.º 5
0
static lu_mem singlestep (lua_State *L) {
	global_State *g = G(L);
	switch (g->gcstate) {
	case GCSpause: {
		/* start to count memory traversed */
		g->GCmemtrav = g->strt.size * sizeof(GCObject*);
		lua_assert(!isgenerational(g));
		restartcollection(g);
		g->gcstate = GCSpropagate;
		return g->GCmemtrav;
	}
	case GCSpropagate: {
		if (g->gray) {
		lu_mem oldtrav = g->GCmemtrav;
		propagatemark(g);
		return g->GCmemtrav - oldtrav;  /* memory traversed in this step */
		}
		else {  /* no more `gray' objects */
		lu_mem work;
		int sw;
		g->gcstate = GCSatomic;  /* finish mark phase */
		g->GCestimate = g->GCmemtrav;  /* save what was counted */;
		work = atomic(L);  /* add what was traversed by 'atomic' */
		g->GCestimate += work;  /* estimate of total memory traversed */
		sw = entersweep(L);
		return work + sw * GCSWEEPCOST;
		}
	}
	case GCSsweepstring: {
		int i;
		for (i = 0; i < GCSWEEPMAX && g->sweepstrgc + i < g->strt.size; i++)
		sweepwholelist(L, &g->strt.hash[g->sweepstrgc + i]);
		g->sweepstrgc += i;
		if (g->sweepstrgc >= g->strt.size)  /* no more strings to sweep? */
		g->gcstate = GCSsweepudata;
		return i * GCSWEEPCOST;
	}
	case GCSsweepudata: {
		if (g->sweepfin) {
		g->sweepfin = sweeplist(L, g->sweepfin, GCSWEEPMAX);
		return GCSWEEPMAX*GCSWEEPCOST;
		}
		else {
		g->gcstate = GCSsweep;
		return 0;
		}
	}
	case GCSsweep: {
		if (g->sweepgc) {
		g->sweepgc = sweeplist(L, g->sweepgc, GCSWEEPMAX);
		return GCSWEEPMAX*GCSWEEPCOST;
		}
		else {
		/* sweep main thread */
		GCObject *mt = obj2gco(g->mainthread);
		sweeplist(L, &mt, 1);
		checkSizes(L);
		g->gcstate = GCSpause;  /* finish collection */
		return GCSWEEPCOST;
		}
	}
	default: lua_assert(0); return 0;
	}
}