private void asyncUpdateRootInfo(File[] localRoots, Callback callback) {
			try {
				// Populate root description strings with values that are hopefully faster to
				// get than the full description strings that will be fetched next.
				for (File root : localRoots) {
					String fastRootDescriptionString = getFastRootDescriptionString(root);
					if (fastRootDescriptionString != null) {
						descriptionMap.put(root, fastRootDescriptionString);
						callback.call();
					}
				}

				// Populate root description strings with final values, and icons
				for (File root : localRoots) {
					String slowRootDescriptionString = getSlowRootDescriptionString(root);
					if (slowRootDescriptionString != null) {
						descriptionMap.put(root, slowRootDescriptionString);
						callback.call();
					}

					Icon rootIcon = FS_VIEW.getSystemIcon(root); // possibly a slow call
					if (rootIcon == null) {
						rootIcon = PROBLEM_FILE_ICON;
					}
					iconMap.put(root, rootIcon);
					callback.call();
				}
			}
			finally {
				updatePending.set(false);
			}
		}
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