changeset 49:2db3640905ef

Rewrite RealTime so as not to use a native object handle, removing onerous and unsatisfactory requirement to call dispose() on all RealTime objects or leak native heap
author Chris Cannam
date Wed, 02 Sep 2015 15:17:40 +0100
parents bac96f9d9295
children aadf45ed0d40
files org/vamp_plugins/RealTime.java src/Plugin.cpp src/RealTime.cpp src/getset.cpp src/getset.h src/org_vamp_plugins_RealTime.h test/test.java
diffstat 7 files changed, 41 insertions(+), 43 deletions(-) [+]
line wrap: on
line diff
--- a/org/vamp_plugins/RealTime.java	Wed Mar 06 15:08:40 2013 +0000
+++ b/org/vamp_plugins/RealTime.java	Wed Sep 02 15:17:40 2015 +0100
@@ -34,12 +34,18 @@
 
 package org.vamp_plugins;
 
+/**
+ * RealTime class, corresponding to the C++ Vamp::RealTime.
+ *
+ * Although the implementation is in native code, this class does not
+ * store a native object handle and has no dispose() method -- it can
+ * be garbage collected without prior disposal like any plain Java
+ * object.
+ */
 public class RealTime
 {
     public RealTime(int s, int n) { initialise(s, n); }
 
-    public native void dispose();
-
     public native int sec();
     public native int nsec();
 
@@ -59,7 +65,8 @@
     public native static long realTime2Frame(RealTime r, int sampleRate);
 
     private native void initialise(int s, int n);
-    private long nativeHandle;
+    private int m_s;
+    private int m_n;
 }
 
 
--- a/src/Plugin.cpp	Wed Mar 06 15:08:40 2013 +0000
+++ b/src/Plugin.cpp	Wed Sep 02 15:17:40 2015 +0100
@@ -372,7 +372,7 @@
 {
     Plugin *p = getHandle<Plugin>(env, obj);
 
-    const Vamp::RealTime *const rt = getHandle<Vamp::RealTime>(env, timestamp);
+    Vamp::RealTime rt = getRealTime(env, timestamp);
     
     int channels = env->GetArrayLength(data);
     float **arr = new float *[channels];
@@ -383,7 +383,7 @@
 	input[c] = arr[c] + offset;
     }
 
