diff --git a/src/cpp/runKernel/Aparapi.cpp b/src/cpp/runKernel/Aparapi.cpp index 02d967620ae5982dc488becd453553f145b97908..807bf81e437612ae98e6158282c4b1e34c488c34 100644 --- a/src/cpp/runKernel/Aparapi.cpp +++ b/src/cpp/runKernel/Aparapi.cpp @@ -284,39 +284,8 @@ jint updateNonPrimitiveReferences(JNIEnv *jenv, jobject jobj, JNIContext* jniCon if (config->isVerbose()){ fprintf(stderr, "Resync javaArray for %s: %p %p\n", arg->name, newRef, arg->arrayBuffer->javaArray); } - // Free previous ref if any - if (arg->arrayBuffer->javaArray != NULL) { - jenv->DeleteWeakGlobalRef((jweak) arg->arrayBuffer->javaArray); - if (config->isVerbose()){ - fprintf(stderr, "DeleteWeakGlobalRef for %s: %p\n", arg->name, arg->arrayBuffer->javaArray); - } - } - - // need to free opencl buffers, run will reallocate later - if (arg->arrayBuffer->mem != 0) { - //fprintf(stderr, "-->releaseMemObject[%d]\n", i); - if (config->isTrackingOpenCLResources()){ - memList.remove(arg->arrayBuffer->mem,__LINE__, __FILE__); - } - status = clReleaseMemObject((cl_mem)arg->arrayBuffer->mem); - //fprintf(stderr, "<--releaseMemObject[%d]\n", i); - if(status != CL_SUCCESS) throw CLException(status, "clReleaseMemObject()"); - arg->arrayBuffer->mem = (cl_mem)0; - } - - arg->arrayBuffer->addr = NULL; - - // Capture new array ref from the kernel arg object - - if (newRef != NULL) { - arg->arrayBuffer->javaArray = (jarray)jenv->NewWeakGlobalRef((jarray)newRef); - if (config->isVerbose()){ - fprintf(stderr, "NewWeakGlobalRef for %s, set to %p\n", arg->name, - arg->arrayBuffer->javaArray); - } - } else { - arg->arrayBuffer->javaArray = NULL; - } + // Free previous ref if any and allocate new + arg->arrayBuffer->replaceJavaArray(jenv, arg, newRef); // Save the lengthInBytes which was set on the java side int lengthInBytes = arg->getSizeInBytes(jenv); @@ -413,7 +382,6 @@ void updateArray(JNIEnv* jenv, JNIContext* jniContext, KernelArg* arg, int& argP } void updateBuffer(JNIEnv* jenv, JNIContext* jniContext, KernelArg* arg, int& argPos, int argIdx) { - AparapiBuffer* buffer = arg->aparapiBuffer; cl_int status = CL_SUCCESS; cl_uint mask = 0; diff --git a/src/cpp/runKernel/ArrayBuffer.cpp b/src/cpp/runKernel/ArrayBuffer.cpp index 42300d57d78ee2e7bee54a05913b7f5ca9ec4420..55be9ebc517d3a43f2d06b02e43c15ef2afef9f1 100644 --- a/src/cpp/runKernel/ArrayBuffer.cpp +++ b/src/cpp/runKernel/ArrayBuffer.cpp @@ -53,6 +53,8 @@ #define ARRAYBUFFER_SOURCE #include "ArrayBuffer.h" #include "KernelArg.h" +#include "List.h" + ArrayBuffer::ArrayBuffer(): javaArray((jobject) 0), @@ -86,5 +88,67 @@ void ArrayBuffer::getMinimalParams(JNIEnv *jenv, KernelArg *arg, cl_uint& arrayE void ArrayBuffer::syncMinimalParams(JNIEnv *jenv, KernelArg *arg) { length = JNIHelper::getInstanceField<jint>(jenv, arg->javaArg, "numElements", IntArg); - lengthInBytes = jenv->GetIntField(arg->javaArg, KernelArg::getSizeInBytesFieldID()); + lengthInBytes = jenv->GetIntField(arg->javaArg, KernelArg::getSizeInBytesFieldID()); +} + +void ArrayBuffer::replaceJavaArray(JNIEnv *jenv, KernelArg *arg, jarray newRef) { + cl_int status = CL_SUCCESS; + if (javaArray != NULL) { + jenv->DeleteWeakGlobalRef((jweak) javaArray); + if (config->isVerbose()){ + fprintf(stderr, "DeleteWeakGlobalRef for %s: %p\n", arg->name, javaArray); + } + javaArray = 0; + } + + // need to free opencl buffers, run will reallocate later + if (mem != 0) { + //fprintf(stderr, "-->releaseMemObject[%d]\n", i); + if (config->isTrackingOpenCLResources()){ + memList.remove(mem,__LINE__, __FILE__); + } + status = clReleaseMemObject((cl_mem)mem); + //fprintf(stderr, "<--releaseMemObject[%d]\n", i); + if(status != CL_SUCCESS) throw CLException(status, "clReleaseMemObject()"); + mem = (cl_mem)0; + } + + addr = 0; + + // Capture new array ref from the kernel arg object + if (newRef != 0) { + javaArray = (jarray)jenv->NewWeakGlobalRef((jarray)newRef); + if (config->isVerbose()){ + fprintf(stderr, "NewWeakGlobalRef for %s, set to %p\n", arg->name, + javaArray); + } + } else { + javaArray = 0; + } +} + + +void ArrayBuffer::deleteJavaArray(JNIEnv *jenv, KernelArg *arg) { + cl_int status = CL_SUCCESS; + if (javaArray != NULL) { + jenv->DeleteWeakGlobalRef((jweak) ArrayBuffer::javaArray); + if (config->isVerbose()){ + fprintf(stderr, "DeleteWeakGlobalRef for %s: %p\n", arg->name, ArrayBuffer::javaArray); + } + javaArray = 0; + } + + // need to free opencl buffers, run will reallocate later + if (mem != 0) { + //fprintf(stderr, "-->releaseMemObject[%d]\n", i); + if (config->isTrackingOpenCLResources()){ + memList.remove(mem,__LINE__, __FILE__); + } + status = clReleaseMemObject((cl_mem)mem); + //fprintf(stderr, "<--releaseMemObject[%d]\n", i); + if(status != CL_SUCCESS) throw CLException(status, "clReleaseMemObject()"); + mem = (cl_mem)0; + } + + addr = 0; } diff --git a/src/cpp/runKernel/ArrayBuffer.h b/src/cpp/runKernel/ArrayBuffer.h index 26cdbe567c1ace9ba48c7ada1017237e871ef21f..1be98a07d4f59ea0d90df9303735d6effba5d200 100644 --- a/src/cpp/runKernel/ArrayBuffer.h +++ b/src/cpp/runKernel/ArrayBuffer.h @@ -78,6 +78,8 @@ class ArrayBuffer{ void pin(JNIEnv *jenv); void getMinimalParams(JNIEnv *jenv, KernelArg *arg, cl_uint& arrayElements, int &sizeInBytes); void syncMinimalParams(JNIEnv *jenv, KernelArg *arg); + void replaceJavaArray(JNIEnv *jenv, KernelArg *arg, jarray newRef); + void deleteJavaArray(JNIEnv *jenv, KernelArg *arg); }; #endif // ARRAYBUFFER_H