p_simdata = SIMIX_process_self_get_data(self);
simdata->isused=1;
simdata->compute =
- simcall_host_execute(task->name, p_simdata->m_host->simdata->smx_host,
+ simcall_host_execute(task->name, p_simdata->m_host->smx_host,
simdata->computation_amount,
simdata->priority);
#ifdef HAVE_TRACING
simdata->comm_amount = communication_amount;
for (i = 0; i < host_nb; i++)
- simdata->host_list[i] = host_list[i]->simdata->smx_host;
+ simdata->host_list[i] = host_list[i]->smx_host;
return task;
}
}
/** \ingroup msg_task_usage
- * \brief Receives a task from a mailbox from a specific host.
+ * \brief Deprecated function that used to receive a task from a mailbox from a specific host.
*
- * This is a blocking function, the execution flow will be blocked
- * until the task is received. See #MSG_task_irecv
- * for receiving tasks asynchronously.
+ * Sorry, this function is not supported anymore. That wouldn't be
+ * impossible to reimplement it, but we are lacking the time to do so ourselves.
+ * If you need this functionality, you can either:
+ *
+ * - implement the buffering mechanism on the user-level by queuing all messages
+ * received in the mailbox that do not match your expectation
+ * - change your application logic to leverage the mailboxes features. For example,
+ * if you have A receiving messages from B and C, you could have A waiting on
+ * mailbox "A" most of the time, but on "A#B" when it's waiting for specific
+ * messages from B and "A#C" when waiting for messages from C. You could even get A
+ * sometime waiting on all these mailboxes using @ref MSG_comm_waitany. You can find
+ * an example of use of this function in the @ref MSG_examples section.
+ * - Provide a proper patch to implement this functionality back in MSG. That wouldn't be
+ * very difficult actually. Check the function @ref MSG_mailbox_get_task_ext. During its call to
+ * simcall_comm_recv(), the 5th argument, match_fun, is NULL. Create a function that filters
+ * messages according to the host (that you will pass as sixth argument to simcall_comm_recv()
+ * and that your filtering function will receive as first parameter, and then, the filter could
+ * simply compare the host names, for example. After sufficient testing, provide an example that
+ * we could add to the distribution, and your first contribution to SimGrid is ready. Thanks in advance.
*
* \param task a memory location for storing a #m_task_t.
* \param alias name of the mailbox to receive the task from
*
* \param task a #m_task_t to send on another location.
* \param alias name of the mailbox to sent the task to
- * \param match_fun boolean function taking the match_data provided by sender (here), and the one of the receiver (if any) and returning whether they match
+ * \param match_fun boolean function which parameters are:
+ * - match_data_provided_here
+ * - match_data_provided_by_other_side_if_any
+ * - the_smx_action_describing_the_other_side
* \param match_data user provided data passed to match_fun
* \return the msg_comm_t communication created
*/
XBT_INLINE msg_comm_t MSG_task_isend_with_matching(m_task_t task, const char *alias,
- int (*match_fun)(void*,void*),
+ int (*match_fun)(void*,void*, smx_action_t),
void *match_data)
{
simdata_task_t t_simdata = NULL;