void updateRootInfo(Callback callback) {
			if (updatePending.compareAndSet(false, true)) {
				File[] localRoots = listRoots(); // possibly sloooow
				synchronized (this) {
					roots = List.of(localRoots);
				}
				for (File root : localRoots) {
					descriptionMap.put(root, getInitialRootDescriptionString(root));
					iconMap.put(root, PENDING_ROOT_ICON);
				}

				Thread updateThread = new Thread(
					() -> asyncUpdateRootInfo(localRoots, Callback.dummyIfNull(callback)));
				updateThread.setName("GhidraFileChooser File System Updater");
				updateThread.start();
				// updateThread will unset the updatePending flag when done
			}
		}
If there is no pending update, updates information about the root filesystem locations
present on the local computer, in a partially blocking manner.  The initial list 
of locations is queried directly, and the descriptions and icons for the root 
locations are fetched in a background thread.
<p>
When new information is found during the background querying, the listener callback 
will be executed so that it can cause UI updates.
<p>
If there is a pending background update, no-op.
  
@param callback callback
Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/LocalFileChooserModel.java