X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/96700e4ab10ad214352f8c9746033af9b20b2905..df12bbc75c274351f3b3a628740e0b3270f08e18:/src/msg/msg_gos.c diff --git a/src/msg/msg_gos.c b/src/msg/msg_gos.c index 4c49b237a4..c84dca9645 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,194 +23,96 @@ 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; + return MSG_parallel_task_execute(task); +} - xbt_assert(simdata->host_nb == 0, - "This is a parallel task. Go to hell."); +/** \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 = 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; + 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); -#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 { - simdata->isused=0; + 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); - 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); + simcall_set_category(simdata->compute, task->category); #endif - MSG_RETURN(MSG_TASK_CANCELED); - } -} + p_simdata->waiting_action = simdata->compute; + comp_state = simcall_host_execution_wait(simdata->compute); -/** \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; - 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; + p_simdata->waiting_action = NULL; - for (i = 0; i < host_nb; i++) - simdata->host_list[i] = host_list[i]->smx_host; - - return task; -} + simdata->isused=0; -/** \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); + XBT_DEBUG("Execution task '%s' finished in state %d", + task->name, (int)comp_state); } + CATCH(e) { + switch (e.category) { + case cancel_error: + status = 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(status); } @@ -223,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 @@ -277,7 +173,7 @@ MSG_error_t MSG_process_sleep(double nb_sec) * * \param task a memory location for storing a #m_task_t. * \param alias name of the mailbox to receive the task from - * \param host a #m_host_t host from where the task was sent + * \param host a #msg_host_t host from where the task was sent * * \return Returns * #MSG_OK if the task was successfully received, @@ -285,7 +181,7 @@ MSG_error_t MSG_process_sleep(double nb_sec) */ MSG_error_t MSG_task_receive_from_host(m_task_t * task, const char *alias, - m_host_t host) + msg_host_t host) { return MSG_task_receive_ext(task, alias, -1, host); } @@ -343,7 +239,7 @@ MSG_task_receive_with_timeout(m_task_t * task, const char *alias, * \param task a memory location for storing a #m_task_t. * \param alias name of the mailbox to receive the task from * \param timeout is the maximum wait time for completion (provide -1 for no timeout) - * \param host a #m_host_t host from where the task was sent + * \param host a #msg_host_t host from where the task was sent * * \return Returns * #MSG_OK if the task was successfully received, @@ -351,7 +247,7 @@ MSG_task_receive_with_timeout(m_task_t * task, const char *alias, */ MSG_error_t MSG_task_receive_ext(m_task_t * task, const char *alias, double timeout, - m_host_t host) + msg_host_t host) { XBT_DEBUG ("MSG_task_receive_ext: Trying to receive a message on mailbox '%s'", @@ -395,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 */ @@ -445,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 */ @@ -523,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; @@ -574,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; @@ -625,7 +509,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) @@ -643,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; @@ -701,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; @@ -865,7 +741,7 @@ int MSG_task_listen(const char *alias) * given mailbox, 0 if there is no pending communication actions. * */ -int MSG_task_listen_from_host(const char *alias, m_host_t host) +int MSG_task_listen_from_host(const char *alias, msg_host_t host) { return MSG_mailbox_get_count_host_waiting_tasks(MSG_mailbox_get_by_alias @@ -973,7 +849,7 @@ MSG_error_t MSG_get_errno(void) * #MSG_TRANSFER_FAILURE if the transfer could not be properly done * (network failure, dest failure) or #MSG_OK if it succeeded. */ -MSG_error_t MSG_task_put(m_task_t task, m_host_t dest, m_channel_t channel) +MSG_error_t MSG_task_put(m_task_t task, msg_host_t dest, m_channel_t channel) { XBT_WARN("DEPRECATED! Now use MSG_task_send"); return MSG_task_put_with_timeout(task, dest, channel, -1.0); @@ -986,7 +862,7 @@ MSG_error_t MSG_task_put(m_task_t task, m_host_t dest, m_channel_t channel) * \sa MSG_task_put */ MSG_error_t -MSG_task_put_bounded(m_task_t task, m_host_t dest, m_channel_t channel, +MSG_task_put_bounded(m_task_t task, msg_host_t dest, m_channel_t channel, double maxrate) { XBT_WARN("DEPRECATED! Now use MSG_task_send_bounded"); @@ -1025,7 +901,7 @@ this function was called was shut down, (network failure, dest failure, timeout...) or #MSG_OK if the communication succeeded. */ MSG_error_t -MSG_task_put_with_timeout(m_task_t task, m_host_t dest, +MSG_task_put_with_timeout(m_task_t task, msg_host_t dest, m_channel_t channel, double timeout) { XBT_WARN("DEPRECATED! Now use MSG_task_send_with_timeout"); @@ -1033,7 +909,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); @@ -1100,7 +976,7 @@ int MSG_task_Iprobe(m_channel_t channel) * \return the number of tasks waiting to be received on \a channel and sent by \a host. */ -int MSG_task_probe_from_host(int channel, m_host_t host) +int MSG_task_probe_from_host(int channel, msg_host_t host) { XBT_WARN("DEPRECATED! Now use MSG_task_listen_from_host"); xbt_assert((channel >= 0) @@ -1129,7 +1005,7 @@ int MSG_task_probe_from_host(int channel, m_host_t host) * \return a #MSG_error_t indicating whether the operation was successful (#MSG_OK), or why it failed otherwise. */ MSG_error_t -MSG_task_get_from_host(m_task_t * task, m_channel_t channel, m_host_t host) +MSG_task_get_from_host(m_task_t * task, m_channel_t channel, msg_host_t host) { XBT_WARN("DEPRECATED! Now use MSG_task_receive_from_host"); return MSG_task_get_ext(task, channel, -1, host); @@ -1181,7 +1057,7 @@ MSG_task_get_with_timeout(m_task_t * task, m_channel_t channel, MSG_error_t MSG_task_get_ext(m_task_t * task, m_channel_t channel, double timeout, - m_host_t host) + msg_host_t host) { XBT_WARN("DEPRECATED! Now use MSG_task_receive_ext"); xbt_assert((channel >= 0)