From 755ed7e182b5976f714930f60a3b8b44c1b5382e Mon Sep 17 00:00:00 2001
From: CoreRasurae <luis.p.mendes@gmail.com>
Date: Thu, 22 Aug 2019 11:47:43 +0100
Subject: [PATCH] Refactor: Refactored ArrayBuffer class and Aparapi.cpp to
 make it more OO in terms of concerns separation

---
 src/cpp/runKernel/Aparapi.cpp     | 36 +----------------
 src/cpp/runKernel/ArrayBuffer.cpp | 66 ++++++++++++++++++++++++++++++-
 src/cpp/runKernel/ArrayBuffer.h   |  2 +
 3 files changed, 69 insertions(+), 35 deletions(-)

diff --git a/src/cpp/runKernel/Aparapi.cpp b/src/cpp/runKernel/Aparapi.cpp
index 02d9676..807bf81 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 42300d5..55be9eb 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 26cdbe5..1be98a0 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
-- 
GitLab