X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/ec6ad1cda462aea8684decc3672c753715c1bf70..6fd74f90dda33660f18bc32b278060c48d93c585:/src/msg/msg_mailbox.c diff --git a/src/msg/msg_mailbox.c b/src/msg/msg_mailbox.c index 01644225f1..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" @@ -110,9 +118,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; - size_t buff_size = 0; 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), @@ -123,16 +142,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,20 +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_TRANSFER_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); } - *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--; - + 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); } @@ -168,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; @@ -183,7 +207,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 +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, NULL, 0, &t_simdata->comm, task); + timeout, task, sizeof(void*), &t_simdata->comm, task); } CATCH(e){ @@ -203,22 +227,20 @@ 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; + break; default: - xbt_die("Unhandled SIMIX network exception"); + xbt_die(bprintf("Unhandled SIMIX network exception: %s",e.msg)); } 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--; - +#ifdef HAVE_TRACING + if (call_end) TRACE_msg_task_put_end (); +#endif MSG_RETURN(ret); }