[vtkusers] is VTKDelete() intended for public use?
Steve M. Robbins
steven.robbins at videotron.ca
Thu Oct 6 22:38:11 EDT 2005
Hello,
This question concerns the java wrapping.
Since VTK objects like vtkImageData are potentially very large, a
colleague and I were looking for a way to release the resources
immediately (from java). We found method VTKDelete() in
vtkObjectBase, which sounds like it fits the bill and is a public
method. Is this the intended way to release VTK resources?
Unfortunately, VTKDelete() is not usable because it can only be called
once and the finalizer is -- correctly -- calling it. See the java
code at the end for a demonstration. The trouble is that the JNI code
is not handling a null return from vtkJavaGetPointerFromObject().
The current code is:
extern "C" JNIEXPORT void JNICALL Java_vtk_vtkObjectBase_VTKDelete(JNIEnv *env,jobject obj)
{
vtkObjectBase *op;
op = (vtkObjectBase *)vtkJavaGetPointerFromObject(env,obj,(char *) "vtkObjectBase");
vtkJavaDeleteObject(env,obj);
op->Delete();
}
Could we simply add a line that returns early if op is NULL?
This yields
extern "C" JNIEXPORT void JNICALL Java_vtk_vtkObjectBase_VTKDelete(JNIEnv *env,jobject obj)
{
vtkObjectBase *op;
op = (vtkObjectBase *)vtkJavaGetPointerFromObject(env,obj,(char *) "vtkObjectBase");
if (op == NULL) return;
vtkJavaDeleteObject(env,obj);
op->Delete();
}
The following patch achieves this:
--- VTK-4.4.2.orig/Wrapping/vtkWrapJava.c 2003-11-14 15:43:38.000000000 -0500
+++ VTK-4.4.2/Wrapping/vtkWrapJava.c 2005-10-06 21:32:41.000000000 -0400
@@ -822,6 +822,7 @@
fprintf(fp,"{\n %s *op;\n",data->ClassName);
fprintf(fp," op = (%s *)vtkJavaGetPointerFromObject(env,obj,(char *) \"%s\");\n",
data->ClassName,data->ClassName);
+ fprintf(fp," if (op == NULL) return;\n");
fprintf(fp," vtkJavaDeleteObject(env,obj);\n");
fprintf(fp," op->Delete();\n");
fprintf(fp,"}\n");
Does this look okay?
-Steve
P.S. The following program blows up with a segfault in unpatched JNI
code:
import vtk.vtkObject;
public class TestDelete
{
static
{
System.loadLibrary("vtkCommonJava");
}
public static void main(String[] args)
{
vtkObject obj = new vtkObject();
System.out.println( obj.Print() );
obj.VTKDelete();
System.out.println( "deleted it" );
obj.VTKDelete();
System.out.println( "deleted it" );
}
}
More information about the vtkusers
mailing list