X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/7e9b6e88f6c2daa87a9f5370596e5acc7f73fc6a..d9cad55dcc546b3936c278258e7f463ac70066df:/src/msg/msg_gos.c diff --git a/src/msg/msg_gos.c b/src/msg/msg_gos.c index 4b5ff6d1da..a5839c38e5 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. */ @@ -22,206 +22,97 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(msg_gos, msg, * or #MSG_HOST_FAILURE otherwise */ MSG_error_t MSG_task_execute(m_task_t task) +{ + return MSG_parallel_task_execute(task); +} + +/** \ingroup msg_task_usage + * \brief Executes a parallel task and waits for its termination. + * + * \param task a #m_task_t to execute on the location on which the process is running. + * + * \return #MSG_OK if the task was successfully completed, #MSG_TASK_CANCELED + * or #MSG_HOST_FAILURE otherwise + */ +MSG_error_t MSG_parallel_task_execute(m_task_t task) { xbt_ex_t e; - simdata_task_t simdata = NULL; - simdata_process_t p_simdata; + simdata_task_t simdata = task->simdata; + msg_process_t self = SIMIX_process_self(); + simdata_process_t p_simdata = SIMIX_process_self_get_data(self); e_smx_state_t comp_state; - - simdata = task->simdata; - - xbt_assert(simdata->host_nb == 0, - "This is a parallel task. Go to hell."); + MSG_error_t status = MSG_OK; #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); + "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) { + if (simdata->computation_amount == 0 && !simdata->host_nb) { #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); + + TRY { + + simdata->isused=1; + + if (simdata->host_nb > 0) { + simdata->compute = 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); + } else { + 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); + simcall_set_category(simdata->compute, task->category); #endif - - p_simdata->waiting_action = simdata->compute; - TRY { + 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); - - /* 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); - } + 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); + case cancel_error: + status = MSG_TASK_CANCELED; break; - default: - RETHROW; + default: + RETHROW; } + xbt_ex_free(e); } - MSG_RETURN(MSG_OK); -} - -/** \ingroup m_task_management - * \brief Creates a new #m_task_t (a parallel one....). - * - * A constructor for #m_task_t taking six arguments and returning the - corresponding object. - * \param name a name for the object. It is for user-level information - and can be NULL. - * \param host_nb the number of hosts implied in the parallel task. - * \param host_list an array of \p host_nb m_host_t. - * \param computation_amount an array of \p host_nb - doubles. computation_amount[i] is the total number of operations - that have to be performed on host_list[i]. - * \param communication_amount an array of \p host_nb* \p host_nb doubles. - * \param data a pointer to any data may want to attach to the new - object. It is for user-level information and can be NULL. It can - be retrieved with the function \ref MSG_task_get_data. - * \see m_task_t - * \return The new corresponding object. - */ -m_task_t -MSG_parallel_task_create(const char *name, int host_nb, - const m_host_t * host_list, - double *computation_amount, - double *communication_amount, void *data) -{ - int i; - simdata_task_t simdata = xbt_new0(s_simdata_task_t, 1); - m_task_t task = xbt_new0(s_m_task_t, 1); - task->simdata = simdata; - - /* Task structure */ - task->name = xbt_strdup(name); - task->data = data; - - /* Simulator Data */ - simdata->computation_amount = 0; - simdata->message_size = 0; - simdata->compute = NULL; + /* 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->rate = -1.0; - simdata->isused = 0; - simdata->sender = NULL; - simdata->receiver = NULL; - simdata->source = NULL; - - simdata->host_nb = host_nb; - simdata->host_list = xbt_new0(smx_host_t, host_nb); - simdata->comp_amount = computation_amount; - simdata->comm_amount = communication_amount; - - for (i = 0; i < host_nb; i++) - simdata->host_list[i] = host_list[i]->smx_host; - - return task; -} + simdata->compute = NULL; +#ifdef HAVE_TRACING + TRACE_msg_task_execute_end(task); +#endif -/** \ingroup msg_task_usage - * \brief Executes a parallel task and waits for its termination. - * - * \param task a #m_task_t to execute on the location on which the process is running. - * - * \return #MSG_OK if the task was successfully completed, #MSG_TASK_CANCELED - * or #MSG_HOST_FAILURE otherwise - */ -MSG_error_t MSG_parallel_task_execute(m_task_t task) -{ - simdata_task_t simdata = NULL; - e_smx_state_t comp_state; - simdata_process_t p_simdata; - - 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!"); - - xbt_assert(simdata->host_nb, - "This is not a parallel task. Go to hell."); - - XBT_DEBUG("Parallel computing on %s", SIMIX_host_get_name(p_simdata->m_host->smx_host)); - - simdata->isused=1; - - simdata->compute = - 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); - - 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); - } + MSG_RETURN(status); } @@ -234,33 +125,27 @@ 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; - /*m_process_t proc = MSG_process_self();*/ + MSG_error_t status = MSG_OK; + /*msg_process_t proc = MSG_process_self();*/ #ifdef HAVE_TRACING TRACE_msg_process_sleep_in(MSG_process_self()); #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 + + simcall_process_sleep(nb_sec); + + #ifdef HAVE_TRACING TRACE_msg_process_sleep_out(MSG_process_self()); -#endif - MSG_RETURN(MSG_HOST_FAILURE); - } + #endif + MSG_RETURN(status); } /** \ingroup msg_task_usage @@ -406,7 +291,7 @@ XBT_INLINE msg_comm_t MSG_task_isend_with_matching(m_task_t task, const char *al void *match_data) { simdata_task_t t_simdata = NULL; - m_process_t process = MSG_process_self(); + msg_process_t process = MSG_process_self(); msg_mailbox_t mailbox = MSG_mailbox_get_by_alias(alias); /* FIXME: these functions are not traceable */ @@ -456,7 +341,7 @@ XBT_INLINE msg_comm_t MSG_task_isend_with_matching(m_task_t task, const char *al void MSG_task_dsend(m_task_t task, const char *alias, void_f_pvoid_t cleanup) { simdata_task_t t_simdata = NULL; - m_process_t process = MSG_process_self(); + msg_process_t process = MSG_process_self(); msg_mailbox_t mailbox = MSG_mailbox_get_by_alias(alias); /* FIXME: these functions are not traceable */ @@ -534,12 +419,6 @@ int MSG_comm_test(msg_comm_t comm) } CATCH(e) { switch (e.category) { - - case host_error: - comm->status = MSG_HOST_FAILURE; - finished = 1; - break; - case network_error: comm->status = MSG_TRANSFER_FAILURE; finished = 1; @@ -585,12 +464,6 @@ int MSG_comm_testany(xbt_dynar_t comms) } CATCH(e) { switch (e.category) { - - case host_error: - finished_index = e.value; - status = MSG_HOST_FAILURE; - break; - case network_error: finished_index = e.value; status = MSG_TRANSFER_FAILURE; @@ -655,9 +528,6 @@ MSG_error_t MSG_comm_wait(msg_comm_t comm, double timeout) } CATCH(e) { switch (e.category) { - case host_error: - comm->status = MSG_HOST_FAILURE; - break; case network_error: comm->status = MSG_TRANSFER_FAILURE; break; @@ -713,12 +583,6 @@ int MSG_comm_waitany(xbt_dynar_t comms) } CATCH(e) { switch (e.category) { - - case host_error: - finished_index = e.value; - status = MSG_HOST_FAILURE; - break; - case network_error: finished_index = e.value; status = MSG_TRANSFER_FAILURE;