| // 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 being 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()); |
| } |
| } |