X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/b3d9680ac65d8bdd8e267aed69fc32a5abab12d7..7b7db8a4db1107ce77e923847ad4e33e02e4e27e:/src/msg/msg_mailbox.c diff --git a/src/msg/msg_mailbox.c b/src/msg/msg_mailbox.c index 9b5cec87ea..ab3e89f70a 100644 --- a/src/msg/msg_mailbox.c +++ b/src/msg/msg_mailbox.c @@ -1,3 +1,11 @@ +/* Mailboxes in MSG */ + +/* Copyright (c) 2008, 2009, 2010. The SimGrid Team. + * All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + #include "mailbox.h" #include "msg/private.h" @@ -111,9 +119,20 @@ 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; smx_comm_t comm; +#ifdef HAVE_TRACING + double start_time = 0; +#endif + /* We no longer support getting a task from a specific host */ + if (host) THROW_UNIMPLEMENTED; + CHECK_HOST(); +#ifdef HAVE_TRACING + TRACE_msg_task_get_start (); + start_time = MSG_get_clock(); +#endif 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 +142,12 @@ 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 longer 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, task, NULL, &comm); + //INFO2("Got task %s from %s",(*task)->name,mailbox->alias); (*task)->simdata->refcount--; } CATCH(e){ @@ -144,14 +159,21 @@ 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_TIMEOUT_FAILURE; + ret = MSG_TIMEOUT; break; default: - xbt_die("Unhandled SIMIX network exception"); + xbt_die(bprintf("Unhandled SIMIX network exception: %s",e.msg)); } xbt_ex_free(e); } - + + if (ret != MSG_HOST_FAILURE && + ret != MSG_TRANSFER_FAILURE && + ret != MSG_TIMEOUT){ +#ifdef HAVE_TRACING + TRACE_msg_task_get_end (start_time, *task); +#endif + } MSG_RETURN(ret); } @@ -163,9 +185,16 @@ MSG_mailbox_put_with_timeout(msg_mailbox_t mailbox, m_task_t task, MSG_error_t ret = MSG_OK; simdata_task_t t_simdata = NULL; m_process_t process = MSG_process_self(); - +#ifdef HAVE_TRACING + int call_end = 0; +#endif CHECK_HOST(); +#ifdef HAVE_TRACING + call_end = TRACE_msg_task_put_start (task); //must be after CHECK_HOST() +#endif + + /* Prepare the task to send */ t_simdata = task->simdata; t_simdata->sender = process; @@ -186,7 +215,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, &task, sizeof(void*), &t_simdata->comm, task); + timeout, task, sizeof(void*), &t_simdata->comm, task); } CATCH(e){ @@ -198,10 +227,10 @@ MSG_mailbox_put_with_timeout(msg_mailbox_t mailbox, m_task_t task, ret = MSG_TRANSFER_FAILURE; break; case timeout_error: - ret = MSG_TIMEOUT_FAILURE; + ret = MSG_TIMEOUT; break; default: - xbt_die("Unhandled SIMIX network exception"); + xbt_die(bprintf("Unhandled SIMIX network exception: %s",e.msg)); } xbt_ex_free(e); @@ -210,6 +239,8 @@ MSG_mailbox_put_with_timeout(msg_mailbox_t mailbox, m_task_t task, } process->simdata->waiting_task = NULL; - +#ifdef HAVE_TRACING + if (call_end) TRACE_msg_task_put_end (); +#endif MSG_RETURN(ret); }