- xbt_assert1((channel>=0) && (channel < msg_global->max_channel),"Invalid channel %d",channel);
- /* Sanity check */
- xbt_assert0(task,"Null pointer for the task\n");
-
- if (*task)
- CRITICAL0("MSG_task_get() was asked to write in a non empty task struct.");
-
- /* Get the task */
- h = MSG_host_self();
- h_simdata = h->simdata;
-
- DEBUG2("Waiting for a task on channel %d (%s)", channel,h->name);
-
- SIMIX_mutex_lock(h->simdata->mutex);
- while (1) {
- if(xbt_fifo_size(h_simdata->mbox[channel])>0) {
- if(!host) {
- t = xbt_fifo_shift(h_simdata->mbox[channel]);
- break;
- } else {
- xbt_fifo_foreach(h->simdata->mbox[channel],item,t,m_task_t) {
- if(t->simdata->source==host) break;
- }
- if(item) {
- xbt_fifo_remove_item(h->simdata->mbox[channel],item);
- break;
- }
- }
- }
-
- if(max_duration>0) {
- if(!first_time) {
- SIMIX_mutex_unlock(h->simdata->mutex);
- h_simdata->sleeping[channel] = NULL;
- SIMIX_cond_destroy(cond);
- MSG_RETURN(MSG_TRANSFER_FAILURE);
- }
- }
- xbt_assert1(!(h_simdata->sleeping[channel]),"A process is already blocked on channel %d", channel);
-
- cond = SIMIX_cond_init();
- h_simdata->sleeping[channel] = cond;
- if (max_duration > 0) {
- SIMIX_cond_wait_timeout(cond, h->simdata->mutex, max_duration);
- }
- else SIMIX_cond_wait(h_simdata->sleeping[channel],h->simdata->mutex);
-
- if(SIMIX_host_get_state(h_simdata->host)==0)
- MSG_RETURN(MSG_HOST_FAILURE);
-
- first_time = 0;
- }
- SIMIX_mutex_unlock(h->simdata->mutex);
-
- DEBUG1("OK, got a task (%s)", t->name);
- /* clean conditional */
- if (cond) {
- SIMIX_cond_destroy(cond);
- h_simdata->sleeping[channel] = NULL;
- }
-
- t_simdata = t->simdata;
- t_simdata->receiver = process;
- *task=t;
-
- SIMIX_mutex_lock(t_simdata->mutex);
-
- /* Transfer */
- t_simdata->using++;
- /* create SIMIX action to the communication */
- t_simdata->comm = SIMIX_action_communicate(t_simdata->sender->simdata->host->simdata->host,
- process->simdata->host->simdata->host,t->name, t_simdata->message_size,
- t_simdata->rate);
- /* if the process is suspend, create the action but stop its execution, it will be restart when the sender process resume */
- if (MSG_process_is_suspended(t_simdata->sender)) {
- DEBUG1("Process sender (%s) suspended", t_simdata->sender->name);
- SIMIX_action_set_priority(t_simdata->comm,0);
- }
- process->simdata->waiting_task = t;
- SIMIX_register_action_to_condition(t_simdata->comm, t_simdata->cond);
- SIMIX_register_condition_to_action(t_simdata->comm, t_simdata->cond);
- SIMIX_cond_wait(t_simdata->cond,t_simdata->mutex);
- process->simdata->waiting_task = NULL;
-
- /* the task has already finished and the pointer must be null*/
- if (t->simdata->sender) {
- t->simdata->sender->simdata->waiting_task = NULL;
- /* action ended, set comm and compute = NULL, the actions is already destroyed in the main function */
- //t->simdata->comm = NULL;
- //t->simdata->compute = NULL;
- }
- /* for this process, don't need to change in get function*/
- t->simdata->receiver = NULL;
- SIMIX_mutex_unlock(t_simdata->mutex);
-
-
- if(SIMIX_action_get_state(t_simdata->comm) == SURF_ACTION_DONE) {
- //t_simdata->comm = NULL;
- SIMIX_action_destroy(t_simdata->comm);
- t_simdata->comm = NULL;
+
+ simdata = task->simdata;
+ p_simdata = SIMIX_process_self_get_data();
+
+ 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", p_simdata->m_host->name);
+
+ simdata->isused=1;
+
+ simdata->compute =
+ SIMIX_req_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 = SIMIX_req_host_execution_wait(simdata->compute);
+ p_simdata->waiting_action = NULL;
+
+ XBT_DEBUG("Finished waiting for execution of action %p, state = %d", simdata->compute, 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;