int32_t GCConfigTest::removeObjectFromParentSlot(const char *name, omrobjectptr_t parentPtr) { OMRPORT_ACCESS_FROM_OMRVM(exampleVM->_omrVM); int32_t rt = 1; GC_ObjectIterator objectIterator(exampleVM->_omrVM, parentPtr); GC_SlotObject *slotObject = NULL; ObjectEntry *objEntry; rt = objectTable.find(&objEntry, name); if (0 != rt) { omrtty_printf("%s:%d Could not find object %s in hash table.\n", __FILE__, __LINE__, name); goto done; } while (NULL != (slotObject = objectIterator.nextSlot())) { if (objEntry->objPtr == slotObject->readReferenceFromSlot()) { slotObject->writeReferenceToSlot(NULL); rt = 0; break; } } if (0 != rt) { omrtty_printf("%s:%d Failed to find object %s from its parent's slot.\n", __FILE__, __LINE__, name); goto done; } #if defined(OMRGCTEST_DEBUG) omrtty_printf("Remove object %s from its parent's slot.\n", name); #endif done: return rt; }
/** * Private internal. Called exclusively from completeScan(); */ uintptr_t MM_MarkingScheme::scanObject(MM_EnvironmentBase *env, omrobjectptr_t objectPtr) { uintptr_t sizeToDo = UDATA_MAX; GC_ObjectScannerState objectScannerState; GC_ObjectScanner *objectScanner = _delegate.getObjectScanner(env, objectPtr, &objectScannerState, SCAN_REASON_PACKET, &sizeToDo); if (NULL != objectScanner) { bool isLeafSlot = false; GC_SlotObject *slotObject; #if defined(OMR_GC_LEAF_BITS) while (NULL != (slotObject = objectScanner->getNextSlot(isLeafSlot))) { #else /* OMR_GC_LEAF_BITS */ while (NULL != (slotObject = objectScanner->getNextSlot())) { #endif /* OMR_GC_LEAF_BITS */ fixupForwardedSlot(slotObject); inlineMarkObjectNoCheck(env, slotObject->readReferenceFromSlot(), isLeafSlot); } } return sizeToDo; } /** * Scan until there are no more work packets to be processed. * @note This is a joining scan: a thread will not exit this method until * all threads have entered and all work packets are empty. */ void MM_MarkingScheme::completeScan(MM_EnvironmentBase *env) { do { omrobjectptr_t objectPtr = NULL; while (NULL != (objectPtr = (omrobjectptr_t )env->_workStack.pop(env))) { env->_markStats._bytesScanned += scanObject(env, objectPtr); env->_markStats._objectsScanned += 1; } } while (_workPackets->handleWorkPacketOverflow(env)); } /**************************************** * Marking Core Functionality ****************************************/ /** * Initialization for Mark * Actual startup for Mark procedure * @param[in] env - passed Environment * @param[in] initMarkMap instruct should mark map be initialized too */ void MM_MarkingScheme::markLiveObjectsInit(MM_EnvironmentBase *env, bool initMarkMap) { workerSetupForGC(env); if(initMarkMap) { _markMap->initializeMarkMap(env); env->_currentTask->synchronizeGCThreads(env, UNIQUE_ID); } }
uintptr_t MM_CollectorLanguageInterfaceImpl::markingScheme_scanObject(MM_EnvironmentBase *env, omrobjectptr_t objectPtr, MarkingSchemeScanReason reason) { GC_ObjectIterator objectIterator(_omrVM, objectPtr); GC_SlotObject *slotObject = NULL; while (NULL != (slotObject = objectIterator.nextSlot())) { omrobjectptr_t slot = slotObject->readReferenceFromSlot(); if (_markingScheme->isHeapObject(slot)) { _markingScheme->markObject(env, slot); } } return env->getExtensions()->objectModel.getSizeInBytesWithHeader(objectPtr); }