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);