X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/d4411cdc259f6450f88ffd93568d90dbd9bd7d47..60ce0b9f4a108a6a7b1d6c883511e21645a853c1:/src/bindings/java/jmsg_task.cpp diff --git a/src/bindings/java/jmsg_task.cpp b/src/bindings/java/jmsg_task.cpp index 0eec487e20..b017a4800b 100644 --- a/src/bindings/java/jmsg_task.cpp +++ b/src/bindings/java/jmsg_task.cpp @@ -127,9 +127,7 @@ JNIEXPORT void JNICALL Java_org_simgrid_msg_Task_execute(JNIEnv * env, jobject j return; } msg_error_t rv; - try { - rv = MSG_task_execute(task); - } catch (simgrid::kernel::context::Context::StopRequest& e) { + if (not simgrid::kernel::context::StopRequest::try_n_catch([&rv, &task]() { rv = MSG_task_execute(task); })) { jxbt_throw_by_name(env, "org/simgrid/msg/ProcessKilledError", "Process killed"); } @@ -288,9 +286,9 @@ JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Task_receive(JNIEnv* env, jclass const char *alias = env->GetStringUTFChars(jalias, 0); msg_error_t rv; - try { - rv = MSG_task_receive_ext(&task, alias, (double)jtimeout, /*host*/ nullptr); - } catch (simgrid::kernel::context::Context::StopRequest& e) { + if (not simgrid::kernel::context::StopRequest::try_n_catch([&rv, &task, &alias, &jtimeout]() { + rv = MSG_task_receive_ext(&task, alias, (double)jtimeout, /*host*/ nullptr); + })) { jxbt_throw_by_name(env, "org/simgrid/msg/ProcessKilledError", "Process killed"); } env->ReleaseStringUTFChars(jalias, alias); @@ -478,6 +476,10 @@ static void msg_task_cancel_on_failed_dsend(void*t) { /* Destroy the global ref so that the JVM can free the stuff */ env->DeleteGlobalRef(jtask_global); MSG_task_set_data(task, nullptr); + /* Don't free the C data here, to avoid a race condition with the GC also sometimes doing so. + * A rare memleak is seen as preferable to a rare "free(): invalid pointer" failure that + * proves really hard to debug. + */ } JNIEXPORT void JNICALL Java_org_simgrid_msg_Task_dsend(JNIEnv * env, jobject jtask, jstring jalias)