Skip to content
Snippets Groups Projects
Commit f3511dc4 authored by Florian Angerer's avatar Florian Angerer
Browse files

[GR-2798] Fix memleak caused by the language closure cache.

PullRequest: fastr/1222
parents 69ddf941 47794e86
Branches
No related tags found
No related merge requests found
......@@ -160,8 +160,7 @@ abstract class ReplacementNode extends OperatorNode {
static RLanguage getLanguage(WriteVariableNode wvn) {
Node parent = wvn.getParent();
if (parent instanceof ReplacementNode) {
Closure closure = RContext.getInstance().languageClosureCache.getOrCreateLanguageClosure((ReplacementNode) parent);
return RDataFactory.createLanguage(closure);
return RDataFactory.createLanguage(Closure.createLanguageClosure((ReplacementNode) parent));
}
return null;
}
......
......@@ -23,6 +23,7 @@
package com.oracle.truffle.r.nodes.function;
import java.util.ArrayList;
import java.util.IdentityHashMap;
import java.util.List;
import com.oracle.truffle.api.Assumption;
......@@ -70,6 +71,7 @@ import com.oracle.truffle.r.runtime.builtins.RBuiltinDescriptor;
import com.oracle.truffle.r.runtime.context.RContext;
import com.oracle.truffle.r.runtime.context.TruffleRLanguage;
import com.oracle.truffle.r.runtime.data.Closure;
import com.oracle.truffle.r.runtime.data.ClosureCache;
import com.oracle.truffle.r.runtime.data.RNull;
import com.oracle.truffle.r.runtime.data.RPairList;
import com.oracle.truffle.r.runtime.env.frame.FrameSlotChangeMonitor;
......@@ -84,7 +86,7 @@ import com.oracle.truffle.r.runtime.nodes.RSyntaxLookup;
import com.oracle.truffle.r.runtime.nodes.RSyntaxNode;
import com.oracle.truffle.r.runtime.nodes.RSyntaxVisitor;
public final class FunctionDefinitionNode extends RRootNode implements RSyntaxNode, RSyntaxFunction {
public final class FunctionDefinitionNode extends RRootNode implements RSyntaxNode, RSyntaxFunction, ClosureCache {
private final FormalArguments formalArguments;
......@@ -135,6 +137,8 @@ public final class FunctionDefinitionNode extends RRootNode implements RSyntaxNo
*/
private final ConditionProfile returnTopLevelProfile = ConditionProfile.createBinaryProfile();
@CompilationFinal private IdentityHashMap<RNode, Closure> languageClosureCache;
public static FunctionDefinitionNode create(TruffleRLanguage language, SourceSection src, FrameDescriptor frameDesc, SourceSection[] argSourceSections, SaveArgumentsNode saveArguments,
RSyntaxNode body,
FormalArguments formals, String name, PostProcessArgumentsNode argPostProcess) {
......@@ -368,8 +372,7 @@ public final class FunctionDefinitionNode extends RRootNode implements RSyntaxNo
CompilerDirectives.transferToInterpreter();
RInternalError.shouldNotReachHere("unexpected type for on.exit entry: " + expr.car());
}
Closure closure = RContext.getInstance().languageClosureCache.getOrCreateLanguageClosure((RNode) expr.car());
onExitExpressionCache.execute(frame, closure);
onExitExpressionCache.execute(frame, getOrCreateLanguageClosure((RNode) expr.car()));
}
}
} catch (ReturnException ex) {
......@@ -554,4 +557,13 @@ public final class FunctionDefinitionNode extends RRootNode implements RSyntaxNo
}
return handlerStackSlot;
}
@Override
public IdentityHashMap<RNode, Closure> getContent() {
if (languageClosureCache == null) {
CompilerDirectives.transferToInterpreterAndInvalidate();
languageClosureCache = new IdentityHashMap<>();
}
return languageClosureCache;
}
}
......@@ -22,6 +22,7 @@
*/
package com.oracle.truffle.r.runtime.data;
import java.lang.ref.WeakReference;
import java.util.WeakHashMap;
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
......@@ -29,7 +30,7 @@ import com.oracle.truffle.r.runtime.nodes.RNode;
public class LanguageClosureCache {
private final WeakHashMap<RNode, Closure> cache = new WeakHashMap<>();
private final WeakHashMap<RNode, WeakReference<Closure>> cache = new WeakHashMap<>();
/**
* @param expr
......@@ -42,10 +43,11 @@ public class LanguageClosureCache {
return null;
}
Closure result = cache.get(expr);
WeakReference<Closure> weakRef = cache.get(expr);
Closure result = weakRef != null ? weakRef.get() : null;
if (result == null) {
result = Closure.createLanguageClosure(expr);
cache.put(expr, result);
cache.put(expr, new WeakReference<>(result));
}
return result;
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment