-
- if(remote_host->simdata->sleeping[channel]) {
- DEBUG0("Somebody is listening. Let's wake him up!");
- SIMIX_cond_signal(remote_host->simdata->sleeping[channel]);
- }
- SIMIX_mutex_unlock(remote_host->simdata->mutex);
-
- process->simdata->put_host = dest;
- process->simdata->put_channel = channel;
- SIMIX_mutex_lock(task->simdata->mutex);
- // DEBUG4("Task sent (%g kB) from %s to %s on channel %d, waiting...", task->simdata->message_size/1000,local_host->name, remote_host->name, channel);
-
- process->simdata->waiting_task = task;
- if (max_duration >0) {
- SIMIX_cond_wait_timeout(task->simdata->cond,task->simdata->mutex,max_duration);
- /* verify if the timeout happened and the communication didn't started yet */
- if (task->simdata->comm==NULL) {
- task->simdata->using--;
- process->simdata->waiting_task = NULL;
- xbt_fifo_remove(((simdata_host_t) remote_host->simdata)->mbox[channel],
- task);
- if (task->simdata->receiver) {
- task->simdata->receiver->simdata->waiting_task = NULL;
- }
- task->simdata->sender = NULL;
- SIMIX_mutex_unlock(task->simdata->mutex);
- MSG_RETURN(MSG_TRANSFER_FAILURE);
- }
- }
- else {
- SIMIX_cond_wait(task->simdata->cond,task->simdata->mutex);
- }
-
- DEBUG1("Action terminated %s",task->name);
- task->simdata->using--;
- process->simdata->waiting_task = NULL;
- /* the task has already finished and the pointer must be null*/
- if (task->simdata->receiver) {
- task->simdata->receiver->simdata->waiting_task = NULL;
- /* action ended, set comm and compute = NULL, the actions is already destroyed in the main function */
- // task->simdata->comm = NULL;
- //task->simdata->compute = NULL;
- }
- task->simdata->sender = NULL;
- SIMIX_mutex_unlock(task->simdata->mutex);
-
- if(SIMIX_action_get_state(task->simdata->comm) == SURF_ACTION_DONE) {
- MSG_RETURN(MSG_OK);
- } else if (SIMIX_host_get_state(local_host->simdata->host)==0) {
- MSG_RETURN(MSG_HOST_FAILURE);
- } else {
- MSG_RETURN(MSG_TRANSFER_FAILURE);