< 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 >