/* Transfer */
t_simdata->using++;
+ while(MSG_process_is_suspended(t_simdata->sender)) {
+ DEBUG1("Oooups, the sender (%s) has been suspended in the meantime. Let's wait for him",
+ t_simdata->sender->name);
+ m_task_t task_to_wait_for = t_simdata->sender->simdata->waiting_task;
+ if(__MSG_process_isBlocked(t_simdata->sender)) {
+ DEBUG0("He's blocked. Let's wait for him to go in the suspended state");
+ __MSG_process_unblock(t_simdata->sender);
+ task_to_wait_for->simdata->using++;
+ __MSG_task_wait_event(process, task_to_wait_for);
+ MSG_task_destroy(task_to_wait_for);
+ } else {
+ DEBUG0("He's suspended. Let's wait for him to go in the resumed state");
+ task_to_wait_for->simdata->using++;
+ __MSG_task_wait_event(process, task_to_wait_for);
+ MSG_task_destroy(task_to_wait_for);
+ DEBUG0("He's resumed. He should block again. So let's free him.");
+ __MSG_process_unblock(t_simdata->sender);
+ break;
+ }
+ }
DEBUG0("Calling SURF for communication creation");
t_simdata->comm = surf_workstation_resource->extension_public->
communicate(MSG_process_get_host(t_simdata->sender)->simdata->host,
surf_workstation_resource->common_public->action_set_data(t_simdata->comm,t);
- if(__MSG_process_isBlocked(t_simdata->sender))
+ if(__MSG_process_isBlocked(t_simdata->sender)) {
+ DEBUG1("Unblocking %s",t_simdata->sender->name);
__MSG_process_unblock(t_simdata->sender);
+ }
PAJE_PROCESS_PUSH_STATE(process,"C");
/** \ingroup msg_gos_functions
* \brief Wait for at most \a max_duration second for a task reception
on \a channel. *\a PID is updated with the PID of the first process
- that triggered this event is any.
+ that triggered this event if any.
*
* It takes three parameters:
* \param channel the channel on which the agent should be
e_surf_action_state_t state = SURF_ACTION_NOT_IN_THE_SYSTEM;
simdata_task_t simdata = task->simdata;
+ XBT_IN4("(%p(%s) %p(%s))",process,process->name,task,task->name);
simdata->using++;
do {
__MSG_task_wait_event(process, task);
if(surf_workstation_resource->common_public->action_free(simdata->compute))
simdata->compute = NULL;
simdata->computation_amount = 0.0;
+ XBT_OUT;
MSG_RETURN(MSG_OK);
} else if(surf_workstation_resource->extension_public->
get_state(MSG_process_get_host(process)->simdata->host)
== SURF_CPU_OFF) {
if(surf_workstation_resource->common_public->action_free(simdata->compute))
simdata->compute = NULL;
+ XBT_OUT;
MSG_RETURN(MSG_HOST_FAILURE);
} else {
if(surf_workstation_resource->common_public->action_free(simdata->compute))
simdata->compute = NULL;
+ XBT_OUT;
MSG_RETURN(MSG_TASK_CANCELLED);
}
}
* \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 \a host_nb m_host_t.
- * \param computation_amount an array of \a host_nb
+ * \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 \a host_nb* \a host_nb doubles.
+ * \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.
}
/** \ingroup msg_gos_functions
- * \brief Return the number of MSG tasks currently running on a
+ * \brief Return the number of MSG tasks currently running on
* the host of the current running process.
*/
static int MSG_get_msgload(void)
/** \ingroup msg_gos_functions
*
- * \brief Return the the last value returned by a MSG function (except
+ * \brief Return the last value returned by a MSG function (except
* MSG_get_errno...).
*/
MSG_error_t MSG_get_errno(void)