-/* 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. */
*/
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;
#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;
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
*/
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
#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
* 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)