agent/src/share/classes/sun/jvm/hotspot/code/CodeCache.java
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File
*** old/agent/src/share/classes/sun/jvm/hotspot/code/CodeCache.java	Thu Oct 10 17:08:01 2013
--- new/agent/src/share/classes/sun/jvm/hotspot/code/CodeCache.java	Thu Oct 10 17:08:00 2013

*** 30,45 **** --- 30,43 ---- import sun.jvm.hotspot.runtime.*; import sun.jvm.hotspot.types.*; import sun.jvm.hotspot.utilities.*; public class CodeCache { ! private static AddressField heapField; ! private static GrowableArray<CodeHeap> heapArray; 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()); }
*** 47,57 **** --- 45,58 ---- } private static synchronized void initialize(TypeDataBase db) { Type type = db.lookupType("CodeCache"); heapField = type.getAddressField("_heap"); + // 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 **** --- 66,86 ---- 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); + 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 **** --- 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(getHeap().findStart(start)); ! result = (CodeBlob) virtualConstructor.instantiateWrapperFor(containing_heap.findStart(start)); } catch (WrongTypeException wte) { Address cbAddr = null; try { ! cbAddr = getHeap().findStart(start); ! cbAddr = containing_heap.findStart(start); } catch (Exception findEx) { findEx.printStackTrace(); }
*** 165,206 **** --- 177,235 ---- throw new RuntimeException(message); } } public void iterate(CodeCacheVisitor visitor) { ! CodeHeap heap = getHeap(); Address ptr = heap.begin(); Address end = heap.end(); visitor.prologue(ptr, end); ! visitor.prologue(lowBound(), highBound()); CodeBlob lastBlob = null; while (ptr != null && ptr.lessThan(end)) { + + 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 CodeHeap getHeap() { ! return heap; ! 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