Mercurial > hg > truffle
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 } |