+/* Internal function used to factorize code between
+ * MSG_task_isend_with_matching() and MSG_task_dsend().
+ */
+static XBT_INLINE
+msg_comm_t MSG_task_isend_internal(msg_task_t task, const char *alias,
+ int (*match_fun)(void*,void*, smx_synchro_t),
+ void *match_data, void_f_pvoid_t cleanup,
+ int detached)
+{
+ simdata_task_t t_simdata = NULL;
+ msg_process_t process = MSG_process_self();
+ msg_mailbox_t mailbox = MSG_mailbox_get_by_alias(alias);
+ int call_end = TRACE_msg_task_put_start(task);
+
+ /* Prepare the task to send */
+ t_simdata = task->simdata;
+ t_simdata->sender = process;
+ t_simdata->source = ((simdata_process_t) SIMIX_process_self_get_data(process))->m_host;
+
+ if (t_simdata->isused != 0) {
+ if (msg_global->debug_multiple_use){
+ XBT_ERROR("This task is already used in there:");
+ xbt_backtrace_display(t_simdata->isused);
+ XBT_ERROR("And you try to reuse it from here:");
+ xbt_backtrace_display_current();
+ } else {
+ xbt_assert(t_simdata->isused == 0,
+ "This task is still being used somewhere else. You cannot send it now. Go fix your code! (use --cfg=msg/debug_multiple_use:on to get the backtrace of the other process)");
+ }
+ }
+
+ if (msg_global->debug_multiple_use)
+ MSG_BT(t_simdata->isused, "Using Backtrace");
+ else
+ t_simdata->isused = (void*)1;
+ t_simdata->comm = NULL;
+ msg_global->sent_msg++;
+
+ /* Send it by calling SIMIX network layer */
+ smx_synchro_t act = simcall_comm_isend(SIMIX_process_self(), mailbox, t_simdata->bytes_amount,
+ t_simdata->rate, task, sizeof(void *),
+ match_fun, cleanup, NULL, match_data,detached);
+ t_simdata->comm = act; /* FIXME: is the field t_simdata->comm still useful? */
+
+ msg_comm_t comm;
+ if (detached) {
+ comm = NULL;
+ } else {
+ comm = xbt_new0(s_msg_comm_t, 1);
+ comm->task_sent = task;
+ comm->task_received = NULL;
+ comm->status = MSG_OK;
+ comm->s_comm = act;
+ }
+
+ if (TRACE_is_enabled())
+ simcall_set_category(act, task->category);
+ if (call_end)
+ TRACE_msg_task_put_end();
+
+ return comm;
+}
+
+