protected void dispose() {

		synchronized (this) {
			if (disposed) {
				return;
			}

			closed = true;
			disposed = true;

			if (userDataReconcileTimer != null) {
				userDataReconcileTimer.stop();
			}
			if (userDataReconcileThread != null) {
				userDataReconcileThread.interrupt();
			}

			// stop any folder refresh currently in progress
			projectDisposalMonitor.cancel();

			listenerList.clearAll();
		}

		if (fileSystem != null) {
			synchronized (fileSystem) {
				if (versionedFSListener != null) {
					versionedFileSystem.removeFileSystemListener(versionedFSListener);
				}
				if (repository != null) {
					repository.disconnect();
					repository = null;
				}
				if (rootFolderData != null) {
					rootFolderData.dispose();
				}
				if (versionedFileSystem != null) {
					versionedFileSystem.dispose();
				}
				fileSystem.dispose();
			}
		}

		if (projectLock != null) {
			projectLock.release();
		}
	}
Immediately dispose this project data store instance.  If this project has an associated
{@link RepositoryAdapter} it will be disconnected as well.  This method should generally not
be used directly when there may be open {@link DomainObject} instances which may rely
on an associated server connection.  The {@link #clone()} method should be used when
open {@link DomainObject} instances may exist and should be allowed to persist until
they are closed.
Ghidra/Framework/Project/src/main/java/ghidra/framework/data/DefaultProjectData.java