Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Make SIMIX cleanup the user data of the detached isend communication actions.
authorcristianrosa <cristianrosa@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Mon, 31 Jan 2011 15:01:04 +0000 (15:01 +0000)
committercristianrosa <cristianrosa@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Mon, 31 Jan 2011 15:01:04 +0000 (15:01 +0000)
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@9534 48e7efb5-ca39-0410-a469-dd3cf9ba447f

include/msg/msg.h
src/msg/gos.c
src/simix/private.h
src/simix/smx_network.c

index 6764b1a..2003d33 100644 (file)
@@ -178,7 +178,7 @@ XBT_PUBLIC(MSG_error_t)
     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);
index 9ab4dc0..4c4480e 100644 (file)
@@ -423,7 +423,7 @@ msg_comm_t MSG_task_isend(m_task_t task, const char *alias)
  * \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();
@@ -445,13 +445,8 @@ void MSG_task_dsend(m_task_t task, const char *alias)
   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
index b797887..1991733 100644 (file)
@@ -89,6 +89,7 @@ typedef struct s_smx_action {
       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 */
index 11b84c6..bc09a3e 100644 (file)
@@ -219,6 +219,9 @@ void SIMIX_comm_destroy(smx_action_t action)
 
   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);
 }
 
@@ -265,8 +268,10 @@ smx_action_t SIMIX_comm_isend(smx_process_t src_proc, smx_rdv_t rdv,
 
   /* 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;