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 dbd05ca1741525447deb3fc1c18ff1443f879975..4c5be21da959823c1b2bfbf961c60dff965c7158 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 654bf65893c441b7e0d7704508104c705a443b42..ce1ad9c8bd91b3b6dd94566cc396a99b498b9685 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 1bc5aa769f77cce66397438dedb8a535c5850d37..87c9da6a9d3abd7bce26d43ae18a299a158d4291 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);