-    Plugin::FeatureSet features = p->process(input, *rt);
+    Plugin::FeatureSet features = p->process(input, rt);
 
     for (int c = 0; c < channels; ++c) {
         jfloatArray cdata = (jfloatArray)env->GetObjectArrayElement(data, c);
--- a/src/RealTime.cpp	Wed Mar 06 15:08:40 2013 +0000
+++ b/src/RealTime.cpp	Wed Sep 02 15:17:40 2015 +0100
@@ -36,59 +36,51 @@
 
 #include <vamp-hostsdk/RealTime.h>
 
-#include "handle.h"
+#include "getset.h"
 
 using Vamp::RealTime;
 using std::string;
 
-JNIEXPORT void JNICALL
-Java_org_vamp_1plugins_RealTime_dispose(JNIEnv *env, jobject obj)
-{
-    RealTime *rt = getHandle<RealTime>(env, obj);
-    setHandle<RealTime>(env, obj, 0);
-    delete rt;
-}
-
 JNIEXPORT jint JNICALL
 Java_org_vamp_1plugins_RealTime_sec(JNIEnv *env, jobject obj)
 {
-    RealTime *rt = getHandle<RealTime>(env, obj);
-    return rt->sec;
+    RealTime rt = getRealTime(env, obj);
+    return rt.sec;
 }
 
 JNIEXPORT jint JNICALL
 Java_org_vamp_1plugins_RealTime_nsec(JNIEnv *env, jobject obj)
 {
-    RealTime *rt = getHandle<RealTime>(env, obj);
-    return rt->nsec;
+    RealTime rt = getRealTime(env, obj);
+    return rt.nsec;
 }    
 
 JNIEXPORT jint JNICALL
 Java_org_vamp_1plugins_RealTime_usec(JNIEnv *env, jobject obj)
 {
-    RealTime *rt = getHandle<RealTime>(env, obj);
-    return rt->usec();
+    RealTime rt = getRealTime(env, obj);
+    return rt.usec();
 }
 
 JNIEXPORT jint JNICALL
 Java_org_vamp_1plugins_RealTime_msec(JNIEnv *env, jobject obj)
 {
-    RealTime *rt = getHandle<RealTime>(env, obj);
-    return rt->msec();
+    RealTime rt = getRealTime(env, obj);
+    return rt.msec();
 }
 
 JNIEXPORT jstring JNICALL
 Java_org_vamp_1plugins_RealTime_toString(JNIEnv *env, jobject obj)
 {
-    RealTime *rt = getHandle<RealTime>(env, obj);
-    return env->NewStringUTF(rt->toString().c_str());
+    RealTime rt = getRealTime(env, obj);
+    return env->NewStringUTF(rt.toString().c_str());
 }
 
 JNIEXPORT jstring JNICALL
 Java_org_vamp_1plugins_RealTime_toText(JNIEnv *env, jobject obj)
 {
-    RealTime *rt = getHandle<RealTime>(env, obj);
-    return env->NewStringUTF(rt->toText().c_str());
+    RealTime rt = getRealTime(env, obj);
+    return env->NewStringUTF(rt.toText().c_str());
 }    
 
 JNIEXPORT jobject JNICALL
@@ -121,16 +113,14 @@
 JNIEXPORT jlong JNICALL
 Java_org_vamp_1plugins_RealTime_realTime2Frame(JNIEnv *env, jclass cls, jobject obj, jint sampleRate)
 {
-    RealTime *rt = getHandle<RealTime>(env, obj);
-    return RealTime::realTime2Frame(*rt, sampleRate);
+    RealTime rt = getRealTime(env, obj);
+    return RealTime::realTime2Frame(rt, sampleRate);
 }
 
 JNIEXPORT void JNICALL
 Java_org_vamp_1plugins_RealTime_initialise(JNIEnv *env, jobject obj, jint sec, jint nsec)
 {
-    RealTime *rt = new RealTime(sec, nsec);
-    setHandle(env, obj, rt);
+    setIntField(env, obj, "m_s", sec);
+    setIntField(env, obj, "m_n", nsec);
 }
 
-
-
--- a/src/getset.cpp	Wed Mar 06 15:08:40 2013 +0000
+++ b/src/getset.cpp	Wed Sep 02 15:17:40 2015 +0100
@@ -44,6 +44,14 @@
 			    env->GetFieldID(cls, name.c_str(), "I"));
 }
 
+Vamp::RealTime
+getRealTime(JNIEnv *env, jobject obj)
+{
+    int s = getIntField(env, obj, "m_s");
+    int n = getIntField(env, obj, "m_n");
+    return Vamp::RealTime(s, n);
+}
+
 void
 setStringField(JNIEnv *env, jobject obj, std::string name, std::string value)
 {
--- a/src/getset.h	Wed Mar 06 15:08:40 2013 +0000
+++ b/src/getset.h	Wed Sep 02 15:17:40 2015 +0100
@@ -45,6 +45,9 @@
 extern int
 getIntField(JNIEnv *env, jobject obj, std::string name);
 
+extern Vamp::RealTime
+getRealTime(JNIEnv *env, jobject obj); // where obj is a RealTime object
+    
 extern void
 setStringField(JNIEnv *env, jobject obj, std::string name, std::string value);
 
--- a/src/org_vamp_plugins_RealTime.h	Wed Mar 06 15:08:40 2013 +0000
+++ b/src/org_vamp_plugins_RealTime.h	Wed Sep 02 15:17:40 2015 +0100
@@ -7,13 +7,6 @@
 #ifdef __cplusplus
 extern "C" {
 #endif
-/*
- * Class:     org_vamp_plugins_RealTime
- * Method:    dispose
- * Signature: ()V
- */
-JNIEXPORT void JNICALL Java_org_vamp_1plugins_RealTime_dispose
-  (JNIEnv *, jobject);
 
 /*
  * Class:     org_vamp_plugins_RealTime
--- a/test/test.java	Wed Mar 06 15:08:40 2013 +0000
+++ b/test/test.java	Wed Sep 02 15:17:40 2015 +0100
@@ -126,10 +126,7 @@
 		    buffers[0][1] = -0.5f;
 		}
 		RealTime timestamp = RealTime.frame2RealTime(block * 1024, 44100);
-		Map<Integer, List<Feature>>
-		    features = p.process(buffers, timestamp);
-
-		timestamp.dispose();
+		Map<Integer, List<Feature>> features = p.process(buffers, timestamp);
 
 		printFeatures(features);
 	    }