VPP-534 Remove references to DTOs created in JVpp 45/3845/2
authorMaros Marsalek <[email protected]>
Wed, 16 Nov 2016 10:29:33 +0000 (11:29 +0100)
committerDamjan Marion <[email protected]>
Thu, 17 Nov 2016 10:04:55 +0000 (10:04 +0000)
JVM objects allocated from a native thread need to be freed,
they are not subject to GC.

Change-Id: If1e140d2ceaec93631735ae7665f45db5aacf7cf
Signed-off-by: Maros Marsalek <[email protected]>
vpp-api/java/jvpp-registry/jvpp_registry.c
vpp-api/java/jvpp/gen/jvppgen/jni_gen.py
vpp-api/java/jvpp/gen/jvppgen/jvpp_c_gen.py

index af20916..5d2326a 100644 (file)
@@ -157,6 +157,7 @@ static void vl_api_control_ping_reply_t_handler(
 
             (*env)->CallVoidMethod(env, rm->registryObject, callbackMethod,
                     dto);
+            (*env)->DeleteLocalRef(env, dto);
         }
     }
 
index 4b03b31..eee8660 100644 (file)
@@ -46,6 +46,7 @@ u8_array_dto_field_setter_template = Template("""
     jbyteArray ${field_reference_name} = (*env)->NewByteArray(env, ${field_length});
     (*env)->SetByteArrayRegion(env, ${field_reference_name}, 0, ${field_length}, (const jbyte*)mp->${c_name});
     (*env)->SetObjectField(env, ${object_name}, ${field_reference_name}FieldId, ${field_reference_name});
+    (*env)->DeleteLocalRef(env, ${field_reference_name});
 """)
 
 u16_array_dto_field_setter_template = Template("""
@@ -59,6 +60,7 @@ u16_array_dto_field_setter_template = Template("""
 
         (*env)->ReleaseShortArrayElements(env,  ${field_reference_name}, ${field_reference_name}ArrayElements, 0);
         (*env)->SetObjectField(env, ${object_name}, ${field_reference_name}FieldId, ${field_reference_name});
+        (*env)->DeleteLocalRef(env, ${field_reference_name});
     }
 """)
 
@@ -73,6 +75,7 @@ u32_array_dto_field_setter_template = Template("""
 
         (*env)->ReleaseIntArrayElements(env,  ${field_reference_name}, ${field_reference_name}ArrayElements, 0);
         (*env)->SetObjectField(env, ${object_name}, ${field_reference_name}FieldId, ${field_reference_name});
+        (*env)->DeleteLocalRef(env, ${field_reference_name});
     }
 """)
 
@@ -89,6 +92,7 @@ u64_array_dto_field_setter_template = Template("""
 
         (*env)->ReleaseLongArrayElements(env,  ${field_reference_name}, ${field_reference_name}ArrayElements, 0);
         (*env)->SetObjectField(env, ${object_name}, ${field_reference_name}FieldId, ${field_reference_name});
+        (*env)->DeleteLocalRef(env, ${field_reference_name});
     }
 """)
 
index 1a35a6c..5fc84c7 100644 (file)
@@ -222,6 +222,8 @@ static void vl_api_${handler_name}_t_handler (vl_api_${handler_name}_t * mp)
     $dto_setters
 
     (*env)->CallVoidMethod(env, plugin_main->callbackObject, callbackMethod, dto);
+    // free DTO as per http://stackoverflow.com/questions/1340938/memory-leak-when-calling-java-code-from-c-using-jni
+    (*env)->DeleteLocalRef(env, dto);
 }""")