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