/*
* Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package com.oracle.svm.core;
import org.graalvm.nativeimage.ImageSingletons;
import org.graalvm.word.PointerBase;
import org.graalvm.word.UnsignedWord;
import com.oracle.svm.core.annotate.RestrictHeapAccess;
import com.oracle.svm.core.code.CodeInfo;
import com.oracle.svm.core.heap.ObjectVisitor;
A walker over different kinds of allocated memory. /** A walker over different kinds of allocated memory. */
public abstract class MemoryWalker {
Get the implementation of the MemoryWalker. /** Get the implementation of the MemoryWalker. */
public static MemoryWalker getMemoryWalker() {
return ImageSingletons.lookup(MemoryWalker.class);
}
Walk memory applying the visitor. Returns true if all visits returned true, else false when
any visit returns false.
/**
* Walk memory applying the visitor. Returns true if all visits returned true, else false when
* any visit returns false.
*/
public abstract boolean visitMemory(Visitor visitor);
public interface ImageHeapRegionVisitor {
Visit a region from the native image heap. /** Visit a region from the native image heap. */
@RestrictHeapAccess(access = RestrictHeapAccess.Access.NO_ALLOCATION, reason = "Must not allocate while visiting memory.")
<T> boolean visitNativeImageHeapRegion(T region, MemoryWalker.NativeImageHeapRegionAccess<T> access);
}
public interface Visitor extends ImageHeapRegionVisitor {
Visit a heap chunk, using the provided access methods. Return true if visiting should
continue, else false.
/**
* Visit a heap chunk, using the provided access methods. Return true if visiting should
* continue, else false.
*/
@RestrictHeapAccess(access = RestrictHeapAccess.Access.NO_ALLOCATION, reason = "Must not allocate while visiting memory.")
<T extends PointerBase> boolean visitHeapChunk(T heapChunk, HeapChunkAccess<T> access);
Visit compiled code, using the provided access methods. Return true if visiting should
continue, else false.
/**
* Visit compiled code, using the provided access methods. Return true if visiting should
* continue, else false.
*/
@RestrictHeapAccess(access = RestrictHeapAccess.Access.NO_ALLOCATION, reason = "Must not allocate while visiting memory.")
<T extends CodeInfo> boolean visitCode(T codeInfo, CodeAccess<T> access);
}
A set of access methods for visiting regions of the native image heap. /** A set of access methods for visiting regions of the native image heap. */
public interface NativeImageHeapRegionAccess<T> {
UnsignedWord getStart(T region);
UnsignedWord getSize(T region);
String getRegionName(T region);
boolean containsReferences(T region);
boolean isWritable(T region);
boolean visitObjects(T region, ObjectVisitor visitor);
}
A set of access methods for visiting heap chunk memory. /** A set of access methods for visiting heap chunk memory. */
public interface HeapChunkAccess<T extends PointerBase> {
Return the start of the heap chunk. /** Return the start of the heap chunk. */
UnsignedWord getStart(T heapChunk);
Return the size of the heap chunk. /** Return the size of the heap chunk. */
UnsignedWord getSize(T heapChunk);
Return the address where allocation starts within the heap chunk. /** Return the address where allocation starts within the heap chunk. */
UnsignedWord getAllocationStart(T heapChunk);
Return the address where allocation has ended within the heap chunk. This is the first
address past the end of allocated space within the heap chunk.
/**
* Return the address where allocation has ended within the heap chunk. This is the first
* address past the end of allocated space within the heap chunk.
*/
UnsignedWord getAllocationEnd(T heapChunk);
Return the name of the region that contains the heap chunk. E.g., "young", "old", "free",
etc.
/**
* Return the name of the region that contains the heap chunk. E.g., "young", "old", "free",
* etc.
*/
String getRegion(T heapChunk);
Return true if the heap chunk is an aligned heap chunk, else false. /** Return true if the heap chunk is an aligned heap chunk, else false. */
boolean isAligned(T heapChunk);
}
A set of access methods for visiting code memory. /** A set of access methods for visiting code memory. */
public interface CodeAccess<T extends CodeInfo> {
UnsignedWord getStart(T codeInfo);
UnsignedWord getCodeAndDataMemorySize(T codeInfo);
UnsignedWord getNativeMetadataSize(T codeInfo);
String getName(T codeInfo);
}
}