Пример #1
0
void
MM_SweepSchemeSegregated::sweepRegion(MM_EnvironmentBase *env, MM_HeapRegionDescriptorSegregated *region)
{
	region->getMemoryPoolACL()->resetCounts();

	switch (region->getRegionType()) {

	case MM_HeapRegionDescriptor::SEGREGATED_SMALL:
		sweepSmallRegion(env, region);
		if (isClearMarkMapAfterSweep()) {
			unmarkRegion(env, region);
		}
		addBytesFreedAfterSweep(env, region);
		break;

#if defined(OMR_GC_ARRAYLETS)
	case MM_HeapRegionDescriptor::ARRAYLET_LEAF:
		sweepArrayletRegion(env, region);
		addBytesFreedAfterSweep(env, region);
		break;
#endif /* defined(OMR_GC_ARRAYLETS) */

	case MM_HeapRegionDescriptor::SEGREGATED_LARGE:
		sweepLargeRegion(env, region);
		break;

	default:
		Assert_MM_unreachable();
	}
}
Пример #2
0
void updateMarked(void)
{
  if (base + cursor > oldbase + oldcursor) {

    if (mark_min == mark_max) {
      mark_max = base + cursor;
    } else if (oldbase + oldcursor == mark_min) {
      if (base + cursor <= mark_max) {
	mark_min = base + cursor;
	unmarkRegion(oldbase + oldcursor, mark_min - 1);
      } else {
	unmarkRegion(oldbase + oldcursor, mark_max);
	mark_min = mark_max;
	mark_max = base + cursor;
      }
    } else {
      mark_max = base + cursor;
    }

  } else if (base + cursor < oldbase + oldcursor){
    if (mark_min == mark_max) {
      mark_min = base + cursor;
    } else if (oldbase + oldcursor == mark_max) {
      if (base + cursor >= mark_min) {
	mark_max = base + cursor;
	unmarkRegion(mark_max + 1, oldbase + oldcursor);
      } else {
	unmarkRegion(mark_min, oldbase + oldcursor);
	markRegion(base + cursor, mark_min - 1);
	mark_max = mark_min;
	mark_min = base + cursor;
      }
    } else {
      mark_min = base + cursor;
    }
  }
  if (mark_max >= getfilesize()) mark_max = getfilesize() - 1;
  markSelectedRegion();
}
Пример #3
0
void unmarkAll(void) { unmarkRegion(base, base + nbBytes - 1); }