blob: 5159449e8d868c9cce269edfb78be7722925b3b2 [file] [log] [blame]
// 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());
}
}