// Copyright 2016 The Bazel Authors. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package com.google.devtools.build.lib.skyframe; import com.google.common.collect.Iterables; import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.util.Pair; import java.util.LinkedHashSet; /** * A class that, when beeing told about start and end of a package * being loaded, keeps track of the loading progress and provides it * as a human-readable string intended for the progress bar. */ public class PackageProgressReceiver { private int packagesCompleted; private LinkedHashSet<PackageIdentifier> pendingSet = new LinkedHashSet<>(); /** Register that loading a package has started. */ synchronized void startReadPackage(PackageIdentifier packageId) { pendingSet.add(packageId); } /** Register that loding a package has completed. */ synchronized void doneReadPackage(PackageIdentifier packageId) { packagesCompleted++; pendingSet.remove(packageId); } /** * Reset all instance variables of this object to a state equal to that of a newly * constructed object. */ public synchronized void reset() { packagesCompleted = 0; pendingSet = new LinkedHashSet<>(); } /** * Return the ordered pair of a consistent snapshot of the state, consisting of a human-readable * description of the progress achieved so far and a human readable description of the currently * running activities. The later always include the oldest loading package not finished loading. */ public synchronized Pair<String, String> progressState() { String progress = "" + packagesCompleted + " packages loaded"; StringBuffer activity = new StringBuffer(); if (pendingSet.size() > 0) { activity .append("currently loading: ") .append(Iterables.getFirst(pendingSet, null).toString()); if (pendingSet.size() > 1) { activity.append(" ... (" + pendingSet.size() + " packages)"); } } return new Pair<String, String>(progress, activity.toString()); } }