From 0663c6284a08bf83a4aef59024b71b8babf86963 Mon Sep 17 00:00:00 2001 From: Adam Welc <adam.welc@oracle.com> Date: Mon, 29 Aug 2016 22:32:29 +0200 Subject: [PATCH] Added preliminary support for keeping context objects across native calls. --- com.oracle.truffle.r.native/fficall/src/jni/Rembedded.c | 4 ++-- com.oracle.truffle.r.native/fficall/src/jni/rffiutils.c | 2 +- com.oracle.truffle.r.native/fficall/src/jni/rffiutils.h | 2 ++ com.oracle.truffle.r.native/fficall/src/jni/variables.c | 3 ++- .../com/oracle/truffle/r/runtime/ffi/jnr/CallRFFIHelper.java | 3 +++ 5 files changed, 10 insertions(+), 4 deletions(-) diff --git a/com.oracle.truffle.r.native/fficall/src/jni/Rembedded.c b/com.oracle.truffle.r.native/fficall/src/jni/Rembedded.c index 2b4debd634..6b062aee26 100644 --- a/com.oracle.truffle.r.native/fficall/src/jni/Rembedded.c +++ b/com.oracle.truffle.r.native/fficall/src/jni/Rembedded.c @@ -602,7 +602,7 @@ CTXT R_getGlobalFunctionContext() { jmethodID methodID = checkGetMethodID(jniEnv, CallRFFIHelperClass, "R_getGlobalFunctionContext", "()Ljava/lang/Object;", 1); CTXT result = (*jniEnv)->CallStaticObjectMethod(jniEnv, CallRFFIHelperClass, methodID); result = checkRef(jniEnv, result); - return result == R_NilValue ? NULL : result; + return result == R_NilValue ? NULL : addGlobalRef(jniEnv, result, 0); } CTXT R_getParentFunctionContext(CTXT c) { @@ -610,7 +610,7 @@ CTXT R_getParentFunctionContext(CTXT c) { jmethodID methodID = checkGetMethodID(jniEnv, CallRFFIHelperClass, "R_getParentFunctionContext", "(Ljava/lang/Object;)Ljava/lang/Object;", 1); CTXT result = (*jniEnv)->CallStaticObjectMethod(jniEnv, CallRFFIHelperClass, methodID, c); result = checkRef(jniEnv, result); - return result == R_NilValue ? NULL : result; + return result == R_NilValue ? NULL : addGlobalRef(jniEnv, result, 0); } SEXP R_getContextEnv(CTXT context) { diff --git a/com.oracle.truffle.r.native/fficall/src/jni/rffiutils.c b/com.oracle.truffle.r.native/fficall/src/jni/rffiutils.c index 99380b2102..5f9425d8a7 100644 --- a/com.oracle.truffle.r.native/fficall/src/jni/rffiutils.c +++ b/com.oracle.truffle.r.native/fficall/src/jni/rffiutils.c @@ -356,7 +356,7 @@ static SEXP findCachedGlobalRef(JNIEnv *env, SEXP obj) { return NULL; } -static SEXP addGlobalRef(JNIEnv *env, SEXP obj, int permanent) { +SEXP addGlobalRef(JNIEnv *env, SEXP obj, int permanent) { SEXP gref; if (cachedGlobalRefsHwm >= cachedGlobalRefsLength) { int newLength = cachedGlobalRefsLength * 2; diff --git a/com.oracle.truffle.r.native/fficall/src/jni/rffiutils.h b/com.oracle.truffle.r.native/fficall/src/jni/rffiutils.h index 6acab7320e..78bbe21b9f 100644 --- a/com.oracle.truffle.r.native/fficall/src/jni/rffiutils.h +++ b/com.oracle.truffle.r.native/fficall/src/jni/rffiutils.h @@ -75,6 +75,8 @@ void *getNativeArray(JNIEnv *env, SEXP x, SEXPTYPE type); void invalidateNativeArray(JNIEnv *env, SEXP oldObj); void updateNativeArrays(JNIEnv *env); +SEXP addGlobalRef(JNIEnv *env, SEXP obj, int permanent); + void init_rmath(JNIEnv *env); void init_variables(JNIEnv *env, jobjectArray initialValues); void init_dynload(JNIEnv *env); diff --git a/com.oracle.truffle.r.native/fficall/src/jni/variables.c b/com.oracle.truffle.r.native/fficall/src/jni/variables.c index 887dcea7bd..ca381df5e2 100644 --- a/com.oracle.truffle.r.native/fficall/src/jni/variables.c +++ b/com.oracle.truffle.r.native/fficall/src/jni/variables.c @@ -61,7 +61,8 @@ SEXP FASTR_NamespaceRegistry() { CTXT FASTR_GlobalContext() { JNIEnv *env = getEnv(); - return (*env)->CallStaticObjectMethod(env, CallRFFIHelperClass, getGlobalContextMethodID); + CTXT res = (*env)->CallStaticObjectMethod(env, CallRFFIHelperClass, getGlobalContextMethodID); + return addGlobalRef(env, res, 0); } void init_variables(JNIEnv *env, jobjectArray initialValues) { diff --git a/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/jnr/CallRFFIHelper.java b/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/jnr/CallRFFIHelper.java index 60b2aadf4b..81c57b689e 100644 --- a/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/jnr/CallRFFIHelper.java +++ b/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/jnr/CallRFFIHelper.java @@ -1167,6 +1167,7 @@ public class CallRFFIHelper { } public static Object getGlobalContext() { + Utils.warn("Potential memory leak (global context object)"); if (RFFIUtils.traceEnabled()) { RFFIUtils.traceUpCall("getGlobalContext"); } @@ -1251,6 +1252,7 @@ public class CallRFFIHelper { // Checkstyle: stop method name check public static Object R_getGlobalFunctionContext() { + Utils.warn("Potential memory leak (global function context object)"); if (RFFIUtils.traceEnabled()) { RFFIUtils.traceUpCall("getGlobalFunctionContext"); } @@ -1269,6 +1271,7 @@ public class CallRFFIHelper { } public static Object R_getParentFunctionContext(Object c) { + Utils.warn("Potential memory leak (parent function context object)"); if (RFFIUtils.traceEnabled()) { RFFIUtils.traceUpCall("getParentFunctionContext"); } -- GitLab