From 9232232f38fc946d6ce94e7b849608abafb42251 Mon Sep 17 00:00:00 2001 From: Oren <oren_segal@student.uml.edu> Date: Fri, 1 May 2015 22:01:23 -0400 Subject: [PATCH] Added memory leak patch --- .../src/cpp/runKernel/Aparapi.cpp | 35 ++++++++++++++++++- .../src/cpp/runKernel/ArrayBuffer.cpp | 11 ++++++ .../src/cpp/runKernel/ArrayBuffer.h | 1 + 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/src/aparapi/com.amd.aparapi.jni/src/cpp/runKernel/Aparapi.cpp b/src/aparapi/com.amd.aparapi.jni/src/cpp/runKernel/Aparapi.cpp index dbd05ca1..4c5be21d 100644 --- a/src/aparapi/com.amd.aparapi.jni/src/cpp/runKernel/Aparapi.cpp +++ b/src/aparapi/com.amd.aparapi.jni/src/cpp/runKernel/Aparapi.cpp @@ -1169,6 +1169,30 @@ inline char* getClassName(JNIEnv* jenv, JNIContext* jniContext, const char *optE return classNameStr; } +const char *OSPathSeparator = +#ifdef _WIN32 + "\\"; +#else + "/"; +#endif + +char *buildFilePath(const char *basePart,const char *filePart) +{ + int fullPathLength = strlen(filePart); + if(basePart!=NULL) + fullPathLength += strlen(basePart); + char *fullPath = new char[fullPathLength + 1]; + if(basePart!=NULL) + { + strcpy(fullPath,basePart); + // !!! Handle os dependent separator !!! + if(fullPath[strlen(fullPath)-1]!=OSPathSeparator[0]) + strcat(fullPath,OSPathSeparator); + } + strcat(fullPath,filePart); + return fullPath; +} + void writeProfile(JNIEnv* jenv, JNIContext* jniContext) { // compute profile filename // indicate cpu or gpu @@ -1276,6 +1300,10 @@ JNI_JAVA(jlong, KernelRunnerJNI, buildProgramJNI) #define BINARY_FILE_EXT ".aocx" #endif +// allows defining an alternative folder where bin files should be loaded from +// Usefull when running in aparapi embeded mode +#define BINARY_FOLDER_ENV_VAR "APARAPI_CL_BIN_FOLDER" + const char *sourceChars = jenv->GetStringUTFChars(source, NULL); //#ifdef OUTPUT_OCL_FILE @@ -1283,9 +1311,14 @@ JNI_JAVA(jlong, KernelRunnerJNI, buildProgramJNI) //#endif #ifdef USE_BINARY_FILE + char *binFileFolder = getenv(BINARY_FOLDER_ENV_VAR); + fprintf(stderr, "Bin Folder is %s\n",binFileFolder); char *binFileName = getClassName(jenv,jniContext,BINARY_FILE_EXT); - jniContext->program = CLHelper::createProgramWithBinary(jenv, jniContext->context, 1, &jniContext->deviceId, binFileName, NULL, &status); + char *fullBinFilePath = buildFilePath(binFileFolder,binFileName); + fprintf(stderr, "FullBinFilePath is %s\n",fullBinFilePath); + jniContext->program = CLHelper::createProgramWithBinary(jenv, jniContext->context, 1, &jniContext->deviceId, fullBinFilePath, NULL, &status); delete []binFileName; + delete []fullBinFilePath; #else jniContext->program = CLHelper::createProgramWithSource(jenv, jniContext->context, 1, &jniContext->deviceId, sourceChars, NULL, &status); #endif diff --git a/src/aparapi/com.amd.aparapi.jni/src/cpp/runKernel/ArrayBuffer.cpp b/src/aparapi/com.amd.aparapi.jni/src/cpp/runKernel/ArrayBuffer.cpp index 654bf658..ce1ad9c8 100644 --- a/src/aparapi/com.amd.aparapi.jni/src/cpp/runKernel/ArrayBuffer.cpp +++ b/src/aparapi/com.amd.aparapi.jni/src/cpp/runKernel/ArrayBuffer.cpp @@ -49,6 +49,17 @@ ArrayBuffer::ArrayBuffer(): isPinned(false){ } +ArrayBuffer::~ArrayBuffer() +{ + // !!! oren fix mem leak + if(addr!=NULL) + { + acl_aligned_free(addr);//aclPtr + fprintf(stderr, "Deallocated %d bytes at address %x\n",lengthInBytes,(long)addr); + //addr = NULL; + } +} + void ArrayBuffer::unpinAbort(JNIEnv *jenv){ // !!! oren mem test //jenv->ReleasePrimitiveArrayCritical((jarray)javaArray, addr,JNI_ABORT); diff --git a/src/aparapi/com.amd.aparapi.jni/src/cpp/runKernel/ArrayBuffer.h b/src/aparapi/com.amd.aparapi.jni/src/cpp/runKernel/ArrayBuffer.h index 1bc5aa76..87c9da6a 100644 --- a/src/aparapi/com.amd.aparapi.jni/src/cpp/runKernel/ArrayBuffer.h +++ b/src/aparapi/com.amd.aparapi.jni/src/cpp/runKernel/ArrayBuffer.h @@ -102,6 +102,7 @@ class ArrayBuffer{ ProfileInfo write; ArrayBuffer(); + ~ArrayBuffer(); void unpinAbort(JNIEnv *jenv); void unpinCommit(JNIEnv *jenv); void pin(JNIEnv *jenv); -- GitLab