diff options
author | 2016-05-27 11:42:32 +0000 | |
---|---|---|
committer | 2016-05-30 09:17:25 +0000 | |
commit | c6fd6bb3caa78518fbb9148d81efecdee540c29a (patch) | |
tree | 2b7cd0063ad4da4b4fe6c0c633e9e5fc45ac7534 /src/main/java/com/google/devtools/build/lib/skyframe/PackageProgressReceiver.java | |
parent | 2fba42e27ec517a8819236d15e45a42bfd5c1823 (diff) |
experimental UI: track touched packages during loading/analysis
To give a better understanding of which packages are on the critical
path during loading and analysis, provide information in the same way
as during execution: show the earliest started, but not yet completed
package. As not all packages looked at during the analysis phase are
reported to the progress receiver, use a custom class to aggregate those
data.
--
Change-Id: I03c25efdecb4124e1bc06fce8be9175dc56b5500
Reviewed-on: https://bazel-review.googlesource.com/#/c/3700
MOS_MIGRATED_REVID=123408689
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe/PackageProgressReceiver.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/skyframe/PackageProgressReceiver.java | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageProgressReceiver.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageProgressReceiver.java new file mode 100644 index 0000000000..4faf952dd9 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageProgressReceiver.java @@ -0,0 +1,73 @@ +// 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.devtools.build.lib.cmdline.PackageIdentifier; + +import com.google.devtools.build.lib.util.Pair; + +import java.util.ArrayDeque; +import java.util.Deque; + +/** + * 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 intened for the progress bar. + */ +public class PackageProgressReceiver { + + private int packagesCompleted; + private Deque<PackageIdentifier> pending = new ArrayDeque<>(); + + /** + * Register that loading a package has started. + */ + public synchronized void startReadPackage(PackageIdentifier packageId) { + pending.addLast(packageId); + } + + /** + * Register that loding a package has completed. + */ + public synchronized void doneReadPackage(PackageIdentifier packageId) { + packagesCompleted++; + pending.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; + pending = new ArrayDeque<>(); + } + + /** + * 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 (pending.size() > 0) { + activity.append("currently loading: ").append(pending.peekFirst().toString()); + if (pending.size() > 1) { + activity.append(" ... (" + pending.size() + " packages)"); + } + } + return new Pair<String, String>(progress, activity.toString()); + } +} |