Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
ActivityImplPtr are not part of any C struct, only C++ classes
authorMartin Quinson <martin.quinson@loria.fr>
Mon, 19 Jun 2017 07:16:42 +0000 (09:16 +0200)
committerMartin Quinson <martin.quinson@loria.fr>
Mon, 19 Jun 2017 07:16:47 +0000 (09:16 +0200)
the refcounting fails on malloc/free. We need new/delete for that.

include/simgrid/msg.h
src/msg/msg_gos.cpp
src/msg/msg_private.h

index d5bd22e..427b232 100644 (file)
 #include "simgrid/forward.h"
 #include "simgrid/simix.h"
 
+#ifdef __cplusplus
+namespace simgrid {
+namespace msg {
+class Comm;
+}
+}
+typedef simgrid::msg::Comm sg_msg_Comm;
+#else
+typedef struct msg_Comm sg_msg_Comm;
+#endif
+
 SG_BEGIN_DECL()
 
 /* *************************** Network Zones ******************************** */
@@ -74,7 +85,7 @@ typedef sg_storage_t msg_storage_t;
  *
  * Object representing an ongoing communication between processes. Such beast is usually obtained by using #MSG_task_isend, #MSG_task_irecv or friends.
  */
-typedef struct msg_comm *msg_comm_t;
+typedef sg_msg_Comm* msg_comm_t;
 
 /** \brief Default value for an uninitialized #msg_task_t.
     \ingroup m_task_management
index 7f2e4b4..d0127d7 100644 (file)
@@ -321,11 +321,7 @@ static inline msg_comm_t MSG_task_isend_internal(msg_task_t task, const char *al
 
   msg_comm_t comm = nullptr;
   if (not detached) {
-    comm = xbt_new0(s_msg_comm_t, 1);
-    comm->task_sent = task;
-    comm->task_received = nullptr;
-    comm->status = MSG_OK;
-    comm->s_comm = act;
+    comm = new simgrid::msg::Comm(task, nullptr, act);
   }
 
   if (TRACE_is_enabled())
@@ -465,11 +461,9 @@ msg_comm_t MSG_task_irecv_bounded(msg_task_t *task, const char *name, double rat
     XBT_CRITICAL("MSG_task_irecv() was asked to write in a non empty task struct.");
 
   /* Try to receive it by calling SIMIX network layer */
-  msg_comm_t comm = xbt_new0(s_msg_comm_t, 1);
-  comm->task_sent = nullptr;
-  comm->task_received = task;
-  comm->status = MSG_OK;
-  comm->s_comm = simcall_comm_irecv(SIMIX_process_self(), mbox->getImpl(), task, nullptr, nullptr, nullptr, nullptr, rate);
+  msg_comm_t comm =
+      new simgrid::msg::Comm(nullptr, task, simcall_comm_irecv(SIMIX_process_self(), mbox->getImpl(), task, nullptr,
+                                                               nullptr, nullptr, nullptr, rate));
 
   return comm;
 }
@@ -570,7 +564,7 @@ int MSG_comm_testany(xbt_dynar_t comms)
  */
 void MSG_comm_destroy(msg_comm_t comm)
 {
-  xbt_free(comm);
+  delete comm;
 }
 
 /** \ingroup msg_task_usage
index a62d92c..e3f98d8 100644 (file)
@@ -77,15 +77,20 @@ public:
   msg_error_t errno_ = MSG_OK;  /* the last value returned by a MSG_function */
   void* data = nullptr; /* user data */
 };
-}
-}
 
-typedef struct msg_comm {
-  smx_activity_t s_comm;          /* SIMIX communication object encapsulated (the same for both processes) */
+class Comm {
+public:
   msg_task_t task_sent;           /* task sent (NULL for the receiver) */
   msg_task_t *task_received;      /* where the task will be received (NULL for the sender) */
-  msg_error_t status;           /* status of the communication once finished */
-} s_msg_comm_t;
+  smx_activity_t s_comm;          /* SIMIX communication object encapsulated (the same for both processes) */
+  msg_error_t status = MSG_OK;    /* status of the communication once finished */
+  Comm(msg_task_t sent, msg_task_t* received, smx_activity_t comm)
+      : task_sent(sent), task_received(received), s_comm(std::move(comm))
+  {
+  }
+};
+}
+}
 
 /************************** Global variables ********************************/
 typedef struct MSG_Global {