docs: @SuppressWarnings("checkstyle:npathcomplexity")
  	private static void runDependencyGraph(Queue<DependencyNode> roots, List<Service> infraServices, List<Service> freeServices,
  			Accessors accessors) {
  		final boolean async = accessors.isAsyncStateWaitingEnabled();
  		final Set<Class<? extends Service>> executed = new TreeSet<>(Comparators.CLASS_COMPARATOR);
  		accessors.runInfrastructureServicesBefore(infraServices);
  		accessors.runFreeServicesBefore(freeServices);
  		while (!roots.isEmpty()) {
  			final DependencyNode node = roots.remove();
  			assert node != null && node.getType() != null;
  			if (!executed.contains(node.getType())) {
  				executed.add(node.getType());
  				roots.addAll(node.getNextServices());
  				roots.addAll(node.getNextWeakServices());
  				assert node.getService() != null;
  				if (async) {
  					for (final WeakReference<DependencyNode> asyncService : node.getAsyncStateServices()) {
  						final AsyncStateService as = (AsyncStateService) (asyncService.get().getService());
  						assert as != null;
  						while (!as.isReadyForOtherServices()) {
  							Thread.yield();
  						}
  					}
  				}
  				accessors.run(node.getService());
  			}
  		}
  		accessors.runFreeServicesAfter(freeServices);
  		accessors.runInfrastructureServicesAfter(infraServices);
  	}