A
lgorithmique
N
umérique
D
istribuée
Public GIT Repository
projects
/
simgrid.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
| inline |
side by side
Add the latency factor for the standard model as well as for the new LegrandVelho...
[simgrid.git]
/
src
/
msg
/
msg_mailbox.c
diff --git
a/src/msg/msg_mailbox.c
b/src/msg/msg_mailbox.c
index
2dddabf
..
53e1bbf
100644
(file)
--- 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);
@@
-80,7
+80,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
+171,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
+190,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,55
+206,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);
}
- 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!");
+ if(!cond) {
+ cond = SIMIX_cond_init();
+ MSG_mailbox_set_cond(mailbox, cond);
}
- cond = SIMIX_cond_init();
-
- /* set the condition of the mailbox */
- 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;
@@
-295,17
+293,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);
}
}
@@
-327,12
+325,12
@@
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;
/* get the host name containing the mailbox */
@@
-340,7
+338,7
@@
MSG_mailbox_put_with_timeout(msg_mailbox_t mailbox, m_task_t task,
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);
@@
-354,13
+352,11
@@
MSG_mailbox_put_with_timeout(msg_mailbox_t mailbox, m_task_t task,
/* put the task in the mailbox */
MSG_mailbox_put(mailbox, 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);
@@
-430,7
+426,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) {