< prev index next >

src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTaskPool.java

Print this page
rev 50962 : [mq]: 8206122-Use-Queue-in-place-of-ArrayList-when-need-to-remove-first-element

*** 1,7 **** /* ! * Copyright (c) 2015, 2017, 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 * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this --- 1,7 ---- /* ! * 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 * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this
*** 25,38 **** package com.sun.tools.javac.api; import java.io.PrintStream; import java.io.Writer; import java.util.ArrayList; import java.util.Collection; - import java.util.Collections; import java.util.HashMap; import com.sun.source.tree.ClassTree; import com.sun.source.tree.CompilationUnitTree; import com.sun.source.util.JavacTask; import com.sun.source.util.TaskEvent; --- 25,50 ---- package com.sun.tools.javac.api; import java.io.PrintStream; import java.io.Writer; + import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Collection; 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; import com.sun.source.util.JavacTask; import com.sun.source.util.TaskEvent;
*** 51,75 **** import com.sun.tools.javac.comp.CompileStates; import com.sun.tools.javac.comp.Enter; 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.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; import com.sun.tools.javac.util.Log; --- 63,74 ---- import com.sun.tools.javac.comp.CompileStates; import com.sun.tools.javac.comp.Enter; 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 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.Log;
*** 99,111 **** * deletion without notice.</b> */ public class JavacTaskPool { private static final JavacTool systemProvider = JavacTool.create(); private final int maxPoolSize; ! private final Map<List<String>, List<ReusableContext>> options2Contexts = new HashMap<>(); private int id; private int statReused = 0; private int statNew = 0; private int statPolluted = 0; --- 98,111 ---- * deletion without notice.</b> */ public class JavacTaskPool { private static final JavacTool systemProvider = JavacTool.create(); + private static final Queue<ReusableContext> EMPTY_QUEUE = new ArrayDeque<>(0); private final int maxPoolSize; ! private final Map<List<String>, Queue<ReusableContext>> options2Contexts = new HashMap<>(); private int id; private int statReused = 0; private int statNew = 0; private int statPolluted = 0;
*** 157,174 **** .collect(Collectors.toCollection(ArrayList::new)); ReusableContext ctx; synchronized (this) { ! List<ReusableContext> cached = ! options2Contexts.getOrDefault(opts, Collections.emptyList()); if (cached.isEmpty()) { ctx = new ReusableContext(opts); statNew++; } else { ! ctx = cached.remove(0); statReused++; } } ctx.useCount++; --- 157,174 ---- .collect(Collectors.toCollection(ArrayList::new)); ReusableContext ctx; synchronized (this) { ! Queue<ReusableContext> cached = ! options2Contexts.getOrDefault(opts, EMPTY_QUEUE); if (cached.isEmpty()) { ctx = new ReusableContext(opts); statNew++; } else { ! ctx = cached.remove(); statReused++; } } ctx.useCount++;
*** 198,208 **** .findFirst() .get(); options2Contexts.get(toRemove.arguments).remove(toRemove); statRemoved++; } ! options2Contexts.computeIfAbsent(ctx.arguments, x -> new ArrayList<>()).add(ctx); ctx.timeStamp = id++; } } return result; --- 198,208 ---- .findFirst() .get(); options2Contexts.get(toRemove.arguments).remove(toRemove); statRemoved++; } ! options2Contexts.computeIfAbsent(ctx.arguments, x -> new ArrayDeque<>()).add(ctx); ctx.timeStamp = id++; } } return result;
< prev index next >