- 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;
-
- SIMIX_mutex_lock(h->simdata->mutex);
-
- if (MSG_mailbox_get_cond(mailbox)) {
- CRITICAL1("A process is already blocked on the channel %s",
- MSG_mailbox_get_alias(mailbox));
- SIMIX_cond_display_info(MSG_mailbox_get_cond(mailbox));
- xbt_die("Go fix your code!");
- }
-
- while (1) {
- /* if the mailbox is empty (has no task */
- if (!MSG_mailbox_is_empty(mailbox)) {
- if (!host) {
- /* pop the head of the mailbox */
- t = MSG_mailbox_pop_head(mailbox);
- break;
- } else {
- /* get the first task of the host */
- if ((t = MSG_mailbox_get_first_host_task(mailbox, host)))
- break;
- }
- }
-
- if ((timeout > 0) && (SIMIX_get_clock()-start_time>=timeout)) {
- SIMIX_mutex_unlock(h->simdata->mutex);
- MSG_mailbox_set_cond(mailbox, NULL);
- SIMIX_cond_destroy(cond);
- MSG_RETURN(MSG_TRANSFER_FAILURE);
- }
-
- if(!cond) {
- cond = SIMIX_cond_init();
- MSG_mailbox_set_cond(mailbox, cond);
- }
-
- if (timeout > 0)
- SIMIX_cond_wait_timeout(cond, h->simdata->mutex, timeout-start_time);
- else
- SIMIX_cond_wait(MSG_mailbox_get_cond(mailbox), h->simdata->mutex);
-
- if (SIMIX_host_get_state(h_simdata->smx_host) == 0) {
- SIMIX_mutex_unlock(h->simdata->mutex);
- MSG_mailbox_set_cond(mailbox, NULL);
- SIMIX_cond_destroy(cond);
- MSG_RETURN(MSG_HOST_FAILURE);
- }
- }
-
-
- DEBUG1("OK, got a task (%s)", t->name);
- /* clean conditional */
- if (cond) {
- MSG_mailbox_set_cond(mailbox, NULL);
- SIMIX_cond_destroy(cond);
+ XBT_WARN
+ ("Asked to write the received task in a non empty struct -- proceeding.");
+
+ /* Try to receive it by calling SIMIX network layer */
+ TRY {
+ simcall_comm_recv(MSG_process_self(), mailbox, task, NULL, NULL, NULL, NULL, timeout, rate);
+ XBT_DEBUG("Got task %s from %p",(*task)->name,mailbox);
+ if (msg_global->debug_multiple_use && (*task)->simdata->isused!=0)
+ xbt_ex_free(*(xbt_ex_t*)(*task)->simdata->isused);
+ (*task)->simdata->isused = 0;