X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/cb91af44a1bd7e5f331686df25d5fe80ff571a43..1205efea3b6565a8b16a80e0d3e6e30853b66ad0:/src/msg/msg_gos.c diff --git a/src/msg/msg_gos.c b/src/msg/msg_gos.c index 5081378556..9f04b7a529 100644 --- a/src/msg/msg_gos.c +++ b/src/msg/msg_gos.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2004-2011. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2004-2012. The SimGrid Team. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ @@ -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 @@ -223,7 +234,7 @@ MSG_error_t MSG_parallel_task_execute(m_task_t task) */ MSG_error_t MSG_process_sleep(double nb_sec) { - e_smx_state_t state; + xbt_ex_t e; /*m_process_t proc = MSG_process_self();*/ #ifdef HAVE_TRACING @@ -231,25 +242,32 @@ MSG_error_t MSG_process_sleep(double nb_sec) #endif /* create action to sleep */ - state = simcall_process_sleep(nb_sec); /*proc->simdata->waiting_action = act_sleep; FIXME: check if not setting the waiting_action breaks something on msg proc->simdata->waiting_action = NULL;*/ - - if (state == SIMIX_DONE) { -#ifdef HAVE_TRACING - TRACE_msg_process_sleep_out(MSG_process_self()); -#endif - MSG_RETURN(MSG_OK); - } else { -#ifdef HAVE_TRACING - TRACE_msg_process_sleep_out(MSG_process_self()); -#endif - MSG_RETURN(MSG_HOST_FAILURE); + + TRY { + simcall_process_sleep(nb_sec); } + CATCH(e) { + switch (e.category) { + case host_error: + #ifdef HAVE_TRACING + TRACE_msg_process_sleep_out(MSG_process_self()); + #endif + MSG_RETURN(MSG_HOST_FAILURE); + break; + default: + RETHROW; + } + } + #ifdef HAVE_TRACING + TRACE_msg_process_sleep_out(MSG_process_self()); + #endif + MSG_RETURN(MSG_OK); } /** \ingroup msg_task_usage @@ -473,8 +491,8 @@ void MSG_task_dsend(m_task_t task, const char *alias, void_f_pvoid_t cleanup) * * This is a non blocking function: use MSG_comm_wait() or MSG_comm_test() * to end the communication. - * - * \param task a memory location for storing a #m_task_t. + * + * \param task a memory location for storing a #m_task_t. has to be valid until the end of the communication. * \param name of the mailbox to receive the task on * \return the msg_comm_t communication created */ @@ -625,7 +643,8 @@ 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 + * \param timeout Wait until the communication terminates or the 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) @@ -1033,7 +1052,7 @@ MSG_task_put_with_timeout(m_task_t task, m_host_t dest, && (channel < msg_global->max_channel), "Invalid channel %d", channel); - XBT_DEBUG("MSG_task_put_with_timout: Trying to send a task to '%s'", dest->name); + XBT_DEBUG("MSG_task_put_with_timout: Trying to send a task to '%s'", SIMIX_host_get_name(dest->smx_host)); return MSG_mailbox_put_with_timeout(MSG_mailbox_get_by_channel (dest, channel), task, timeout);