MSG_task_receive(m_task_t * task, const char *alias);
XBT_PUBLIC(msg_comm_t) MSG_task_isend(m_task_t task, const char *alias);
-XBT_PUBLIC(void) MSG_task_dsend(m_task_t task, const char *alias);
+XBT_PUBLIC(void) MSG_task_dsend(m_task_t task, const char *alias, void_f_pvoid_t cleanup);
XBT_PUBLIC(msg_comm_t) MSG_task_irecv(m_task_t * task, const char *alias);
XBT_PUBLIC(int) MSG_comm_test(msg_comm_t comm);
XBT_PUBLIC(int) MSG_comm_testany(xbt_dynar_t comms);
* \param task a #m_task_t to send on another location.
* \param alias name of the mailbox to sent the task to
*/
-void MSG_task_dsend(m_task_t task, const char *alias)
+void MSG_task_dsend(m_task_t task, const char *alias, void_f_pvoid_t cleanup)
{
simdata_task_t t_simdata = NULL;
m_process_t process = MSG_process_self();
msg_global->sent_msg++;
/* Send it by calling SIMIX network layer */
- msg_comm_t comm = xbt_new0(s_msg_comm_t, 1);
- comm->task_sent = task;
- comm->task_received = NULL;
- comm->status = MSG_OK;
- SIMIX_req_comm_isend(mailbox, t_simdata->message_size,
- t_simdata->rate, task, sizeof(void *), NULL, NULL, 1);
- /*t_simdata->comm = comm->s_comm; FIXME: is the field t_simdata->comm still useful? */
+ SIMIX_req_comm_isend(mailbox, t_simdata->message_size,
+ t_simdata->rate, task, sizeof(void *), NULL, cleanup, 1);
}
/** \ingroup msg_gos_functions
e_smx_comm_type_t type; /* Type of the communication (SIMIX_COMM_SEND or SIMIX_COMM_RECEIVE) */
smx_rdv_t rdv; /* Rendez-vous where the comm is queued */
int refcount; /* Number of processes involved in the cond */
+ int detached; /* If detached or not */
/* Surf action data */
surf_action_t surf_comm; /* The Surf communication action encapsulated */
SIMIX_comm_destroy_internal_actions(action);
+ if(action->comm.detached)
+ ((void_f_pvoid_t)action->comm.src_data)(action->comm.src_buff);
+
xbt_free(action);
}
/* If the communication action is detached then decrease the refcount
* by one, so it will be eliminated by the receivers destroy call */
- if(detached)
+ if(detached){
+ action->comm.detached = 1;
action->comm.refcount--;
+ }
/* Setup the communication request */
action->comm.src_proc = src_proc;