X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/88f37b6fb2e255b82a42d81005ecb4d40a96fc82..268c232e62981d322f66e2d3f75455c9fe56aa65:/src/msg/msg_mailbox.c diff --git a/src/msg/msg_mailbox.c b/src/msg/msg_mailbox.c index 22c8fb4ad7..3454104229 100644 --- a/src/msg/msg_mailbox.c +++ b/src/msg/msg_mailbox.c @@ -42,7 +42,7 @@ void MSG_mailbox_free(void *mailbox) { msg_mailbox_t _mailbox = (msg_mailbox_t) mailbox; - if (NULL != (_mailbox->hostname)) + if (_mailbox->hostname) free(_mailbox->hostname); xbt_fifo_free(_mailbox->tasks); @@ -51,11 +51,6 @@ void MSG_mailbox_free(void *mailbox) free(_mailbox); } -void MSG_mailbox_put(msg_mailbox_t mailbox, m_task_t task) -{ - xbt_fifo_push(mailbox->tasks, task); -} - smx_cond_t MSG_mailbox_get_cond(msg_mailbox_t mailbox) { return mailbox->cond; @@ -80,7 +75,7 @@ m_task_t MSG_mailbox_get_head(msg_mailbox_t mailbox) { xbt_fifo_item_t item; - if (NULL == (item = xbt_fifo_get_first_item(mailbox->tasks))) + if (!(item = xbt_fifo_get_first_item(mailbox->tasks))) return NULL; return (m_task_t) xbt_fifo_get_item_content(item); @@ -171,7 +166,7 @@ MSG_mailbox_get_task_ext(msg_mailbox_t mailbox, m_task_t * task, m_host_t h = NULL; simdata_task_t t_simdata = NULL; simdata_host_t h_simdata = NULL; - int first_time = 1; + double start_time = SIMIX_get_clock(); smx_cond_t cond = NULL; //conditional wait if the task isn't on the channel yet @@ -190,6 +185,13 @@ MSG_mailbox_get_task_ext(msg_mailbox_t mailbox, m_task_t * task, 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)) { @@ -199,52 +201,46 @@ MSG_mailbox_get_task_ext(msg_mailbox_t mailbox, m_task_t * task, break; } else { /* get the first task of the host */ - if (NULL != (t = MSG_mailbox_get_first_host_task(mailbox, host))) + if ((t = MSG_mailbox_get_first_host_task(mailbox, host))) break; } } - if (timeout > 0) { - if (!first_time) { - SIMIX_mutex_unlock(h->simdata->mutex); - /* set the simix condition of the mailbox to NULL */ - MSG_mailbox_set_cond(mailbox, NULL); - SIMIX_cond_destroy(cond); - MSG_RETURN(MSG_TRANSFER_FAILURE); - } + 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); } - xbt_assert1(!MSG_mailbox_get_cond(mailbox), - "A process is already blocked on the channel %s", - MSG_mailbox_get_alias(mailbox)); - - cond = SIMIX_cond_init(); - - /* set the condition of the mailbox */ - MSG_mailbox_set_cond(mailbox, cond); + if(!cond) { + cond = SIMIX_cond_init(); + MSG_mailbox_set_cond(mailbox, cond); + } if (timeout > 0) - SIMIX_cond_wait_timeout(cond, h->simdata->mutex, timeout); + 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) + 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); - - 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); - MSG_mailbox_set_cond(mailbox, NULL); + SIMIX_cond_destroy(cond); } + SIMIX_mutex_unlock(h->simdata->mutex); + t_simdata = t->simdata; t_simdata->receiver = process; *task = t; @@ -292,17 +288,17 @@ MSG_mailbox_get_task_ext(msg_mailbox_t mailbox, m_task_t * task, if (SIMIX_action_get_state(t_simdata->comm) == SURF_ACTION_DONE) { SIMIX_action_destroy(t_simdata->comm); t_simdata->comm = NULL; - t_simdata->using--; + t_simdata->refcount --; MSG_RETURN(MSG_OK); } else if (SIMIX_host_get_state(h_simdata->smx_host) == 0) { SIMIX_action_destroy(t_simdata->comm); t_simdata->comm = NULL; - t_simdata->using--; + t_simdata->refcount --; MSG_RETURN(MSG_HOST_FAILURE); } else { SIMIX_action_destroy(t_simdata->comm); t_simdata->comm = NULL; - t_simdata->using--; + t_simdata->refcount --; MSG_RETURN(MSG_TRANSFER_FAILURE); } } @@ -324,20 +320,21 @@ MSG_mailbox_put_with_timeout(msg_mailbox_t mailbox, m_task_t task, task_simdata->sender = process; task_simdata->source = MSG_process_get_host(process); - xbt_assert0(task_simdata->using == 1, + xbt_assert0(task_simdata->refcount == 1, "This task is still being used somewhere else. You cannot send it now. Go fix your code!"); task_simdata->comm = NULL; - task_simdata->using++; + task_simdata->refcount ++; local_host = ((simdata_process_t) process->simdata)->m_host; + msg_global->sent_msg++; /* get the host name containing the mailbox */ hostname = MSG_mailbox_get_hostname(mailbox); remote_host = MSG_get_host_by_name(hostname); - if (NULL == remote_host) + if (!remote_host) THROW1(not_found_error, 0, "Host %s not fount", hostname); @@ -349,15 +346,13 @@ MSG_mailbox_put_with_timeout(msg_mailbox_t mailbox, m_task_t task, SIMIX_mutex_lock(remote_host->simdata->mutex); /* put the task in the mailbox */ - MSG_mailbox_put(mailbox, task); + xbt_fifo_push(mailbox->tasks, task); - if (NULL != (cond = MSG_mailbox_get_cond(mailbox))) { + if ((cond = MSG_mailbox_get_cond(mailbox))) { DEBUG0("Somebody is listening. Let's wake him up!"); SIMIX_cond_signal(cond); } - - SIMIX_mutex_unlock(remote_host->simdata->mutex); SIMIX_mutex_lock(task->simdata->mutex); @@ -427,7 +422,6 @@ MSG_mailbox_put_with_timeout(msg_mailbox_t mailbox, m_task_t task, 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->smx_host) == 0) {