X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/8cbf22c982842e3e988125fef8f898dec699097b..68d0ba33b84b9755a0f9738be9a308a391fca475:/src/msg/msg_gos.c diff --git a/src/msg/msg_gos.c b/src/msg/msg_gos.c index 061ddf499d..0b3a878700 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,76 +23,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(msg_gos, msg, */ MSG_error_t MSG_task_execute(m_task_t task) { - simdata_task_t simdata = NULL; - simdata_process_t p_simdata; - e_smx_state_t comp_state; - - simdata = task->simdata; - - xbt_assert(simdata->host_nb == 0, - "This is a parallel task. Go to hell."); - -#ifdef HAVE_TRACING - TRACE_msg_task_execute_start(task); -#endif - - xbt_assert((!simdata->compute) && (task->simdata->isused == 0), - "This task is executed somewhere else. Go fix your code! %d", - task->simdata->isused); - - XBT_DEBUG("Computing on %s", MSG_process_get_name(MSG_process_self())); - - if (simdata->computation_amount == 0) { -#ifdef HAVE_TRACING - TRACE_msg_task_execute_end(task); -#endif - return MSG_OK; - } - - m_process_t self = SIMIX_process_self(); - p_simdata = SIMIX_process_self_get_data(self); - simdata->isused=1; - simdata->compute = - simcall_host_execute(task->name, p_simdata->m_host->smx_host, - simdata->computation_amount, - simdata->priority); -#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; - - simdata->isused=0; - - 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; - simdata->compute = NULL; -#ifdef HAVE_TRACING - 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); - } + return MSG_parallel_task_execute(task); } /** \ingroup m_task_management @@ -161,56 +92,97 @@ MSG_parallel_task_create(const char *name, int host_nb, */ MSG_error_t MSG_parallel_task_execute(m_task_t task) { + xbt_ex_t e; simdata_task_t simdata = NULL; - e_smx_state_t comp_state; simdata_process_t p_simdata; + e_smx_state_t comp_state; simdata = task->simdata; - p_simdata = SIMIX_process_self_get_data(SIMIX_process_self()); - xbt_assert((!simdata->compute) - && (task->simdata->isused == 0), - "This task is executed somewhere else. Go fix your code!"); + #ifdef HAVE_TRACING + TRACE_msg_task_execute_start(task); + #endif + + xbt_assert((!simdata->compute) && (task->simdata->isused == 0), + "This task is executed somewhere else. Go fix your code! %d", + task->simdata->isused); + + XBT_DEBUG("Computing on %s", MSG_process_get_name(MSG_process_self())); - xbt_assert(simdata->host_nb, - "This is not a parallel task. Go to hell."); + if (simdata->computation_amount == 0) { + #ifdef HAVE_TRACING + TRACE_msg_task_execute_end(task); + #endif + return MSG_OK; + } - XBT_DEBUG("Parallel computing on %s", SIMIX_host_get_name(p_simdata->m_host->smx_host)); + m_process_t self = SIMIX_process_self(); + p_simdata = SIMIX_process_self_get_data(self); - simdata->isused=1; + p_simdata->waiting_action = simdata->compute; + TRY { + #ifdef HAVE_TRACING + simcall_set_category(simdata->compute, task->category); + #endif + + simdata->isused=1; - simdata->compute = + if (simdata->host_nb) { simcall_host_parallel_execute(task->name, simdata->host_nb, simdata->host_list, simdata->comp_amount, simdata->comm_amount, 1.0, -1.0); - XBT_DEBUG("Parallel execution action created: %p", simdata->compute); + comp_state = simcall_host_execution_wait(simdata->compute); + } + else { + simdata->compute = + simcall_host_execute(task->name, p_simdata->m_host->smx_host, + simdata->computation_amount, + simdata->priority); - p_simdata->waiting_action = simdata->compute; - comp_state = simcall_host_execution_wait(simdata->compute); - p_simdata->waiting_action = NULL; - - XBT_DEBUG("Finished waiting for execution of action %p, state = %d", simdata->compute, (int)comp_state); - - simdata->isused=0; - - 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; - simdata->compute = NULL; - 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; - 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; - MSG_RETURN(MSG_TASK_CANCELED); + comp_state = simcall_host_execution_wait(simdata->compute); + } + + p_simdata->waiting_action = NULL; + + simdata->isused=0; + + XBT_DEBUG("Execution task '%s' finished in state %d", task->name, (int)comp_state); } + 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; + } + xbt_ex_free(e); + } + /* action ended, set comm and compute = NULL, the actions is already destroyed in the main function */ + simdata->computation_amount = 0.0; + simdata->comm = NULL; + simdata->compute = NULL; + #ifdef HAVE_TRACING + TRACE_msg_task_execute_end(task); + #endif + + MSG_RETURN(MSG_OK); } @@ -223,7 +195,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 +203,33 @@ 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; + } + xbt_ex_free(e); } + #ifdef HAVE_TRACING + TRACE_msg_process_sleep_out(MSG_process_self()); + #endif + MSG_RETURN(MSG_OK); } /** \ingroup msg_task_usage @@ -626,7 +606,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)