예제 #1
0
void valgrindFreeObject(MM_GCExtensionsBase *extensions, uintptr_t baseAddress)
{
    int objSize;
    if (MM_ForwardedHeader((omrobjectptr_t)baseAddress).isForwardedPointer())
    {
        /* In scavanger an object may act as pointer to another object(it's replica in another region).
           In this case, getConsumedSizeInBytesWithHeader returns some junk value.
           So instead we calculate the size of the object (replica) it is pointing to 
           and use it for freeing original object.
        */
        omrobjectptr_t fwObject = MM_ForwardedHeader((omrobjectptr_t)baseAddress).getForwardedObject();
        objSize = (int)((GC_ObjectModel)extensions->objectModel).getConsumedSizeInBytesWithHeader(fwObject);
    }
    else
    {
        objSize = (int)((GC_ObjectModel)extensions->objectModel).getConsumedSizeInBytesWithHeader((omrobjectptr_t)baseAddress);
    }

#if defined(VALGRIND_REQUEST_LOGS)
    VALGRIND_PRINTF_BACKTRACE("Clearing an object at 0x%lx of size %d\n", baseAddress, objSize);
#endif /* defined(VALGRIND_REQUEST_LOGS) */

    VALGRIND_CHECK_MEM_IS_DEFINED(baseAddress, objSize);
    VALGRIND_MEMPOOL_FREE(extensions->valgrindMempoolAddr, baseAddress);

    MUTEX_ENTER(extensions->memcheckHashTableMutex);
    hashTableRemove(extensions->memcheckHashTable, &baseAddress);
    MUTEX_EXIT(extensions->memcheckHashTableMutex);
}
bool
GC_ObjectHeapIteratorAddressOrderedList::shouldReturnCurrentObject() {
	if(_scanPtr < _scanPtrTop) {
#if defined(OMR_VALGRIND_MEMCHECK)
		bool scanPtrObjExists = valgrindCheckObjectInPool(_extensions,(uintptr_t) _scanPtr);
		if(!scanPtrObjExists) valgrindMakeMemDefined(((uintptr_t) _scanPtr),sizeof(omrobjectptr_t));
#endif /* defined(OMR_VALGRIND_MEMCHECK) */		
		_isDeadObject = _extensions->objectModel.isDeadObject(_scanPtr);
#if defined(OMR_VALGRIND_MEMCHECK)
		if(!scanPtrObjExists) valgrindMakeMemNoaccess(((uintptr_t) _scanPtr),sizeof(omrobjectptr_t));
#endif /* defined(OMR_VALGRIND_MEMCHECK) */		
		if (_isDeadObject) {
#if defined(OMR_VALGRIND_MEMCHECK)			
	if(!scanPtrObjExists) valgrindMakeMemDefined(((uintptr_t) _scanPtr),sizeof(omrobjectptr_t));
#endif /* defined(OMR_VALGRIND_MEMCHECK) */					
			_isSingleSlotHole = _extensions->objectModel.isSingleSlotDeadObject(_scanPtr);
#if defined(OMR_VALGRIND_MEMCHECK)			
	if(!scanPtrObjExists) valgrindMakeMemNoaccess(((uintptr_t) _scanPtr),sizeof(omrobjectptr_t));
#endif /* defined(OMR_VALGRIND_MEMCHECK) */					
			_deadObjectSize = computeDeadObjectSize();
			return _includeDeadObjects;
#if defined(OMR_GC_CONCURRENT_SCAVENGER)
		} else if (MM_ForwardedHeader(_scanPtr).isStrictlyForwardedPointer()) {
			return _includeForwardedObjects;
#endif /* OMR_GC_CONCURRENT_SCAVENGER */
		} else {
			return true;
		}
	}

	return false;
}