in application/org.openjdk.jmc.joverflow/src/main/java/org/openjdk/jmc/joverflow/descriptors/ConcurrentHashMapDescriptor.java [251:343]
public void iterateMap(MapIteratorCallback cb) {
JavaThing segsThing = fields[factory.segmentsFieldIdx];
if (segsThing == null || !(segsThing instanceof JavaObjectArray)) {
return;
}
JavaObjectArray segments = (JavaObjectArray) segsThing;
if (!cb.scanImplementationObject(segments)) {
return;
}
JavaHeapObject[] segs = segments.getElements();
for (JavaHeapObject seg : segs) {
if (seg == null) {
continue;
}
cb.scanImplementationObject(seg);
}
int numElements = getNumElements();
if (numElements == 0) {
return;
}
int keyFieldIdx = -1, valueFieldIdx = -1;
for (JavaHeapObject segThing : segs) {
// Can be null in JDK7/8, where individual Segments are created lazily.
if (segThing == null || !(segThing instanceof JavaObject)) {
continue;
}
JavaObject seg = (JavaObject) segThing;
JavaThing segTableField = seg.getField(factory.segTableFieldIdx);
if (segTableField == null || segTableField instanceof UnresolvedObject) {
continue;
}
JavaObjectArray segTable = (JavaObjectArray) segTableField;
if (!cb.scanImplementationObject(segTable)) {
continue;
}
int nElsInSeg = getNumElementsInSegment(seg);
if (nElsInSeg == 0) {
continue;
}
JavaHeapObject[] table = segTable.getElements();
int nextFieldIdx = factory.getEntryNextFieldIdx(table);
JavaThing[] entryFields = null;
outerLoop: for (JavaHeapObject entryThing : table) {
if (entryThing == null || !(entryThing instanceof JavaObject)) {
continue;
}
JavaObject entry = (JavaObject) entryThing;
while (true) {
if (!cb.scanImplementationObject(entry)) {
break;
}
if (keyFieldIdx == -1) {
keyFieldIdx = factory.getKeyFieldIdx(entry);
valueFieldIdx = factory.getValueFieldIdx(entry);
}
entryFields = entry.getFields(entryFields);
JavaThing keyThing = entryFields[keyFieldIdx];
JavaThing valueThing = entryFields[valueFieldIdx];
JavaHeapObject key = null, value = null;
if (keyThing instanceof JavaHeapObject) {
key = (JavaHeapObject) keyThing;
}
if (valueThing instanceof JavaHeapObject) {
value = (JavaHeapObject) valueThing;
}
if (!cb.scanMapEntry(key, value)) {
break outerLoop;
}
JavaObject prevEntry = entry;
JavaThing entryThing1 = entryFields[nextFieldIdx];
if (entryThing1 == null || !(entryThing1 instanceof JavaObject)) {
break;
}
entry = (JavaObject) entryThing1;
if (entry == prevEntry) {
break;
}
}
}
}
}