private void add()

in core/org.openjdk.jmc.flightrecorder/src/main/java/org/openjdk/jmc/flightrecorder/memleak/ReferenceTreeModel.java [309:392]


	private void add(
		IItem item, IMemberAccessor<IMCOldObject, IItem> objectAccessor,
		IMemberAccessor<IQuantity, IItem> allocationTimeAccessor,
		IMemberAccessor<IMCOldObjectGcRoot, IItem> gcRootAccessor, IType<IItem> type) {
		Set<IQuantity> addresses = new HashSet<>();

		IQuantity timestamp = allocationTimeAccessor.getMember(item);
		IMCOldObject object = objectAccessor.getMember(item);

		addresses.add(object.getAddress());
		ReferenceTreeObject last = map.get(object.getAddress());
		if (last == null) {
			// initializing new leak object
			last = new ReferenceTreeObject(timestamp, object);
			last.addItem(item);
			leakObjects.add(last);
			map.put(object.getAddress(), last);
		}
		ReferenceTreeObject node = null;
		boolean root = true;
		object = object.getReferrer();
		IQuantity address;
		while (object != null) {
			address = object.getAddress();
			if (address.longValue() == 0) {
				Logger.getLogger(ReferenceTreeModel.class.getName()).log(Level.WARNING,
						"Found object without address, breaking parsing of referrer chain."); //$NON-NLS-1$
				break;
			}
			if (addresses.contains(address)) {
				Logger.getLogger(ReferenceTreeModel.class.getName()).log(Level.WARNING,
						"Same addresses multiple times in same chain " + address); //$NON-NLS-1$
				break;
			} else {
				addresses.add(address);
			}
			node = map.get(address);
			if (node == null) {
				node = new ReferenceTreeObject(timestamp, object);
				node.addRoot(gcRootAccessor.getMember(item));
				map.put(address, node);
				object = object.getReferrer();
			} else {
				if (last != null) {
					node.addChild(last);

					// Update Root Object with oldObjectSample ref
					ReferenceTreeObject parent = node.getParent();
					if (parent == null) {
						node.updateOldObjectSamples(map.get(objectAccessor.getMember(item).getAddress()));
					}
					else {
						while (parent.getParent() != null) {
							parent = parent.getParent();
						}
						parent.updateOldObjectSamples(map.get(objectAccessor.getMember(item).getAddress()));
					}
				}
				root = false;
				break;
			}
			if (last != null) {
				node.addChild(last);
			}
			last = node;
		}
		if (last != null) {
			if (root) {
				rootObjects.add(last);
				last.updateOldObjectSamples(map.get(objectAccessor.getMember(item).getAddress()));
				rootObjectsByLeakItems.put(item, last);
			}
		}
		object = objectAccessor.getMember(item);
		if (object != null) {
			address = object.getAddress();
			node = map.get(address);
			while (node != null) {
				node.incrementObjectsKeptAliveCount();
				node.addItem(item);
				node = node.getParent();
			}
		}
	}