X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/9eb73333bab738e12a11bfcc1147def644eb42a9..461406a7de84177863ce0d70fa8017a147ca9990:/src/msg/msg_gos.c diff --git a/src/msg/msg_gos.c b/src/msg/msg_gos.c index 061ddf499d..4b5ff6d1da 100644 --- a/src/msg/msg_gos.c +++ b/src/msg/msg_gos.c @@ -23,6 +23,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(msg_gos, msg, */ MSG_error_t MSG_task_execute(m_task_t task) { + xbt_ex_t e; simdata_task_t simdata = NULL; simdata_process_t p_simdata; e_smx_state_t comp_state; @@ -59,15 +60,16 @@ MSG_error_t MSG_task_execute(m_task_t task) #ifdef HAVE_TRACING simcall_set_category(simdata->compute, task->category); #endif - + p_simdata->waiting_action = simdata->compute; - comp_state = simcall_host_execution_wait(simdata->compute); - p_simdata->waiting_action = NULL; + TRY { + comp_state = simcall_host_execution_wait(simdata->compute); + p_simdata->waiting_action = NULL; - simdata->isused=0; + simdata->isused=0; + + XBT_DEBUG("Execution task '%s' finished in state %d", task->name, (int)comp_state); - XBT_DEBUG("Execution task '%s' finished in state %d", task->name, (int)comp_state); - if (comp_state == SIMIX_DONE) { /* action ended, set comm and compute = NULL, the actions is already destroyed in the main function */ simdata->computation_amount = 0.0; simdata->comm = NULL; @@ -76,23 +78,32 @@ MSG_error_t MSG_task_execute(m_task_t task) TRACE_msg_task_execute_end(task); #endif MSG_RETURN(MSG_OK); - } else if (simcall_host_get_state(SIMIX_host_self()) == 0) { - /* action ended, set comm and compute = NULL, the actions is already destroyed in the main function */ - simdata->comm = NULL; - simdata->compute = NULL; -#ifdef HAVE_TRACING - TRACE_msg_task_execute_end(task); -#endif - MSG_RETURN(MSG_HOST_FAILURE); - } else { - /* action ended, set comm and compute = NULL, the actions is already destroyed in the main function */ - simdata->comm = NULL; - simdata->compute = NULL; -#ifdef HAVE_TRACING - TRACE_msg_task_execute_end(task); -#endif - MSG_RETURN(MSG_TASK_CANCELED); + } + CATCH(e) { + switch (e.category) { + case host_error: + /* action ended, set comm and compute = NULL, the actions is already destroyed in the main function */ + simdata->comm = NULL; + simdata->compute = NULL; + #ifdef HAVE_TRACING + TRACE_msg_task_execute_end(task); + #endif + MSG_RETURN(MSG_HOST_FAILURE); + break; + case cancel_error: + /* action ended, set comm and compute = NULL, the actions is already destroyed in the main function */ + simdata->comm = NULL; + simdata->compute = NULL; + #ifdef HAVE_TRACING + TRACE_msg_task_execute_end(task); + #endif + MSG_RETURN(MSG_TASK_CANCELED); + break; + default: + RETHROW; + } } + MSG_RETURN(MSG_OK); } /** \ingroup m_task_management @@ -626,7 +637,7 @@ void MSG_comm_destroy(msg_comm_t comm) * It takes two parameters. * \param comm the communication to wait. * \param timeout Wait until the communication terminates or the timeout -occurs. You can provide a -1 timeout to obtain an infinite timeout. + * occurs. You can provide a -1 timeout to obtain an infinite timeout. * \return MSG_error_t */ MSG_error_t MSG_comm_wait(msg_comm_t comm, double timeout)