h->simdata->host, t_simdata->message_size);
surf_workstation_resource->common_public->action_set_data(t_simdata->comm,t);
+ if(MSG_process_isSuspended(t_simdata->sender))
+ MSG_process_resume(t_simdata->sender);
+
do {
__MSG_task_wait_event(process, t);
state=surf_workstation_resource->common_public->action_get_state(t_simdata->comm);
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.
task_simdata = task->simdata;
task_simdata->sender = process;
-
+ xbt_assert0(task_simdata->using==1,"Gargl!");
+ task_simdata->comm = NULL;
local_host = ((simdata_process_t) process->simdata)->host;
remote_host = dest;
else {
process->simdata->put_host = dest;
process->simdata->put_channel = channel;
- MSG_process_suspend(process);
+ while(!(task_simdata->comm))
+ MSG_process_suspend(process);
process->simdata->put_host = NULL;
process->simdata->put_channel = -1;
}