From 012e8850b96760b97bee7f40ce87b4093866153e Mon Sep 17 00:00:00 2001 From: mquinson Date: Fri, 31 Dec 2004 12:08:57 +0000 Subject: [PATCH] Add a function I need in GRAS git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@715 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- src/msg/gos.c | 27 +++++++++++++++++++++++++++ src/msg/task.c | 12 ++++++++++++ 2 files changed, 39 insertions(+) diff --git a/src/msg/gos.c b/src/msg/gos.c index 3e1a6e67a1..fd042a49aa 100644 --- a/src/msg/gos.c +++ b/src/msg/gos.c @@ -115,6 +115,33 @@ int MSG_task_Iprobe(m_channel_t channel) return(xbt_fifo_getFirstItem(h_simdata->mbox[channel])!=NULL); } +/** \ingroup msg_gos_functions + * \brief Test whether there is a pending communication on a channel, and who sent it. + * + * It takes one parameter. + * \param channel the channel on which the agent should be + listening. This value has to be >=0 and < than the maximal + number of channels fixed with MSG_set_channel_number(). + * \return -1 if there is no pending communication and the PID of the process who sent it otherwise + */ +int MSG_task_probe_from(m_channel_t channel) +{ + m_host_t h = NULL; + simdata_host_t h_simdata = NULL; + xbt_fifo_item_t item; + m_task_t t; + + CHECK_HOST(); + h = MSG_host_self(); + h_simdata = h->simdata; + + item = xbt_fifo_getFirstItem(((simdata_host_t)h->simdata)->mbox[channel]); + if (!item || !(t = xbt_fifo_get_item_content(item)) || (simdata_task_t)t->simdata) + return -1; + + return MSG_process_get_PID(((simdata_task_t)t->simdata)->sender); +} + /** \ingroup msg_gos_functions * \brief Put a task on a channel of an host and waits for the end of the * transmission. diff --git a/src/msg/task.c b/src/msg/task.c index 530be8bd15..af973f05ec 100644 --- a/src/msg/task.c +++ b/src/msg/task.c @@ -67,6 +67,18 @@ void *MSG_task_get_data(m_task_t task) return (task->data); } +/** \ingroup m_task_management + * \brief Return the sender of a #m_task_t. + * + * This functions returns the #m_process_t which sent this task + */ +m_process_t MSG_task_get_sender(m_task_t task) +{ + xbt_assert0(task, "Invalid parameters"); + return ((simdata_task_t) task->simdata)->sender; +} + + /** \ingroup m_task_management * \brief Destroy a #m_task_t. * -- 2.20.1