comparison agent/src/share/classes/sun/jvm/hotspot/gc_implementation/g1/HeapRegionSeq.java @ 12904:9e5fadad7fdf

8025925: jmap fails with "field _length not found in type HeapRegionSeq" Summary: The change JDK-7163191 changed the data layout of a class that is referenced by the java code of the SA agent. This fix synchronizes the SA agent with that change. Reviewed-by: sla, mgerdin
author tschatzl
date Wed, 16 Oct 2013 11:46:06 +0200
parents 720b6a76dd9d
children 50287b659eb8
comparison
equal deleted inserted replaced
12903:ec2e26e26183 12904:9e5fadad7fdf
1 /* 1 /*
2 * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. 2 * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 * 4 *
5 * This code is free software; you can redistribute it and/or modify it 5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as 6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
35 import sun.jvm.hotspot.types.AddressField; 35 import sun.jvm.hotspot.types.AddressField;
36 import sun.jvm.hotspot.types.CIntegerField; 36 import sun.jvm.hotspot.types.CIntegerField;
37 import sun.jvm.hotspot.types.Type; 37 import sun.jvm.hotspot.types.Type;
38 import sun.jvm.hotspot.types.TypeDataBase; 38 import sun.jvm.hotspot.types.TypeDataBase;
39 39
40 // Mirror class for HeapRegionSeq. It's essentially an index -> HeapRegion map. 40 // Mirror class for HeapRegionSeq. It essentially encapsulates the G1HeapRegionTable.
41 41
42 public class HeapRegionSeq extends VMObject { 42 public class HeapRegionSeq extends VMObject {
43 // HeapRegion** _regions; 43 // G1HeapRegionTable _regions
44 static private AddressField regionsField; 44 static private long regionsFieldOffset;
45 // uint _length;
46 static private CIntegerField lengthField;
47 45
48 static { 46 static {
49 VM.registerVMInitializedObserver(new Observer() { 47 VM.registerVMInitializedObserver(new Observer() {
50 public void update(Observable o, Object data) { 48 public void update(Observable o, Object data) {
51 initialize(VM.getVM().getTypeDataBase()); 49 initialize(VM.getVM().getTypeDataBase());
54 } 52 }
55 53
56 static private synchronized void initialize(TypeDataBase db) { 54 static private synchronized void initialize(TypeDataBase db) {
57 Type type = db.lookupType("HeapRegionSeq"); 55 Type type = db.lookupType("HeapRegionSeq");
58 56
59 regionsField = type.getAddressField("_regions"); 57 regionsFieldOffset = type.getField("_regions").getOffset();
60 lengthField = type.getCIntegerField("_length");
61 } 58 }
62 59
63 private HeapRegion at(long index) { 60 private G1HeapRegionTable regions() {
64 Address arrayAddr = regionsField.getValue(addr); 61 Address regionsAddr = addr.addOffsetTo(regionsFieldOffset);
65 // Offset of &_region[index] 62 return (G1HeapRegionTable) VMObjectFactory.newObject(G1HeapRegionTable.class,
66 long offset = index * VM.getVM().getAddressSize(); 63 regionsAddr);
67 Address regionAddr = arrayAddr.getAddressAt(offset);
68 return (HeapRegion) VMObjectFactory.newObject(HeapRegion.class,
69 regionAddr);
70 } 64 }
71 65
72 public long length() { 66 public long length() {
73 return lengthField.getValue(addr); 67 return regions().length();
74 }
75
76 private class HeapRegionIterator implements Iterator<HeapRegion> {
77 private long index;
78 private long length;
79
80 @Override
81 public boolean hasNext() { return index < length; }
82
83 @Override
84 public HeapRegion next() { return at(index++); }
85
86 @Override
87 public void remove() { /* not supported */ }
88
89 HeapRegionIterator(Address addr) {
90 index = 0;
91 length = length();
92 }
93 } 68 }
94 69
95 public Iterator<HeapRegion> heapRegionIterator() { 70 public Iterator<HeapRegion> heapRegionIterator() {
96 return new HeapRegionIterator(addr); 71 return regions().heapRegionIterator();
97 } 72 }
98 73
99 public HeapRegionSeq(Address addr) { 74 public HeapRegionSeq(Address addr) {
100 super(addr); 75 super(addr);
101 } 76 }