From 4df4d0eae33fbcffb0443fd5577ad2e4144da2bd Mon Sep 17 00:00:00 2001 From: Martin Quinson Date: Sun, 26 Apr 2015 01:39:37 +0200 Subject: [PATCH] Actually allows the GC to reclaim tasks (fix #18874) --- ChangeLog | 2 ++ src/bindings/java/jmsg_task.c | 10 ++++++++++ src/bindings/java/jmsg_task.h | 2 ++ src/bindings/java/org/simgrid/msg/Task.java | 22 +++++++++++---------- 4 files changed, 26 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index dc3e85d4e0..af38a7ee48 100644 --- a/ChangeLog +++ b/ChangeLog @@ -16,6 +16,8 @@ SimGrid (3.12) NOT RELEASED; urgency=low - Rename Process.currentProcess() to Process.getCurrentProcess() - Rename Task.setDataSize() to Task.setBytesAmount() - Merge Task.getRemainingDuration() and Task.getComputeDuration() into Task.getFlopsAmount() + * Bug fixes: + - #18874: Actually allows the GC to reclaim tasks SIMIX: * New functions diff --git a/src/bindings/java/jmsg_task.c b/src/bindings/java/jmsg_task.c index 850a999a2c..40cffed7a5 100644 --- a/src/bindings/java/jmsg_task.c +++ b/src/bindings/java/jmsg_task.c @@ -651,7 +651,17 @@ MSG_task_set_data(task, (void *) (*env)->NewGlobalRef(env, jtask)); return jcomm; } +JNIEXPORT void JNICALL +Java_org_simgrid_msg_Task_doFinalize(JNIEnv * env, jobject jtask) { + msg_task_t task = jtask_to_native_task(jtask, env); + + if (!task) { + jxbt_throw_notbound(env, "task", jtask); + return; + } + MSG_task_destroy(task); +} static void msg_task_cancel_on_failed_dsend(void*t) { msg_task_t task = t; diff --git a/src/bindings/java/jmsg_task.h b/src/bindings/java/jmsg_task.h index 77daa9fbd0..2edb2caea1 100644 --- a/src/bindings/java/jmsg_task.h +++ b/src/bindings/java/jmsg_task.h @@ -71,6 +71,8 @@ Java_org_simgrid_msg_Task_nativeInit(JNIEnv *env, jclass cls); JNIEXPORT void JNICALL Java_org_simgrid_msg_Task_create (JNIEnv * env, jobject jtask, jstring jname, jdouble jcomputeDuration, jdouble jmessageSize); +JNIEXPORT void JNICALL +Java_org_simgrid_msg_Task_doFinalize(JNIEnv * env, jobject jtask); /* * Class org_simgrid_msg_Task * Method parallelCreate diff --git a/src/bindings/java/org/simgrid/msg/Task.java b/src/bindings/java/org/simgrid/msg/Task.java index 95893ec91a..16e54ef1ac 100644 --- a/src/bindings/java/org/simgrid/msg/Task.java +++ b/src/bindings/java/org/simgrid/msg/Task.java @@ -161,17 +161,19 @@ public class Task { /** Cancels a task. */ public native void cancel(); - /** Deletes a task. - * - * @exception NativeException if the destruction failed. - */ - protected void finalize() throws NativeException { - destroy(); + /** Deletes a task once the garbage collector reclaims it */ + @Override + protected void finalize() { + try { + // Exceptions in finalizers lead to bad situations: + // http://stackoverflow.com/questions/7644556/troubleshooting-a-java-memory-leak-finalization + doFinalize(); + bind=0; // to avoid segfaults if the impossible happens yet again making this task surviving its finalize() + } catch (Exception e) { + e.printStackTrace(); + } } - /** - * The natively implemented method to destroy a MSG task. - */ - protected native void destroy(); + protected native void doFinalize(); /* * * * * * Communication-related * * * * * */ -- 2.20.1