aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build
diff options
context:
space:
mode:
authorGravatar Nathan Harmata <nharmata@google.com>2016-09-19 20:32:46 +0000
committerGravatar Laszlo Csomor <laszlocsomor@google.com>2016-09-20 06:46:12 +0000
commit243cd7559926dd5ef03609197b5c6bfaf874eaaa (patch)
tree015e5a4ccd175bc0f2f49dfb29999a3297b84dc1 /src/main/java/com/google/devtools/build
parent77bd24b0efa3c53b4c4cfdf5b6db00db8cf69063 (diff)
Introduce NamedForkJoinPool, a ForkJoinPool with named worker threads.
-- MOS_MIGRATED_REVID=133624676
Diffstat (limited to 'src/main/java/com/google/devtools/build')
-rw-r--r--src/main/java/com/google/devtools/build/lib/concurrent/NamedForkJoinPool.java65
1 files changed, 65 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/concurrent/NamedForkJoinPool.java b/src/main/java/com/google/devtools/build/lib/concurrent/NamedForkJoinPool.java
new file mode 100644
index 0000000000..33a5e86f5b
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/concurrent/NamedForkJoinPool.java
@@ -0,0 +1,65 @@
+// 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.concurrent;
+
+import java.util.concurrent.ForkJoinPool;
+import java.util.concurrent.ForkJoinWorkerThread;
+import java.util.concurrent.atomic.AtomicLong;
+
+/** A {@link ForkJoinPool} with support for thread naming. */
+public class NamedForkJoinPool extends ForkJoinPool {
+
+ protected NamedForkJoinPool(String name, int poolSize) {
+ super(
+ poolSize,
+ new NamedForkJoinWorkerThreadFactory(name + "-%s"),
+ /*getUncaughtExceptionHandler=*/ null,
+ /*asyncMode=*/ false);
+ }
+
+ public static NamedForkJoinPool newNamedPool(String name, int numThreads) {
+ return new NamedForkJoinPool(name, numThreads);
+ }
+
+ /** A {@link ForkJoinWorkerThread} named on construction. */
+ private static class NamedForkJoinWorkerThread extends ForkJoinWorkerThread {
+
+ public NamedForkJoinWorkerThread(ForkJoinPool forkJoinPool, String name) {
+ super(forkJoinPool);
+ this.setName(name);
+ }
+ }
+
+ /**
+ * A factory for {@link NamedForkJoinWorkerThread}s that names those threads using a
+ * client-provided name format that consumes a thread index.
+ */
+ private static class NamedForkJoinWorkerThreadFactory implements ForkJoinWorkerThreadFactory {
+
+ private final String nameFormat;
+ private final AtomicLong nextUnusedThreadIndex = new AtomicLong(0L);
+
+ public NamedForkJoinWorkerThreadFactory(String nameFormat) {
+ // Fail fast if nameFormat is bad.
+ String ignored = String.format(nameFormat, 0L);
+ this.nameFormat = nameFormat;
+ }
+
+ @Override
+ public ForkJoinWorkerThread newThread(ForkJoinPool forkJoinPool) {
+ return new NamedForkJoinWorkerThread(
+ forkJoinPool, String.format(nameFormat, nextUnusedThreadIndex.getAndIncrement()));
+ }
+ }
+}