Skip to content

Commit

Permalink
Merge pull request eclipse-omr#3576 from rwy0717/scavenger-delegate
Browse files Browse the repository at this point in the history
Permanently enable OMR_GC_SCAVENGER_DELEGATE
  • Loading branch information
youngar authored Mar 1, 2019
2 parents bd02dfd + ed9ad30 commit a21c6ee
Show file tree
Hide file tree
Showing 12 changed files with 16 additions and 641 deletions.
9 changes: 5 additions & 4 deletions example/glue/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -40,11 +40,12 @@ target_sources(omr_example_gc_glue INTERFACE
${CMAKE_CURRENT_SOURCE_DIR}/VerboseManagerImpl.cpp
)

if(OMR_GC_SCAVENGER_DELEGATE)
target_sources(omr_example_gc_glue INTERFACE
${CMAKE_CURRENT_SOURCE_DIR}/ScavengerDelegate.cpp
if(OMR_GC_MODRON_SCAVENGER)
target_sources(omr_example_gc_glue
INTERFACE
${CMAKE_CURRENT_SOURCE_DIR}/ScavengerDelegate.cpp
)
endif()
endif(OMR_GC_MODRON_SCAVENGER)

target_link_libraries(omr_example_gc_glue
INTERFACE
Expand Down
165 changes: 0 additions & 165 deletions example/glue/CollectorLanguageInterfaceImpl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -92,168 +92,3 @@ MM_CollectorLanguageInterfaceImpl::initialize(OMR_VM *omrVM)
{
return true;
}
#if defined(OMR_GC_MODRON_SCAVENGER) && !defined(OMR_GC_SCAVENGER_DELEGATE)
void
MM_CollectorLanguageInterfaceImpl::scavenger_masterSetupForGC(MM_EnvironmentBase *env)
{
/* Do nothing for now */
}

void
MM_CollectorLanguageInterfaceImpl::scavenger_workerSetupForGC_clearEnvironmentLangStats(MM_EnvironmentBase *env)
{
/* Do nothing for now */
}

void
MM_CollectorLanguageInterfaceImpl::scavenger_reportScavengeEnd(MM_EnvironmentBase * envBase, bool scavengeSuccessful)
{
/* Do nothing for now */
}

void
MM_CollectorLanguageInterfaceImpl::scavenger_mergeGCStats_mergeLangStats(MM_EnvironmentBase *envBase)
{
/* Do nothing for now */
}

void
MM_CollectorLanguageInterfaceImpl::scavenger_masterThreadGarbageCollect_scavengeComplete(MM_EnvironmentBase *envBase)
{
/* Do nothing for now */
}

void
MM_CollectorLanguageInterfaceImpl::scavenger_masterThreadGarbageCollect_scavengeSuccess(MM_EnvironmentBase *envBase)
{
/* Do nothing for now */
}

bool
MM_CollectorLanguageInterfaceImpl::scavenger_internalGarbageCollect_shouldPercolateGarbageCollect(MM_EnvironmentBase *envBase, PercolateReason *reason, uint32_t *gcCode)
{
/* Do nothing for now */
return false;
}

GC_ObjectScanner *
MM_CollectorLanguageInterfaceImpl::scavenger_getObjectScanner(MM_EnvironmentStandard *env, omrobjectptr_t objectPtr, void *allocSpace, uintptr_t flags)
{
#if defined(OMR_GC_MODRON_SCAVENGER_STRICT)
Assert_MM_true((GC_ObjectScanner::scanHeap == flags) ^ (GC_ObjectScanner::scanRoots == flags));
#endif /* defined(OMR_GC_MODRON_SCAVENGER_STRICT) */
GC_ObjectScanner *objectScanner = NULL;
objectScanner = GC_MixedObjectScanner::newInstance(env, objectPtr, allocSpace, flags);
return objectScanner;
}

void
MM_CollectorLanguageInterfaceImpl::scavenger_flushReferenceObjects(MM_EnvironmentStandard *env)
{
/* Do nothing for now */
}

bool
MM_CollectorLanguageInterfaceImpl::scavenger_hasIndirectReferentsInNewSpace(MM_EnvironmentStandard *env, omrobjectptr_t objectPtr)
{
/* This method must be implemented and return true an object may hold any object references that are live
* but not reachable by traversing the reference graph from the root set or remembered set. Otherwise this
* default implementation should be used.
*/
return false;
}

bool
MM_CollectorLanguageInterfaceImpl::scavenger_scavengeIndirectObjectSlots(MM_EnvironmentStandard *env, omrobjectptr_t objectPtr)
{
/* This method must be implemented if an object may hold any object references that are live but not reachable
* by traversing the reference graph from the root set or remembered set. In that case, this method should
* call MM_Scavenger::copyObjectSlot(..) for each such indirect object reference, ORing the boolean result
* from each call to MM_Scavenger::copyObjectSlot(..) into a single boolean value to be returned.
*/
return false;
}

void
MM_CollectorLanguageInterfaceImpl::scavenger_backOutIndirectObjectSlots(MM_EnvironmentStandard *env, omrobjectptr_t objectPtr)
{
/* This method must be implemented if an object may hold any object references that are live but not reachable
* by traversing the reference graph from the root set or remembered set. In that case, this method should
* call MM_Scavenger::backOutFixSlotWithoutCompression(..) for each uncompressed slot holding a reference to
* an indirect object that is associated with the object.
*/
}

void
MM_CollectorLanguageInterfaceImpl::scavenger_backOutIndirectObjects(MM_EnvironmentStandard *env)
{
/* This method must be implemented if an object may hold any object references that are live but not reachable
* by traversing the reference graph from the root set or remembered set. In that case, this method should locate
* all such objects and call MM_Scavenger::backOutObjectScan(..) for each such object that is in the remembered
* set. For example,
*
* if (_extensions->objectModel.isRemembered(indirectObject)) {
* _extensions->scavenger->backOutObjectScan(env, indirectObject);
* }
*/
}

void
MM_CollectorLanguageInterfaceImpl::scavenger_reverseForwardedObject(MM_EnvironmentBase *env, MM_ForwardedHeader *forwardedHeader)
{
if (forwardedHeader->isForwardedPointer()) {
omrobjectptr_t originalObject = forwardedHeader->getObject();
omrobjectptr_t forwardedObject = forwardedHeader->getForwardedObject();

/* Restore the original object header from the forwarded object */
GC_ObjectModel *objectModel = &(env->getExtensions()->objectModel);

originalObject->header.assign(
(ObjectSize)objectModel->getConsumedSizeInBytesWithHeader(forwardedObject),
(uint8_t)objectModel->getObjectFlags(forwardedObject));

#if defined (OMR_INTERP_COMPRESSED_OBJECT_HEADER)
/* Restore destroyed overlapped slot in the original object. This slot might need to be reversed
* as well or it may be already reversed - such fixup will be completed at in a later pass.
*/
forwardedHeader->restoreDestroyedOverlap();
#endif /* defined (OMR_INTERP_COMPRESSED_OBJECT_HEADER) */
}
}

#if defined (OMR_INTERP_COMPRESSED_OBJECT_HEADER)
void
MM_CollectorLanguageInterfaceImpl::scavenger_fixupDestroyedSlot(MM_EnvironmentBase *env, MM_ForwardedHeader *forwardedHeader, MM_MemorySubSpaceSemiSpace *subSpaceNew)
{
/* This method must be implemented if (and only if) the object header is stored in a compressed slot. in that
* case the other half of the full (omrobjectptr_t sized) slot may hold a compressed object reference that
* must be restored by this method.
*/
/* This assumes that all slots are object slots, including the slot adjacent to the header slot */
if ((0 != forwardedHeader->getPreservedOverlap()) && !_extensions->objectModel.isIndexable(forwardedHeader)) {
MM_GCExtensionsBase *extensions = MM_GCExtensionsBase::getExtensions(_omrVM);
/* Get the uncompressed reference from the slot */
fomrobject_t preservedOverlap = (fomrobject_t)forwardedHeader->getPreservedOverlap();
GC_SlotObject preservedSlotObject(_omrVM, &preservedOverlap);
omrobjectptr_t survivingCopyAddress = preservedSlotObject.readReferenceFromSlot();
/* Check if the address we want to read is aligned (since mis-aligned reads may still be less than a top address but extend beyond it) */
if (0 == ((uintptr_t)survivingCopyAddress & (extensions->getObjectAlignmentInBytes() - 1))) {
/* Ensure that the address we want to read is within part of the heap which could contain copied objects (tenure or survivor) */
void *topOfObject = (void *)((uintptr_t *)survivingCopyAddress + 1);
if (subSpaceNew->isObjectInNewSpace(survivingCopyAddress, topOfObject) || extensions->isOld(survivingCopyAddress, topOfObject)) {
/* if the slot points to a reverse-forwarded object, restore the original location (in evacuate space) */
MM_ForwardedHeader reverseForwardedHeader(survivingCopyAddress);
if (reverseForwardedHeader.isReverseForwardedPointer()) {
/* overlapped slot must be fixed up */
fomrobject_t fixupSlot = 0;
GC_SlotObject fixupSlotObject(_omrVM, &fixupSlot);
fixupSlotObject.writeReferenceToSlot(reverseForwardedHeader.getReverseForwardedPointer());
forwardedHeader->restoreDestroyedOverlap((uint32_t)fixupSlot);
}
}
}
}
}
#endif /* OMR_INTERP_COMPRESSED_OBJECT_HEADER */
#endif /* OMR_GC_MODRON_SCAVENGER && !OMR_GC_SCAVENGER_DELEGATE */

19 changes: 0 additions & 19 deletions example/glue/CollectorLanguageInterfaceImpl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,25 +65,6 @@ class MM_CollectorLanguageInterfaceImpl : public MM_CollectorLanguageInterface {
static MM_CollectorLanguageInterfaceImpl *newInstance(MM_EnvironmentBase *env);
virtual void kill(MM_EnvironmentBase *env);

#if defined(OMR_GC_MODRON_SCAVENGER) && !defined(OMR_GC_SCAVENGER_DELEGATE)
virtual void scavenger_masterSetupForGC(MM_EnvironmentBase *env);
virtual void scavenger_workerSetupForGC_clearEnvironmentLangStats(MM_EnvironmentBase *env);
virtual void scavenger_reportScavengeEnd(MM_EnvironmentBase * envBase, bool scavengeSuccessful);
virtual void scavenger_mergeGCStats_mergeLangStats(MM_EnvironmentBase *envBase);
virtual void scavenger_masterThreadGarbageCollect_scavengeComplete(MM_EnvironmentBase *envBase);
virtual void scavenger_masterThreadGarbageCollect_scavengeSuccess(MM_EnvironmentBase *envBase);
virtual bool scavenger_internalGarbageCollect_shouldPercolateGarbageCollect(MM_EnvironmentBase *envBase, PercolateReason *reason, uint32_t *gcCode);
virtual GC_ObjectScanner *scavenger_getObjectScanner(MM_EnvironmentStandard *env, omrobjectptr_t objectPtr, void *allocSpace, uintptr_t flags);
virtual void scavenger_flushReferenceObjects(MM_EnvironmentStandard *env);
virtual bool scavenger_hasIndirectReferentsInNewSpace(MM_EnvironmentStandard *env, omrobjectptr_t objectPtr);
virtual bool scavenger_scavengeIndirectObjectSlots(MM_EnvironmentStandard *env, omrobjectptr_t objectPtr);
virtual void scavenger_backOutIndirectObjectSlots(MM_EnvironmentStandard *env, omrobjectptr_t objectPtr);
virtual void scavenger_backOutIndirectObjects(MM_EnvironmentStandard *env);
virtual void scavenger_reverseForwardedObject(MM_EnvironmentBase *env, MM_ForwardedHeader *forwardedHeader);
#if defined (OMR_INTERP_COMPRESSED_OBJECT_HEADER)
virtual void scavenger_fixupDestroyedSlot(MM_EnvironmentBase *env, MM_ForwardedHeader *forwardedHeader, MM_MemorySubSpaceSemiSpace *subSpaceNew);
#endif /* OMR_INTERP_COMPRESSED_OBJECT_HEADER */
#endif /* OMR_GC_MODRON_SCAVENGER && !OMR_GC_SCAVENGER_DELEGATE */

};

Expand Down
4 changes: 2 additions & 2 deletions example/glue/ScavengerDelegate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@

#include "omrcfg.h"

#if defined(OMR_GC_SCAVENGER_DELEGATE)
#if defined(OMR_GC_MODRON_SCAVENGER)

#include "ScavengerDelegate.hpp"

Expand Down Expand Up @@ -219,4 +219,4 @@ MM_ScavengerDelegate::fixupDestroyedSlot(MM_EnvironmentBase *env, MM_ForwardedHe
}
#endif /* defined (OMR_INTERP_COMPRESSED_OBJECT_HEADER) */

#endif /* defined(OMR_GC_SCAVENGER_DELEGATE) */
#endif /* defined(OMR_GC_MODRON_SCAVENGER) */
4 changes: 2 additions & 2 deletions example/glue/ScavengerDelegate.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@

#include "omrcfg.h"

#if defined(OMR_GC_MODRON_SCAVENGER) && defined(OMR_GC_SCAVENGER_DELEGATE)
#if defined(OMR_GC_MODRON_SCAVENGER)

#include "modronbase.h"
#include "objectdescription.h"
Expand Down Expand Up @@ -258,6 +258,6 @@ class MM_ScavengerDelegate : public MM_BaseVirtual {
}
};

#endif /* defined(OMR_GC_MODRON_SCAVENGER) && defined(OMR_GC_SCAVENGER_DELEGATE) */
#endif /* defined(OMR_GC_MODRON_SCAVENGER) */

#endif /* SCAVENGERDELEGATE_HPP_ */
Loading

0 comments on commit a21c6ee

Please sign in to comment.