private static void findWindows(Window win, Set<Window> windowSet) {
		DockingWindowManager winMgr = DockingWindowManager.getInstance(win);
		if (winMgr != null) {
			List<Window> dockableWinList = Collections.emptyList();

			try {
				dockableWinList = winMgr.getWindows(true);
			}
			catch (ConcurrentModificationException cme) {
				// The call to getWindows() relies on a data structure that is modified by the
				// swing thread.  Unfortunately, at this point, we may be waiting for the swing
				// thread to do some work and we don't want to deadlock the test here by using
				// a call to runSwing().
				//
				// So, just ignore the exception.  Client code that *really* wants all windows,
				// like that which waits for windows, should be calling this method repeatedly anyway.
			}
			for (Window w : dockableWinList) {
				windowSet.add(w);
				findOwnedWindows(w, windowSet);
			}
		}
		else {
			findOwnedWindows(win, windowSet);
		}
	}
Searches for the first occurrence of a {@link ComponentProvider} that is an instance of
the given <code>providerClass</code>.  This method will repeat the search every
{@link #DEFAULT_WAIT_DELAY} milliseconds
until the provider is found, or the maximum number of searches has been reached, where
<code>maximum number of searches = MaxTimeMS / {@link #DEFAULT_WAIT_DELAY} </code>

@param parentWindow The window that will become the parent window of the provider (this is
       typically the tool's frame).
@param providerClass The class of the ComponentProvider to locate.
@param maxTimeMS The maximum amount of time to wait.  This is an approximation (see above).
@return The component provider, or null if one cannot be found
@deprecated Instead call one of the methods that does not take a timeout
            (we are standardizing timeouts).  The timeouts passed to this method will
            be ignored in favor of the standard value.
Ghidra/Framework/Docking/src/main/java/docking/test/AbstractDockingTest.java