diff options
author | Stephen Hines <srhines@google.com> | 2014-04-17 23:33:54 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2014-04-17 23:33:54 +0000 |
commit | 9deecdc88f77d8a4a8ff25c1ef2405b42a05ce81 (patch) | |
tree | ee3b2d45688c1dc82650b2498a754d0264fc952e /rs/jni | |
parent | cbc7168e55fd4058647af5a6ca7652bb99b299b0 (diff) | |
parent | fc45b664d421553042629d24086a144761c7b5e1 (diff) | |
download | frameworks_base-9deecdc88f77d8a4a8ff25c1ef2405b42a05ce81.zip frameworks_base-9deecdc88f77d8a4a8ff25c1ef2405b42a05ce81.tar.gz frameworks_base-9deecdc88f77d8a4a8ff25c1ef2405b42a05ce81.tar.bz2 |
am fc45b664: am f0aa4cc0: am a4898534: Merge "Fix improper use of JNI_ABORT for operations where Java objects are written."
* commit 'fc45b664d421553042629d24086a144761c7b5e1':
Fix improper use of JNI_ABORT for operations where Java objects are written.
Diffstat (limited to 'rs/jni')
-rw-r--r-- | rs/jni/android_renderscript_RenderScript.cpp | 44 |
1 files changed, 30 insertions, 14 deletions
diff --git a/rs/jni/android_renderscript_RenderScript.cpp b/rs/jni/android_renderscript_RenderScript.cpp index 671b43d..18a2e31 100644 --- a/rs/jni/android_renderscript_RenderScript.cpp +++ b/rs/jni/android_renderscript_RenderScript.cpp @@ -47,24 +47,29 @@ using namespace android; -#define PER_ARRAY_TYPE(flag, fnc, ...) { \ +#define PER_ARRAY_TYPE(flag, fnc, readonly, ...) { \ jint len = 0; \ void *ptr = NULL; \ size_t typeBytes = 0; \ + jint relFlag = 0; \ + if (readonly) { \ + /* The on-release mode should only be JNI_ABORT for read-only accesses. */ \ + relFlag = JNI_ABORT; \ + } \ switch(dataType) { \ case RS_TYPE_FLOAT_32: \ len = _env->GetArrayLength((jfloatArray)data); \ ptr = _env->GetFloatArrayElements((jfloatArray)data, flag); \ typeBytes = 4; \ fnc(__VA_ARGS__); \ - _env->ReleaseFloatArrayElements((jfloatArray)data, (jfloat *)ptr, JNI_ABORT); \ + _env->ReleaseFloatArrayElements((jfloatArray)data, (jfloat *)ptr, relFlag); \ return; \ case RS_TYPE_FLOAT_64: \ len = _env->GetArrayLength((jdoubleArray)data); \ ptr = _env->GetDoubleArrayElements((jdoubleArray)data, flag); \ typeBytes = 8; \ fnc(__VA_ARGS__); \ - _env->ReleaseDoubleArrayElements((jdoubleArray)data, (jdouble *)ptr, JNI_ABORT);\ + _env->ReleaseDoubleArrayElements((jdoubleArray)data, (jdouble *)ptr, relFlag); \ return; \ case RS_TYPE_SIGNED_8: \ case RS_TYPE_UNSIGNED_8: \ @@ -72,7 +77,7 @@ using namespace android; ptr = _env->GetByteArrayElements((jbyteArray)data, flag); \ typeBytes = 1; \ fnc(__VA_ARGS__); \ - _env->ReleaseByteArrayElements((jbyteArray)data, (jbyte*)ptr, JNI_ABORT); \ + _env->ReleaseByteArrayElements((jbyteArray)data, (jbyte*)ptr, relFlag); \ return; \ case RS_TYPE_SIGNED_16: \ case RS_TYPE_UNSIGNED_16: \ @@ -80,7 +85,7 @@ using namespace android; ptr = _env->GetShortArrayElements((jshortArray)data, flag); \ typeBytes = 2; \ fnc(__VA_ARGS__); \ - _env->ReleaseShortArrayElements((jshortArray)data, (jshort *)ptr, JNI_ABORT); \ + _env->ReleaseShortArrayElements((jshortArray)data, (jshort *)ptr, relFlag); \ return; \ case RS_TYPE_SIGNED_32: \ case RS_TYPE_UNSIGNED_32: \ @@ -88,7 +93,7 @@ using namespace android; ptr = _env->GetIntArrayElements((jintArray)data, flag); \ typeBytes = 4; \ fnc(__VA_ARGS__); \ - _env->ReleaseIntArrayElements((jintArray)data, (jint *)ptr, JNI_ABORT); \ + _env->ReleaseIntArrayElements((jintArray)data, (jint *)ptr, relFlag); \ return; \ case RS_TYPE_SIGNED_64: \ case RS_TYPE_UNSIGNED_64: \ @@ -96,7 +101,7 @@ using namespace android; ptr = _env->GetLongArrayElements((jlongArray)data, flag); \ typeBytes = 8; \ fnc(__VA_ARGS__); \ - _env->ReleaseLongArrayElements((jlongArray)data, (jlong *)ptr, JNI_ABORT); \ + _env->ReleaseLongArrayElements((jlongArray)data, (jlong *)ptr, relFlag); \ return; \ default: \ break; \ @@ -672,6 +677,7 @@ static void ReleaseBitmapCallback(void *bmp) } +// Copies from the Java object data into the Allocation pointed to by _alloc. static void nAllocationData1D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint offset, jint lod, jint count, jobject data, jint sizeBytes, jint dataType) @@ -679,9 +685,10 @@ nAllocationData1D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint off RsAllocation *alloc = (RsAllocation *)_alloc; LOG_API("nAllocation1DData, con(%p), adapter(%p), offset(%i), count(%i), sizeBytes(%i), dataType(%i)", (RsContext)con, (RsAllocation)alloc, offset, count, sizeBytes, dataType); - PER_ARRAY_TYPE(NULL, rsAllocation1DData, (RsContext)con, alloc, offset, lod, count, ptr, sizeBytes); + PER_ARRAY_TYPE(NULL, rsAllocation1DData, true, (RsContext)con, alloc, offset, lod, count, ptr, sizeBytes); } +// Copies from the Java array data into the Allocation pointed to by alloc. static void // native void rsnAllocationElementData1D(long con, long id, int xoff, int compIdx, byte[] d, int sizeBytes); nAllocationElementData1D(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jint offset, jint lod, jint compIdx, jbyteArray data, jint sizeBytes) @@ -693,6 +700,7 @@ nAllocationElementData1D(JNIEnv *_env, jobject _this, jlong con, jlong alloc, ji _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT); } +// Copies from the Java object data into the Allocation pointed to by _alloc. static void nAllocationData2D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint lod, jint _face, jint w, jint h, jobject data, jint sizeBytes, jint dataType) @@ -701,9 +709,11 @@ nAllocationData2D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xof RsAllocationCubemapFace face = (RsAllocationCubemapFace)_face; LOG_API("nAllocation2DData, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i) type(%i)", (RsContext)con, alloc, xoff, yoff, w, h, sizeBytes, dataType); - PER_ARRAY_TYPE(NULL, rsAllocation2DData, (RsContext)con, alloc, xoff, yoff, lod, face, w, h, ptr, sizeBytes, 0); + PER_ARRAY_TYPE(NULL, rsAllocation2DData, true, (RsContext)con, alloc, xoff, yoff, lod, face, w, h, ptr, sizeBytes, 0); } +// Copies from the Allocation pointed to by srcAlloc into the Allocation +// pointed to by dstAlloc. static void nAllocationData2D_alloc(JNIEnv *_env, jobject _this, jlong con, jlong dstAlloc, jint dstXoff, jint dstYoff, @@ -728,6 +738,7 @@ nAllocationData2D_alloc(JNIEnv *_env, jobject _this, jlong con, srcMip, srcFace); } +// Copies from the Java object data into the Allocation pointed to by _alloc. static void nAllocationData3D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint zoff, jint lod, jint w, jint h, jint d, jobject data, int sizeBytes, int dataType) @@ -735,9 +746,11 @@ nAllocationData3D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xof RsAllocation *alloc = (RsAllocation *)_alloc; LOG_API("nAllocation3DData, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), lod(%i), w(%i), h(%i), d(%i), sizeBytes(%i)", (RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff, lod, w, h, d, sizeBytes); - PER_ARRAY_TYPE(NULL, rsAllocation3DData, (RsContext)con, alloc, xoff, yoff, zoff, lod, w, h, d, ptr, sizeBytes, 0); + PER_ARRAY_TYPE(NULL, rsAllocation3DData, true, (RsContext)con, alloc, xoff, yoff, zoff, lod, w, h, d, ptr, sizeBytes, 0); } +// Copies from the Allocation pointed to by srcAlloc into the Allocation +// pointed to by dstAlloc. static void nAllocationData3D_alloc(JNIEnv *_env, jobject _this, jlong con, jlong dstAlloc, jint dstXoff, jint dstYoff, jint dstZoff, @@ -761,14 +774,16 @@ nAllocationData3D_alloc(JNIEnv *_env, jobject _this, jlong con, } +// Copies from the Allocation pointed to by _alloc into the Java object data. static void nAllocationRead(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jobject data, int dataType) { RsAllocation *alloc = (RsAllocation *)_alloc; LOG_API("nAllocationRead, con(%p), alloc(%p)", (RsContext)con, (RsAllocation)alloc); - PER_ARRAY_TYPE(0, rsAllocationRead, (RsContext)con, alloc, ptr, len * typeBytes); + PER_ARRAY_TYPE(0, rsAllocationRead, false, (RsContext)con, alloc, ptr, len * typeBytes); } +// Copies from the Allocation pointed to by _alloc into the Java object data. static void nAllocationRead1D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint offset, jint lod, jint count, jobject data, int sizeBytes, int dataType) @@ -776,9 +791,10 @@ nAllocationRead1D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint off RsAllocation *alloc = (RsAllocation *)_alloc; LOG_API("nAllocation1DRead, con(%p), adapter(%p), offset(%i), count(%i), sizeBytes(%i), dataType(%i)", (RsContext)con, alloc, offset, count, sizeBytes, dataType); - PER_ARRAY_TYPE(0, rsAllocation1DRead, (RsContext)con, alloc, offset, lod, count, ptr, sizeBytes); + PER_ARRAY_TYPE(0, rsAllocation1DRead, false, (RsContext)con, alloc, offset, lod, count, ptr, sizeBytes); } +// Copies from the Allocation pointed to by _alloc into the Java object data. static void nAllocationRead2D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint lod, jint _face, jint w, jint h, jobject data, int sizeBytes, int dataType) @@ -787,7 +803,7 @@ nAllocationRead2D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xof RsAllocationCubemapFace face = (RsAllocationCubemapFace)_face; LOG_API("nAllocation2DRead, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i) type(%i)", (RsContext)con, alloc, xoff, yoff, w, h, sizeBytes, dataType); - PER_ARRAY_TYPE(0, rsAllocation2DRead, (RsContext)con, alloc, xoff, yoff, lod, face, w, h, ptr, sizeBytes, 0); + PER_ARRAY_TYPE(0, rsAllocation2DRead, false, (RsContext)con, alloc, xoff, yoff, lod, face, w, h, ptr, sizeBytes, 0); } static jlong @@ -1023,7 +1039,7 @@ nScriptGetVarV(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jint len = _env->GetArrayLength(data); jbyte *ptr = _env->GetByteArrayElements(data, NULL); rsScriptGetVarV((RsContext)con, (RsScript)script, slot, ptr, len); - _env->ReleaseByteArrayElements(data, ptr, JNI_ABORT); + _env->ReleaseByteArrayElements(data, ptr, 0); } static void |