diff options
author | Eric Fellheimer <felly@google.com> | 2015-11-13 20:58:26 +0000 |
---|---|---|
committer | Damien Martin-Guillerez <dmarting@google.com> | 2015-11-16 09:00:37 +0000 |
commit | 50230466ff83b9981cdd1826180b8a94bc413211 (patch) | |
tree | b24aadca0b96858e3cf3350b2e7e03e38c1c7b19 /src/main/java/com/google/devtools/build/lib/concurrent/AbstractQueueVisitor.java | |
parent | e258d1db00a377e4b6e88cdd757c607ff1f758d9 (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.java | 19 |
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(); } |