# HG changeset patch # User igerasim # Date 1531268380 25200 # Tue Jul 10 17:19:40 2018 -0700 # Node ID efd8654fc0075554674112858e648745ddf2783d # Parent 0d28f82ecac63f5b321854d4d62c11f221b694d6 [mq]: 8206122-Use-Queue-in-place-of-ArrayList-when-need-to-remove-first-element diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTaskPool.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTaskPool.java --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTaskPool.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTaskPool.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,10 +27,22 @@ import java.io.PrintStream; import java.io.Writer; +import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Queue; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; + +import javax.tools.Diagnostic; +import javax.tools.DiagnosticListener; +import javax.tools.JavaFileManager; +import javax.tools.JavaFileObject; import com.sun.source.tree.ClassTree; import com.sun.source.tree.CompilationUnitTree; @@ -53,21 +65,8 @@ import com.sun.tools.javac.comp.Modules; import com.sun.tools.javac.main.Arguments; import com.sun.tools.javac.main.JavaCompiler; +import com.sun.tools.javac.model.JavacElements; import com.sun.tools.javac.tree.JCTree.JCClassDecl; - -import javax.tools.Diagnostic; -import javax.tools.DiagnosticListener; -import javax.tools.JavaFileManager; -import javax.tools.JavaFileObject; - -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.StreamSupport; - -import com.sun.tools.javac.model.JavacElements; import com.sun.tools.javac.util.Context; import com.sun.tools.javac.util.DefinedBy; import com.sun.tools.javac.util.DefinedBy.Api; @@ -101,9 +100,10 @@ public class JavacTaskPool { private static final JavacTool systemProvider = JavacTool.create(); + private static final Queue EMPTY_QUEUE = new ArrayDeque<>(0); private final int maxPoolSize; - private final Map, List> options2Contexts = new HashMap<>(); + private final Map, Queue> options2Contexts = new HashMap<>(); private int id; private int statReused = 0; @@ -159,14 +159,14 @@ ReusableContext ctx; synchronized (this) { - List cached = - options2Contexts.getOrDefault(opts, Collections.emptyList()); + Queue cached = + options2Contexts.getOrDefault(opts, EMPTY_QUEUE); if (cached.isEmpty()) { ctx = new ReusableContext(opts); statNew++; } else { - ctx = cached.remove(0); + ctx = cached.remove(); statReused++; } } @@ -200,7 +200,7 @@ options2Contexts.get(toRemove.arguments).remove(toRemove); statRemoved++; } - options2Contexts.computeIfAbsent(ctx.arguments, x -> new ArrayList<>()).add(ctx); + options2Contexts.computeIfAbsent(ctx.arguments, x -> new ArrayDeque<>()).add(ctx); ctx.timeStamp = id++; } } diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Analyzer.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Analyzer.java --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Analyzer.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Analyzer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,11 +25,20 @@ package com.sun.tools.javac.comp; -import java.util.ArrayList; +import java.util.ArrayDeque; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.Map; +import java.util.Queue; +import java.util.function.Predicate; import com.sun.source.tree.LambdaExpressionTree; +import com.sun.source.tree.NewClassTree; +import com.sun.tools.javac.code.Flags; +import com.sun.tools.javac.code.Kinds.Kind; import com.sun.tools.javac.code.Source; import com.sun.tools.javac.code.Source.Feature; +import com.sun.tools.javac.code.Symbol.ClassSymbol; import com.sun.tools.javac.code.Type; import com.sun.tools.javac.code.Types; import com.sun.tools.javac.comp.ArgumentAttr.LocalCacheContext; @@ -48,7 +57,9 @@ import com.sun.tools.javac.tree.JCTree.JCNewClass; import com.sun.tools.javac.tree.JCTree.JCStatement; import com.sun.tools.javac.tree.JCTree.JCSwitch; +import com.sun.tools.javac.tree.JCTree.JCTry; import com.sun.tools.javac.tree.JCTree.JCTypeApply; +import com.sun.tools.javac.tree.JCTree.JCUnary; import com.sun.tools.javac.tree.JCTree.JCVariableDecl; import com.sun.tools.javac.tree.JCTree.JCWhileLoop; import com.sun.tools.javac.tree.JCTree.Tag; @@ -56,9 +67,11 @@ import com.sun.tools.javac.tree.TreeInfo; import com.sun.tools.javac.tree.TreeMaker; import com.sun.tools.javac.tree.TreeScanner; +import com.sun.tools.javac.util.Assert; import com.sun.tools.javac.util.Context; import com.sun.tools.javac.util.DefinedBy; import com.sun.tools.javac.util.DefinedBy.Api; +import com.sun.tools.javac.util.DiagnosticSource; import com.sun.tools.javac.util.JCDiagnostic.DiagnosticType; import com.sun.tools.javac.util.List; import com.sun.tools.javac.util.ListBuffer; @@ -66,20 +79,6 @@ import com.sun.tools.javac.util.Options; import com.sun.tools.javac.util.Position; -import java.util.EnumSet; -import java.util.HashMap; -import java.util.Map; -import java.util.function.Predicate; - -import com.sun.source.tree.NewClassTree; -import com.sun.tools.javac.code.Flags; -import com.sun.tools.javac.code.Kinds.Kind; -import com.sun.tools.javac.code.Symbol.ClassSymbol; -import com.sun.tools.javac.tree.JCTree.JCTry; -import com.sun.tools.javac.tree.JCTree.JCUnary; -import com.sun.tools.javac.util.Assert; -import com.sun.tools.javac.util.DiagnosticSource; - import static com.sun.tools.javac.code.Flags.GENERATEDCONSTR; import static com.sun.tools.javac.code.TypeTag.CLASS; import static com.sun.tools.javac.tree.JCTree.Tag.APPLY; @@ -521,11 +520,11 @@ */ DeferredAnalysisHelper queueDeferredHelper = new DeferredAnalysisHelper() { - Map> Q = new HashMap<>(); + Map> Q = new HashMap<>(); @Override public void queue(RewritingContext rewriting) { - ArrayList s = Q.computeIfAbsent(rewriting.env.enclClass.sym.outermostClass(), k -> new ArrayList<>()); + Queue s = Q.computeIfAbsent(rewriting.env.enclClass.sym.outermostClass(), k -> new ArrayDeque<>()); s.add(rewriting); } @@ -535,9 +534,9 @@ DeferredAnalysisHelper prevHelper = deferredAnalysisHelper; try { deferredAnalysisHelper = flushDeferredHelper; - ArrayList rewritings = Q.get(flushEnv.enclClass.sym.outermostClass()); + Queue rewritings = Q.get(flushEnv.enclClass.sym.outermostClass()); while (rewritings != null && !rewritings.isEmpty()) { - doAnalysis(rewritings.remove(0)); + doAnalysis(rewritings.remove()); } } finally { deferredAnalysisHelper = prevHelper;