agent/src/share/classes/sun/jvm/hotspot/code/CodeCache.java
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File
JDK-8015774 Cdiff agent/src/share/classes/sun/jvm/hotspot/code/CodeCache.java
agent/src/share/classes/sun/jvm/hotspot/code/CodeCache.java
Print this page
*** 30,45 ****
import sun.jvm.hotspot.runtime.*;
import sun.jvm.hotspot.types.*;
import sun.jvm.hotspot.utilities.*;
public class CodeCache {
! private static AddressField heapField;
private static AddressField scavengeRootNMethodsField;
private static VirtualConstructor virtualConstructor;
- private CodeHeap heap;
-
static {
VM.registerVMInitializedObserver(new Observer() {
public void update(Observable o, Object data) {
initialize(VM.getVM().getTypeDataBase());
}
--- 30,43 ----
import sun.jvm.hotspot.runtime.*;
import sun.jvm.hotspot.types.*;
import sun.jvm.hotspot.utilities.*;
public class CodeCache {
! private static GrowableArray<CodeHeap> heapArray;
private static AddressField scavengeRootNMethodsField;
private static VirtualConstructor virtualConstructor;
static {
VM.registerVMInitializedObserver(new Observer() {
public void update(Observable o, Object data) {
initialize(VM.getVM().getTypeDataBase());
}
*** 47,57 ****
}
private static synchronized void initialize(TypeDataBase db) {
Type type = db.lookupType("CodeCache");
! heapField = type.getAddressField("_heap");
scavengeRootNMethodsField = type.getAddressField("_scavenge_root_nmethods");
virtualConstructor = new VirtualConstructor(db);
// Add mappings for all possible CodeBlob subclasses
virtualConstructor.addMapping("BufferBlob", BufferBlob.class);
--- 45,58 ----
}
private static synchronized void initialize(TypeDataBase db) {
Type type = db.lookupType("CodeCache");
! // Get array of CodeHeaps
! AddressField heapsField = type.getAddressField("_heaps");
! heapArray = GrowableArray.create(heapsField.getValue(), new StaticBaseConstructor<CodeHeap>(CodeHeap.class));
!
scavengeRootNMethodsField = type.getAddressField("_scavenge_root_nmethods");
virtualConstructor = new VirtualConstructor(db);
// Add mappings for all possible CodeBlob subclasses
virtualConstructor.addMapping("BufferBlob", BufferBlob.class);
*** 65,84 ****
virtualConstructor.addMapping("ExceptionBlob", ExceptionBlob.class);
virtualConstructor.addMapping("UncommonTrapBlob", UncommonTrapBlob.class);
}
}
- public CodeCache() {
- heap = (CodeHeap) VMObjectFactory.newObject(CodeHeap.class, heapField.getValue());
- }
-
public NMethod scavengeRootMethods() {
return (NMethod) VMObjectFactory.newObject(NMethod.class, scavengeRootNMethodsField.getValue());
}
public boolean contains(Address p) {
! return getHeap().contains(p);
}
/** When VM.getVM().isDebugging() returns true, this behaves like
findBlobUnsafe */
public CodeBlob findBlob(Address start) {
--- 66,86 ----
virtualConstructor.addMapping("ExceptionBlob", ExceptionBlob.class);
virtualConstructor.addMapping("UncommonTrapBlob", UncommonTrapBlob.class);
}
}
public NMethod scavengeRootMethods() {
return (NMethod) VMObjectFactory.newObject(NMethod.class, scavengeRootNMethodsField.getValue());
}
public boolean contains(Address p) {
! for (int i = 0; i < heapArray.length(); ++i) {
! if (heapArray.at(i).contains(p)) {
! return true;
! }
! }
! return false;
}
/** When VM.getVM().isDebugging() returns true, this behaves like
findBlobUnsafe */
public CodeBlob findBlob(Address start) {
*** 95,112 ****
return result;
}
public CodeBlob findBlobUnsafe(Address start) {
CodeBlob result = null;
try {
! result = (CodeBlob) virtualConstructor.instantiateWrapperFor(getHeap().findStart(start));
}
catch (WrongTypeException wte) {
Address cbAddr = null;
try {
! cbAddr = getHeap().findStart(start);
}
catch (Exception findEx) {
findEx.printStackTrace();
}
--- 97,124 ----
return result;
}
public CodeBlob findBlobUnsafe(Address start) {
CodeBlob result = null;
+ CodeHeap containing_heap = null;
+ for (int i = 0; i < heapArray.length(); ++i) {
+ if (heapArray.at(i).contains(start)) {
+ containing_heap = heapArray.at(i);
+ break;
+ }
+ }
+ if (containing_heap == null) {
+ return null;
+ }
try {
! result = (CodeBlob) virtualConstructor.instantiateWrapperFor(containing_heap.findStart(start));
}
catch (WrongTypeException wte) {
Address cbAddr = null;
try {
! cbAddr = containing_heap.findStart(start);
}
catch (Exception findEx) {
findEx.printStackTrace();
}
*** 165,206 ****
throw new RuntimeException(message);
}
}
public void iterate(CodeCacheVisitor visitor) {
! CodeHeap heap = getHeap();
! Address ptr = heap.begin();
! Address end = heap.end();
!
! visitor.prologue(ptr, end);
CodeBlob lastBlob = null;
! while (ptr != null && ptr.lessThan(end)) {
try {
// Use findStart to get a pointer inside blob other findBlob asserts
! CodeBlob blob = findBlobUnsafe(heap.findStart(ptr));
if (blob != null) {
visitor.visit(blob);
if (blob == lastBlob) {
throw new InternalError("saw same blob twice");
}
lastBlob = blob;
}
} catch (RuntimeException e) {
e.printStackTrace();
}
! Address next = heap.nextBlock(ptr);
if (next != null && next.lessThan(ptr)) {
throw new InternalError("pointer moved backwards");
}
ptr = next;
}
visitor.epilogue();
}
//--------------------------------------------------------------------------------
// Internals only below this point
//
! private CodeHeap getHeap() {
! return heap;
}
}
--- 177,235 ----
throw new RuntimeException(message);
}
}
public void iterate(CodeCacheVisitor visitor) {
! visitor.prologue(lowBound(), highBound());
CodeBlob lastBlob = null;
!
! for (int i = 0; i < heapArray.length(); ++i) {
! CodeHeap current_heap = heapArray.at(i);
! Address ptr = current_heap.begin();
! while (ptr != null && ptr.lessThan(current_heap.end())) {
try {
// Use findStart to get a pointer inside blob other findBlob asserts
! CodeBlob blob = findBlobUnsafe(current_heap.findStart(ptr));
if (blob != null) {
visitor.visit(blob);
if (blob == lastBlob) {
throw new InternalError("saw same blob twice");
}
lastBlob = blob;
}
} catch (RuntimeException e) {
e.printStackTrace();
}
! Address next = current_heap.nextBlock(ptr);
if (next != null && next.lessThan(ptr)) {
throw new InternalError("pointer moved backwards");
}
ptr = next;
}
+ }
visitor.epilogue();
}
//--------------------------------------------------------------------------------
// Internals only below this point
//
! private Address lowBound() {
! Address low = heapArray.at(0).begin();
! for (int i = 1; i < heapArray.length(); ++i) {
! if (heapArray.at(i).begin().lessThan(low)) {
! low = heapArray.at(i).begin();
! }
! }
! return low;
! }
!
! private Address highBound() {
! Address high = heapArray.at(0).end();
! for (int i = 1; i < heapArray.length(); ++i) {
! if (heapArray.at(i).end().greaterThan(high)) {
! high = heapArray.at(i).end();
! }
! }
! return high;
}
}
agent/src/share/classes/sun/jvm/hotspot/code/CodeCache.java
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File