From fc094ea97bd372cc3b8fde65b1bf26fcfcc5512d Mon Sep 17 00:00:00 2001 From: Lukas Stadler <lukas.stadler@oracle.com> Date: Mon, 12 Dec 2016 13:08:13 +0100 Subject: [PATCH] thread safety in CallArgumentsNode --- .../r/nodes/function/CallArgumentsNode.java | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/CallArgumentsNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/CallArgumentsNode.java index 6359e94caa..818244e964 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/CallArgumentsNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/CallArgumentsNode.java @@ -161,8 +161,18 @@ public final class CallArgumentsNode extends RBaseNode implements UnmatchedArgum return Arguments.create(values, ArgumentsSignature.get(newNames)); } - private ArgumentsSignature cachedVarArgsSignature; - private ArgumentsSignature cachedResultSignature; + private static final class CachedSignature { + private final ArgumentsSignature signature; + private final ArgumentsSignature resultSignature; + + protected CachedSignature(ArgumentsSignature signature, ArgumentsSignature resultSignature) { + this.signature = signature; + this.resultSignature = resultSignature; + } + } + + private CachedSignature cachedVarArgsSignature; + private final BranchProfile regenerateSignatureProfile = BranchProfile.create(); public ArgumentsSignature flattenNames(RArgsValuesAndNames varArgs) { @@ -170,15 +180,15 @@ public final class CallArgumentsNode extends RBaseNode implements UnmatchedArgum return signature; } ArgumentsSignature varArgsSignature = varArgs.getSignature(); - if (cachedVarArgsSignature == null) { + CachedSignature cached = cachedVarArgsSignature; + if (cached == null) { CompilerDirectives.transferToInterpreter(); } - if (varArgsSignature == cachedVarArgsSignature) { - return cachedResultSignature; + if (cached == null || varArgsSignature != cached.signature) { + regenerateSignatureProfile.enter(); + cachedVarArgsSignature = cached = new CachedSignature(varArgsSignature, flattenNamesInternal(varArgsSignature)); } - regenerateSignatureProfile.enter(); - cachedVarArgsSignature = varArgsSignature; - return cachedResultSignature = flattenNamesInternal(varArgsSignature); + return cached.resultSignature; } @TruffleBoundary -- GitLab