X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/ec6ad1cda462aea8684decc3672c753715c1bf70..2cba8fd12799e5332f13621f2e4e96c4752fa35b:/src/msg/msg_mailbox.c diff --git a/src/msg/msg_mailbox.c b/src/msg/msg_mailbox.c index 01644225f1..c897b6a621 100644 --- a/src/msg/msg_mailbox.c +++ b/src/msg/msg_mailbox.c @@ -110,10 +110,15 @@ MSG_mailbox_get_task_ext(msg_mailbox_t mailbox, m_task_t *task, m_host_t host, { xbt_ex_t e; MSG_error_t ret = MSG_OK; - size_t buff_size = 0; smx_comm_t comm; + + /* We no longer support getting a task from a specific host */ + if (host) THROW_UNIMPLEMENTED; + CHECK_HOST(); + memset(&comm,0,sizeof(comm)); + /* Kept for compatibility with older implementation */ xbt_assert1(!MSG_mailbox_get_cond(mailbox), "A process is already blocked on this channel %s", @@ -123,16 +128,13 @@ MSG_mailbox_get_task_ext(msg_mailbox_t mailbox, m_task_t *task, m_host_t host, xbt_assert0(task, "Null pointer for the task storage"); if (*task) - CRITICAL0 - ("MSG_task_get() was asked to write in a non empty task struct."); - - /* We no loger support getting a task from a specific host */ - if(host) - THROW_UNIMPLEMENTED; + CRITICAL0("MSG_task_get() was asked to write in a non empty task struct."); /* Try to receive it by calling SIMIX network layer */ TRY{ - SIMIX_network_recv(mailbox->rdv, timeout, NULL, &buff_size, &comm); + SIMIX_network_recv(mailbox->rdv, timeout, task, NULL, &comm); + //INFO2("Got task %s from %s",(*task)->name,mailbox->alias); + (*task)->simdata->refcount--; } CATCH(e){ switch(e.category){ @@ -143,19 +145,13 @@ MSG_mailbox_get_task_ext(msg_mailbox_t mailbox, m_task_t *task, m_host_t host, ret = MSG_TRANSFER_FAILURE; break; case timeout_error: - ret = MSG_TRANSFER_FAILURE; + ret = MSG_TIMEOUT_FAILURE; break; default: xbt_die("Unhandled SIMIX network exception"); } xbt_ex_free(e); } - - *task = SIMIX_communication_get_data(comm); - - /* If the sender didn't decremented the refcount so far then do it */ - if (*task && (*task)->simdata->refcount > 1) - (*task)->simdata->refcount--; MSG_RETURN(ret); } @@ -183,7 +179,7 @@ MSG_mailbox_put_with_timeout(msg_mailbox_t mailbox, m_task_t task, msg_global->sent_msg++; process->simdata->waiting_task = task; - + /* Try to send it by calling SIMIX network layer */ TRY{ /* Kept for semantical compatibility with older implementation */ @@ -191,7 +187,7 @@ MSG_mailbox_put_with_timeout(msg_mailbox_t mailbox, m_task_t task, SIMIX_cond_signal(mailbox->cond); SIMIX_network_send(mailbox->rdv, t_simdata->message_size, t_simdata->rate, - timeout, NULL, 0, &t_simdata->comm, task); + timeout, task, sizeof(void*), &t_simdata->comm, task); } CATCH(e){ @@ -203,22 +199,18 @@ MSG_mailbox_put_with_timeout(msg_mailbox_t mailbox, m_task_t task, ret = MSG_TRANSFER_FAILURE; break; case timeout_error: - ret = MSG_TRANSFER_FAILURE; - break; + ret = MSG_TIMEOUT_FAILURE; + break; default: xbt_die("Unhandled SIMIX network exception"); } xbt_ex_free(e); - /* If the receiver end didn't decremented the refcount so far then do it */ - if (t_simdata->refcount > 1) - t_simdata->refcount--; + + /* Decrement the refcount only on failure */ + t_simdata->refcount--; } process->simdata->waiting_task = NULL; - - /* If the receiver end didn't decremented the refcount so far then do it */ - if (t_simdata->refcount > 1) - t_simdata->refcount--; - + MSG_RETURN(ret); }