From 7025cd2852c2ebc83d3e1987228db4fa25ce49c5 Mon Sep 17 00:00:00 2001
From: Gary Frost <frost.gary@gmail.com>
Date: Thu, 4 Jul 2013 21:18:37 +0000
Subject: [PATCH] for issue 120 release kernel and program ids

---
 com.amd.aparapi.jni/src/cpp/invoke/OpenCLJNI.cpp    | 10 +++++++++-
 .../java/com/amd/aparapi/device/OpenCLDevice.java   | 13 ++++++++-----
 .../com/amd/aparapi/internal/jni/OpenCLJNI.java     |  4 +++-
 .../amd/aparapi/internal/opencl/OpenCLKernel.java   |  2 +-
 .../amd/aparapi/internal/opencl/OpenCLProgram.java  |  4 ++++
 .../amd/aparapi/sample/extension/SquareExample.java | 13 ++++++++-----
 6 files changed, 33 insertions(+), 13 deletions(-)

diff --git a/com.amd.aparapi.jni/src/cpp/invoke/OpenCLJNI.cpp b/com.amd.aparapi.jni/src/cpp/invoke/OpenCLJNI.cpp
index e1ef0ef4..e985bd18 100644
--- a/com.amd.aparapi.jni/src/cpp/invoke/OpenCLJNI.cpp
+++ b/com.amd.aparapi.jni/src/cpp/invoke/OpenCLJNI.cpp
@@ -250,7 +250,14 @@ void getArg(JNIEnv *jenv, cl_context context, cl_command_queue commandQueue, cl_
    }
 }
 
-JNI_JAVA(void, OpenCLJNI, dispose)
+JNI_JAVA(void, OpenCLJNI, disposeProgram)
+   (JNIEnv *jenv, jobject jobj, jobject programInstance) {
+      fprintf(stderr, "dispose program \n");
+      cl_program program = OpenCLProgram::getProgram(jenv, programInstance);
+      clReleaseProgram(program);
+}
+
+JNI_JAVA(void, OpenCLJNI, disposeKernel)
    (JNIEnv *jenv, jobject jobj, jobject kernelInstance) {
       cl_kernel kernel = OpenCLKernel::getKernel(jenv, kernelInstance);
       jobject programInstance = OpenCLKernel::getProgramInstance(jenv, kernelInstance);
@@ -276,6 +283,7 @@ JNI_JAVA(void, OpenCLJNI, dispose)
             }
          }
       }
+      clReleaseKernel(kernel);
    }
 
 /**
diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/device/OpenCLDevice.java b/com.amd.aparapi/src/java/com/amd/aparapi/device/OpenCLDevice.java
index 6e1cbc13..ec9bed2f 100644
--- a/com.amd.aparapi/src/java/com/amd/aparapi/device/OpenCLDevice.java
+++ b/com.amd.aparapi/src/java/com/amd/aparapi/device/OpenCLDevice.java
@@ -104,13 +104,17 @@ public class OpenCLDevice extends Device{
       private final Map<String, OpenCLKernel> map;
 
       private final OpenCLProgram program;
-
+      private boolean disposed = false;
       public OpenCLInvocationHandler(OpenCLProgram _program, Map<String, OpenCLKernel> _map) {
          program = _program;
          map = _map;
+         disposed = false;
       }
 
       @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+         if (disposed){
+            throw new IllegalStateException("bound interface already disposed");
+         }
          if (!isReservedInterfaceMethod(method)) {
             final OpenCLKernel kernel = map.get(method.getName());
             if (kernel != null) {
@@ -171,10 +175,9 @@ public class OpenCLDevice extends Device{
                for (OpenCLKernel k:map.values()){
                    k.dispose();
                }
-              // args =  map.get(method.getName());
-              // for (OpenCLArgDescriptor argDescriptor:args){
-
-              // }
+               program.dispose();
+               map.clear();
+               disposed=true;
             } else if (method.getName().equals("end")) {
                System.out.println("end not implemented");
             }
diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/internal/jni/OpenCLJNI.java b/com.amd.aparapi/src/java/com/amd/aparapi/internal/jni/OpenCLJNI.java
index 34fd7edc..b69f5aeb 100644
--- a/com.amd.aparapi/src/java/com/amd/aparapi/internal/jni/OpenCLJNI.java
+++ b/com.amd.aparapi/src/java/com/amd/aparapi/internal/jni/OpenCLJNI.java
@@ -22,7 +22,9 @@ public abstract class OpenCLJNI{
 
    protected native void invoke(OpenCLKernel openCLKernel, Object[] args);
 
-   protected native void dispose(OpenCLKernel openCLKernel);
+   protected native void disposeKernel(OpenCLKernel openCLKernel);
+
+   protected native void disposeProgram(OpenCLProgram openCLProgram);
 
    protected native void remap(OpenCLProgram program, OpenCLMem mem, long address);
 
diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/internal/opencl/OpenCLKernel.java b/com.amd.aparapi/src/java/com/amd/aparapi/internal/opencl/OpenCLKernel.java
index 04a95501..19c06592 100644
--- a/com.amd.aparapi/src/java/com/amd/aparapi/internal/opencl/OpenCLKernel.java
+++ b/com.amd.aparapi/src/java/com/amd/aparapi/internal/opencl/OpenCLKernel.java
@@ -58,6 +58,6 @@ public class OpenCLKernel extends OpenCLJNI{
    }
 
    public void dispose(){
-       dispose(this);
+       disposeKernel(this);
    }
 }
diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/internal/opencl/OpenCLProgram.java b/com.amd.aparapi/src/java/com/amd/aparapi/internal/opencl/OpenCLProgram.java
index 27e0641e..23855513 100644
--- a/com.amd.aparapi/src/java/com/amd/aparapi/internal/opencl/OpenCLProgram.java
+++ b/com.amd.aparapi/src/java/com/amd/aparapi/internal/opencl/OpenCLProgram.java
@@ -84,4 +84,8 @@ public class OpenCLProgram extends OpenCLJNI{
       addressToMem.remove(_oldAddress);
       addressToMem.put(_address, _mem);
    }
+
+   public void dispose(){
+       disposeProgram(this);
+   }
 }
diff --git a/samples/extension/src/com/amd/aparapi/sample/extension/SquareExample.java b/samples/extension/src/com/amd/aparapi/sample/extension/SquareExample.java
index cce44e44..23fc9b86 100644
--- a/samples/extension/src/com/amd/aparapi/sample/extension/SquareExample.java
+++ b/samples/extension/src/com/amd/aparapi/sample/extension/SquareExample.java
@@ -57,20 +57,23 @@ public class SquareExample{
       if (device instanceof OpenCLDevice) {
          final OpenCLDevice openclDevice = (OpenCLDevice) device;
 
+         for (int l=0; l<1000; l++){
+
          final SquarerWithResource squarer = openclDevice.bind(SquarerWithResource.class);
          squarer.square(range, in, squares);
 
          for (int i = 0; i < size; i++) {
-            System.out.println(in[i] + " " + squares[i]);
+            System.out.println(l+" "+in[i] + " " + squares[i]);
          }
 
-         squarer.square(range, squares, quads);
+        // squarer.square(range, squares, quads);
 
-         for (int i = 0; i < size; i++) {
-            System.out.println(in[i] + " " + squares[i] + " " + quads[i]);
-         }
+        // for (int i = 0; i < size; i++) {
+         //   System.out.println(l+" "+ in[i] + " " + squares[i] + " " + quads[i]);
+         //}
 
          squarer.dispose();
+         }
       }
    }
 }
-- 
GitLab