aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/skyframe/PackageProgressReceiver.java
diff options
context:
space:
mode:
authorGravatar Klaus Aehlig <aehlig@google.com>2016-05-27 11:42:32 +0000
committerGravatar Dmitry Lomov <dslomov@google.com>2016-05-30 09:17:25 +0000
commitc6fd6bb3caa78518fbb9148d81efecdee540c29a (patch)
tree2b7cd0063ad4da4b4fe6c0c633e9e5fc45ac7534 /src/main/java/com/google/devtools/build/lib/skyframe/PackageProgressReceiver.java
parent2fba42e27ec517a8819236d15e45a42bfd5c1823 (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.java73
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());
+ }
+}