From c0f6cf36a519421cac89601a52a85aa792ddc20f Mon Sep 17 00:00:00 2001 From: Maros Marsalek Date: Wed, 16 Nov 2016 11:29:33 +0100 Subject: VPP-534 Remove references to DTOs created in JVpp 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 --- vpp-api/java/jvpp-registry/jvpp_registry.c | 1 + vpp-api/java/jvpp/gen/jvppgen/jni_gen.py | 4 ++++ vpp-api/java/jvpp/gen/jvppgen/jvpp_c_gen.py | 2 ++ 3 files changed, 7 insertions(+) diff --git a/vpp-api/java/jvpp-registry/jvpp_registry.c b/vpp-api/java/jvpp-registry/jvpp_registry.c index af20916e0d9..5d2326a0aa3 100644 --- a/vpp-api/java/jvpp-registry/jvpp_registry.c +++ b/vpp-api/java/jvpp-registry/jvpp_registry.c @@ -157,6 +157,7 @@ static void vl_api_control_ping_reply_t_handler( (*env)->CallVoidMethod(env, rm->registryObject, callbackMethod, dto); + (*env)->DeleteLocalRef(env, dto); } } diff --git a/vpp-api/java/jvpp/gen/jvppgen/jni_gen.py b/vpp-api/java/jvpp/gen/jvppgen/jni_gen.py index 4b03b31d163..eee8660a2b0 100644 --- a/vpp-api/java/jvpp/gen/jvppgen/jni_gen.py +++ b/vpp-api/java/jvpp/gen/jvppgen/jni_gen.py @@ -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}); } """) diff --git a/vpp-api/java/jvpp/gen/jvppgen/jvpp_c_gen.py b/vpp-api/java/jvpp/gen/jvppgen/jvpp_c_gen.py index 1a35a6c09c0..5fc84c7b050 100644 --- a/vpp-api/java/jvpp/gen/jvppgen/jvpp_c_gen.py +++ b/vpp-api/java/jvpp/gen/jvppgen/jvpp_c_gen.py @@ -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); }""") -- cgit 1.2.3-korg