From 0e883305cea5e4b5738dd67fb1afa00ba3fc71a7 Mon Sep 17 00:00:00 2001 From: alegrand Date: Wed, 29 Jun 2005 21:54:25 +0000 Subject: [PATCH] Add a select for Martin. git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@1487 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- include/msg/msg.h | 2 ++ src/msg/gos.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/include/msg/msg.h b/include/msg/msg.h index 9a3817c5e2..8df046d7e9 100644 --- a/include/msg/msg.h +++ b/include/msg/msg.h @@ -98,6 +98,8 @@ MSG_error_t MSG_task_put_bounded(m_task_t task, MSG_error_t MSG_task_execute(m_task_t task); int MSG_task_Iprobe(m_channel_t channel); int MSG_task_probe_from(m_channel_t channel); +MSG_error_t MSG_channel_select_from(m_channel_t channel, double max_duration, + int *PID); MSG_error_t MSG_process_sleep(double nb_sec); MSG_error_t MSG_get_errno(void); diff --git a/src/msg/gos.c b/src/msg/gos.c index 0487c955de..e2382d2095 100644 --- a/src/msg/gos.c +++ b/src/msg/gos.c @@ -211,6 +211,60 @@ int MSG_task_probe_from(m_channel_t channel) return MSG_process_get_PID(t->simdata->sender); } +MSG_error_t MSG_channel_select_from(m_channel_t channel, double max_duration, + int *PID) +{ + m_host_t h = NULL; + simdata_host_t h_simdata = NULL; + xbt_fifo_item_t item; + m_task_t t; + int first_time = 1; + m_process_t process = MSG_process_self(); + + if(PID) { + *PID = -1; + } + + if(max_duration==0.0) { + return MSG_task_probe_from(channel); + } else { + CHECK_HOST(); + h = MSG_host_self(); + h_simdata = h->simdata; + + DEBUG2("Probing on channel %d (%s)", channel,h->name); + while((item = xbt_fifo_getFirstItem(h->simdata->mbox[channel]))) { + if(max_duration>0) { + if(!first_time) { + MSG_RETURN(MSG_OK); + } + } + xbt_assert2(!(h_simdata->sleeping[channel]), + "A process (%s(%d)) is already blocked on this channel", + h_simdata->sleeping[channel]->name, + h_simdata->sleeping[channel]->simdata->PID); + h_simdata->sleeping[channel] = process; /* I'm waiting. Wake me up when you're ready */ + if(max_duration>0) { + __MSG_process_block(max_duration); + } else { + __MSG_process_block(-1); + } + if(surf_workstation_resource->extension_public->get_state(h_simdata->host) + == SURF_CPU_OFF) { + MSG_RETURN(MSG_HOST_FAILURE); + } + h_simdata->sleeping[channel] = NULL; + first_time = 0; + } + if (!item || !(t = xbt_fifo_get_item_content(item))) { + MSG_RETURN(MSG_OK); + } + if(PID) { + *PID = MSG_process_get_PID(t->simdata->sender); + } + MSG_RETURN(MSG_OK); + } +} /** \ingroup msg_gos_functions * \brief Put a task on a channel of an host and waits for the end of the * transmission. -- 2.20.1