public void iterateMap()

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;
					}
				}
			}
		}
	}