From 829b8c6e3298f01d731d4602ece05dee22c5d292 Mon Sep 17 00:00:00 2001 From: Florian Angerer <florian.angerer@oracle.com> Date: Fri, 13 Oct 2017 15:16:27 +0200 Subject: [PATCH] Synchronizing FD cache. --- .../truffle/r/runtime/env/REnvironment.java | 60 ++++++++++--------- 1 file changed, 32 insertions(+), 28 deletions(-) diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/env/REnvironment.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/env/REnvironment.java index 636274061d..26b0eff1a7 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/env/REnvironment.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/env/REnvironment.java @@ -24,6 +24,8 @@ package com.oracle.truffle.r.runtime.env; import java.lang.ref.WeakReference; import java.util.ArrayList; +import java.util.Collections; +import java.util.Map; import java.util.WeakHashMap; import java.util.regex.Pattern; @@ -114,6 +116,8 @@ import com.oracle.truffle.r.runtime.env.frame.REnvTruffleFrameAccess; public abstract class REnvironment extends RAttributeStorage { public static final class ContextStateImpl implements RContext.ContextState { + private static Map<RStringVector, WeakReference<FrameDescriptor>> frameDescriptorCache; + private final MaterializedFrame globalFrame; @CompilationFinal private Base baseEnv; @CompilationFinal private REnvironment namespaceRegistry; @@ -179,6 +183,33 @@ public abstract class REnvironment extends RAttributeStorage { this.namespaceRegistry = newNamespaceRegistry; this.searchPath = newSearchPath; } + + public static FrameDescriptor getFrameDescriptorFromList(RList list) { + CompilerAsserts.neverPartOfCompilation(); + + // create lazily + if (frameDescriptorCache == null) { + frameDescriptorCache = Collections.synchronizedMap(new WeakHashMap<>()); + } + + RStringVector names = list.getNames(); + + WeakReference<FrameDescriptor> weakReference = frameDescriptorCache.get(names); + FrameDescriptor fd = weakReference != null ? weakReference.get() : null; + + if (fd == null) { + // ensure that string vector is not modified anymore + names.makeSharedPermanent(); + + fd = RRuntime.createFrameDescriptorWithMetaData("<new-cachedfd-env>"); + for (int i = 0; i < list.getLength(); i++) { + FrameSlotKind valueSlotKind = RRuntime.getSlotKind(list.getDataAt(i)); + FrameSlotChangeMonitor.findOrAddFrameSlot(fd, names.getDataAt(i), valueSlotKind); + } + frameDescriptorCache.put(names, new WeakReference<>(fd)); + } + return fd; + } } public static class PutException extends RErrorException { @@ -670,7 +701,7 @@ public abstract class REnvironment extends RAttributeStorage { REnvironment result; RStringVector names = list.getNames(); if (list.getLength() >= LARGE_LIST_THRESHOLD) { - FrameDescriptor cachedFd = getFrameDescriptorFromList(list); + FrameDescriptor cachedFd = ContextStateImpl.getFrameDescriptorFromList(list); result = RDataFactory.createNewEnv(cachedFd, null); } else { result = RDataFactory.createNewEnv(null); @@ -686,33 +717,6 @@ public abstract class REnvironment extends RAttributeStorage { return result; } - private static WeakHashMap<RStringVector, WeakReference<FrameDescriptor>> frameDescriptorCache; - - public static FrameDescriptor getFrameDescriptorFromList(RList list) { - // create lazily - if (frameDescriptorCache == null) { - frameDescriptorCache = new WeakHashMap<>(); - } - - RStringVector names = list.getNames(); - - WeakReference<FrameDescriptor> weakReference = frameDescriptorCache.get(names); - FrameDescriptor fd = weakReference != null ? weakReference.get() : null; - - if (fd == null) { - // ensure that string vector is not modified anymore - names.makeSharedPermanent(); - - fd = RRuntime.createFrameDescriptorWithMetaData("<new-cachedfd-env>"); - for (int i = 0; i < list.getLength(); i++) { - FrameSlotKind valueSlotKind = RRuntime.getSlotKind(list.getDataAt(i)); - FrameSlotChangeMonitor.findOrAddFrameSlot(fd, names.getDataAt(i), valueSlotKind); - } - frameDescriptorCache.put(names, new WeakReference<>(fd)); - } - return fd; - } - // END of static methods public static final String NAMESPACE_KEY = ".__NAMESPACE__."; -- GitLab