aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/concurrent/AbstractQueueVisitor.java
diff options
context:
space:
mode:
authorGravatar Eric Fellheimer <felly@google.com>2015-11-13 20:58:26 +0000
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2015-11-16 09:00:37 +0000
commit50230466ff83b9981cdd1826180b8a94bc413211 (patch)
treeb24aadca0b96858e3cf3350b2e7e03e38c1c7b19 /src/main/java/com/google/devtools/build/lib/concurrent/AbstractQueueVisitor.java
parente258d1db00a377e4b6e88cdd757c607ff1f758d9 (diff)
Reduce AutoBoxing-induced GC churn by using AtomicLongMap.
-- MOS_MIGRATED_REVID=107806099
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/concurrent/AbstractQueueVisitor.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/concurrent/AbstractQueueVisitor.java19
1 files changed, 5 insertions, 14 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/concurrent/AbstractQueueVisitor.java b/src/main/java/com/google/devtools/build/lib/concurrent/AbstractQueueVisitor.java
index 5412221977..496160979a 100644
--- a/src/main/java/com/google/devtools/build/lib/concurrent/AbstractQueueVisitor.java
+++ b/src/main/java/com/google/devtools/build/lib/concurrent/AbstractQueueVisitor.java
@@ -17,10 +17,9 @@ import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Function;
import com.google.common.base.Preconditions;
import com.google.common.base.Throwables;
-import com.google.common.collect.Maps;
+import com.google.common.util.concurrent.AtomicLongMap;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
-import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.RejectedExecutionException;
@@ -107,7 +106,7 @@ public class AbstractQueueVisitor implements QuiescingExecutor {
private boolean jobsMustBeStopped = false;
/** Map from thread to number of jobs executing in the thread. Used for interrupt handling. */
- private final Map<Thread, Long> jobs = Maps.newConcurrentMap();
+ private final AtomicLongMap<Thread> jobs = AtomicLongMap.create();
/** The {@link ExecutorService}. If !{@code concurrent}, this may be {@code null}. */
@Nullable private final ExecutorService executorService;
@@ -516,20 +515,12 @@ public class AbstractQueueVisitor implements QuiescingExecutor {
}
private void addJob(Thread thread) {
- // Note: this looks like a check-then-act race but it isn't, because each
- // key implies thread-locality.
- long count = jobs.containsKey(thread) ? jobs.get(thread) + 1 : 1;
- jobs.put(thread, count);
+ jobs.incrementAndGet(thread);
}
private void removeJob(Thread thread) {
- Long boxedCount = Preconditions.checkNotNull(jobs.get(thread),
- "Can't retrieve job after successfully adding it");
- long count = boxedCount - 1;
- if (count == 0) {
+ if (jobs.decrementAndGet(thread) == 0) {
jobs.remove(thread);
- } else {
- jobs.put(thread, count);
}
}
@@ -661,7 +652,7 @@ public class AbstractQueueVisitor implements QuiescingExecutor {
private void interruptInFlightTasks() {
Thread thisThread = Thread.currentThread();
- for (Thread thread : jobs.keySet()) {
+ for (Thread thread : jobs.asMap().keySet()) {
if (thisThread != thread) {
thread.interrupt();
}