@Override
	public void addDataTypes(Collection<DataType> dataTypes, DataTypeConflictHandler handler,
			TaskMonitor monitor) throws CancelledException {
		lock.acquire();
		boolean isEquivalenceCacheOwner = activateEquivalenceCache();
		boolean isResolveCacheOwner = activateResolveCache();
		// Note: extended hold time on lock may cause the GUI to become unresponsive.  Consider 
		// releasing lock between resolves, although this exposes risk of having active resolve 
		// queue/cache without lock.
		try {
			monitor.setMessage("Adding datatypes...");
			monitor.setMaximum(dataTypes.size());
			monitor.setProgress(0);
			int i = 0;
			for (DataType dt : dataTypes) {
				monitor.checkCancelled();
				resolve(dt, handler);
				if (isResolveCacheOwner) {
					processResolveQueue(false);
				}
				monitor.setProgress(++i);
			}
		}
		finally {
			if (isResolveCacheOwner) {
				processResolveQueue(true);
			}
			if (isEquivalenceCacheOwner) {
				clearEquivalenceCache();
			}
			lock.release();
		}

	}
Complete datatype resolution after having attempted to find an existing equivalent type. 
An attempt is made to identify a conflicting datatype and determine a conflict resolution
using the specified conflict handler.
@param dataType datatype being resolved
@param sourceArchive source archive associated with new type (may be null)
@return resolved datatype (may be existing or newly added datatype)
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/DataTypeManagerDB.java