void fatalErrorOccurred(Throwable t) {

		if (isDisposed) {
			return;
		}

		List<DomainObjectListener> listenersCopy =
			withLock(() -> new ArrayList<>(listeners.values()));

		dispose();

		Runnable errorTask = () -> {
			List<DomainObjectChangeRecord> records =
				Arrays.asList(new DomainObjectChangeRecord(DomainObjectEvent.ERROR, null, t));
			DomainObjectChangedEvent ev = new DomainObjectChangedEvent(src, records);
			for (DomainObjectListener l : listenersCopy) {
				try {
					l.domainObjectChanged(ev);
				}
				catch (Throwable t2) {
					// We don't care (probably because some other fatal error has already happened)
				}
			}
		};

		Swing.runLater(errorTask);
	}
Constructs a new DomainObjectChangeSupport object.

@param src The object to be put as the src for all events generated.
@param timeInterval The time (in milliseconds) this object will wait before flushing its
event buffer. If a new event comes in before the time expires, the timer is reset.
@param lock the lock used to verify that calls to {@link #flush()} are not performed while a
lock is held; this is the lock to guard the DB
Ghidra/Framework/Project/src/main/java/ghidra/framework/data/DomainObjectChangeSupport.java