From 6e18aa5068b4eca2cbfde6ca163cd860521195f7 Mon Sep 17 00:00:00 2001 From: Adrien Lebre Date: Mon, 28 Jul 2014 17:53:54 +0200 Subject: [PATCH 1/1] Found a bug/feature regarding the cancellation of a sleep (see comments directly in the code) + add a temporary patch directly at the java level in order to force a hostFailureException - Adrien --- src/bindings/java/jmsg_process.c | 11 ++++++++++- src/msg/msg_gos.c | 7 +++++++ src/simix/smx_process.c | 3 ++- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/bindings/java/jmsg_process.c b/src/bindings/java/jmsg_process.c index 7bb72ea46a..8625d25479 100644 --- a/src/bindings/java/jmsg_process.c +++ b/src/bindings/java/jmsg_process.c @@ -340,7 +340,16 @@ Java_org_simgrid_msg_Process_sleep(JNIEnv *env, jclass cls, jlong jmillis, jint msg_error_t rv; rv = MSG_process_sleep(time); if (rv != MSG_OK) { - jmsg_throw_status(env,rv); + XBT_DEBUG("Something during the MSG_process_sleep invocation was wrong, trigger a HostFailureException"); + + //jmsg_throw_status(env,rv); + + // adsein, the code above as been replaced by the code below. Indeed, according to the documentation, a sleep can only + // trigger a host_failure exception. When the sleep crashes due to a host shutdown, the exception thrown by smx_context_java.c + // is a cancelled_error, see bindings/java/smx_context_java.c, function void smx_ctx_java_stop(smx_context_t context) and src/msg/msg_gos.c + // function msg_error_t MSG_process_sleep(double nb_sec) + + jxbt_throw_host_failure(env,NULL); } } JNIEXPORT void JNICALL diff --git a/src/msg/msg_gos.c b/src/msg/msg_gos.c index 447b68b57e..df8c0d3583 100644 --- a/src/msg/msg_gos.c +++ b/src/msg/msg_gos.c @@ -169,6 +169,13 @@ msg_error_t MSG_process_sleep(double nb_sec) CATCH(e) { switch (e.category) { case cancel_error: + XBT_DEBUG("According to the JAVA API, a sleep call should only deal with HostFailureException, WTF here ?"); + // adsein: MSG_TASK_CANCELED is assigned when someone kills the process that made the sleep, this is not + // correct. For instance, when the node is turned off, the error should be MSG_HOST_FAILURE, which is by the way + // and according to the JAVA document, the only exception that can be triggered by MSG_Process_sleep call. + // To avoid possible impacts in the code, I just raised a host_failure execption for the moment in the JAVA code + // and did not change anythings at the C level. + // See comment in the jmsg_process.c file, function JNIEXPORT void JNICALL Java_org_simgrid_msg_Process_sleep(JNIEnv *env, jclass cls, jlong jmillis, jint jnanos) status = MSG_TASK_CANCELED; break; default: diff --git a/src/simix/smx_process.c b/src/simix/smx_process.c index 8d2320a51b..84bcef1bee 100644 --- a/src/simix/smx_process.c +++ b/src/simix/smx_process.c @@ -759,7 +759,7 @@ void SIMIX_post_process_sleep(smx_action_t action) switch(surf_action_get_state(action->sleep.surf_sleep)){ case SURF_ACTION_FAILED: simcall->issuer->context->iwannadie = 1; - //SMX_EXCEPTION(simcall->issuer, host_error, 0, "Host failed"); + //SMX_EXCEPTION(simcall->issuer, host_error, 0, "Host failed"); state = SIMIX_SRC_HOST_FAILURE; break; @@ -840,6 +840,7 @@ void SIMIX_process_yield(smx_process_t self) if (self->context->iwannadie){ XBT_DEBUG("I wanna die!"); SIMIX_process_stop(self); + XBT_DEBUG("SIMIX Stop done"); } if (self->suspended) { -- 2.20.1