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(); } }
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(); }
void unmarkAll(void) { unmarkRegion(base, base + nbBytes - 1); }