/** * Empty a packet on overflow * * Empty a packet to resolve overflow by dirtying the appropriate * cards for each object withing a given packet * * @param packet - Reference to packet to be empited * @param type - ignored for concurrent collector * */ void MM_ConcurrentOverflow::emptyToOverflow(MM_EnvironmentBase *env, MM_Packet *packet, MM_OverflowType type) { MM_ConcurrentGC *collector = (MM_ConcurrentGC *)_extensions->getGlobalCollector(); void *objectPtr; _overflow = true; /* Broadcast the overflow to the concurrent collector * so it can take any remedial action */ collector->concurrentWorkStackOverflow(); _extensions->globalGCStats.workPacketStats.setSTWWorkStackOverflowOccured(true); _extensions->globalGCStats.workPacketStats.incrementSTWWorkStackOverflowCount(); _extensions->globalGCStats.workPacketStats.setSTWWorkpacketCountAtOverflow(_workPackets->getActivePacketCount()); #if defined(OMR_GC_MODRON_SCAVENGER) clearCardsForNewSpace(MM_EnvironmentStandard::getEnvironment(env), collector); #endif /* OMR_GC_MODRON_SCAVENGER */ /* Empty the current packet by dirtying its cards now */ while(NULL != (objectPtr = packet->pop(env))) { overflowItemInternal(env, objectPtr, collector->getCardTable()); } Assert_MM_true(packet->isEmpty()); }
void MM_OverflowStandard::overflowItem(MM_EnvironmentBase *env, void *item, MM_OverflowType type) { _overflow = true; _extensions->globalGCStats.workPacketStats.setSTWWorkStackOverflowOccured(true); _extensions->globalGCStats.workPacketStats.incrementSTWWorkStackOverflowCount(); _extensions->globalGCStats.workPacketStats.setSTWWorkpacketCountAtOverflow(_workPackets->getActivePacketCount()); overflowItemInternal(env, item); }
void MM_OverflowStandard::emptyToOverflow(MM_EnvironmentBase *env, MM_Packet *packet, MM_OverflowType type) { void *objectPtr; _overflow = true; _extensions->globalGCStats.workPacketStats.setSTWWorkStackOverflowOccured(true); _extensions->globalGCStats.workPacketStats.incrementSTWWorkStackOverflowCount(); _extensions->globalGCStats.workPacketStats.setSTWWorkpacketCountAtOverflow(_workPackets->getActivePacketCount()); /* Empty the current packet by setting its overflow bit (double marking) */ while(NULL != (objectPtr = packet->pop(env))) { overflowItemInternal(env, objectPtr); } Assert_MM_true(packet->isEmpty()); }
/** * Overflow an item * * Overflow an item by dirtying the appropriate card * * @param item - item to overflow * @param type - ignored for concurrent collector * */ void MM_ConcurrentOverflow::overflowItem(MM_EnvironmentBase *env, void *item, MM_OverflowType type) { MM_ConcurrentGC *collector = (MM_ConcurrentGC *)_extensions->getGlobalCollector(); _overflow = true; /* Broadcast the overflow to the concurrent collector * so it can take any remedial action */ collector->concurrentWorkStackOverflow(); _extensions->globalGCStats.workPacketStats.setSTWWorkStackOverflowOccured(true); _extensions->globalGCStats.workPacketStats.incrementSTWWorkStackOverflowCount(); _extensions->globalGCStats.workPacketStats.setSTWWorkpacketCountAtOverflow(_workPackets->getActivePacketCount()); #if defined(OMR_GC_MODRON_SCAVENGER) clearCardsForNewSpace(MM_EnvironmentStandard::getEnvironment(env), collector); #endif /* OMR_GC_MODRON_SCAVENGER */ overflowItemInternal(env, item, collector->getCardTable()); }