Exemple #1
0
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;
}
Exemple #2
0
/**
 * 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);
}