]> AND Private Git Repository - loba.git/blobdiff - communicator.cpp
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
Check if communications are successfull.
[loba.git] / communicator.cpp
index 45e43a3efe389502db6a480fff843c23a6cca56a..1bf16cda43b88e475a6d60b9161fb2bacb12ee59 100644 (file)
@@ -137,25 +137,17 @@ void communicator::flush(bool wait)
         std::copy(sent_comm.begin(), sent_comm.end(), comms);
         MSG_comm_waitall(comms, sent_comm.size(), -1.0);
         if (!MSG_WAIT_DESTROYS_COMMS)
-            std::for_each(sent_comm.begin(), sent_comm.end(), MSG_comm_destroy);
+            std::for_each(sent_comm.begin(), sent_comm.end(),
+                          comm_check_n_destroy);
         sent_comm.clear();
     }
 }
 
-bool communicator::comm_test_n_destroy(msg_comm_t comm)
-{
-    if (MSG_comm_test(comm)) {
-        MSG_comm_destroy(comm);
-        return true;
-    } else
-        return false;
-}
-
 int communicator::receiver_wrapper(int, char* [])
 {
     communicator* comm;
     comm = static_cast<communicator*>(MSG_process_get_data(MSG_process_self()));
-    int result = comm->receiver();
+    comm->receiver();
 
     XBT_DEBUG("terminate");
     xbt_mutex_acquire(comm->receiver_mutex);
@@ -163,12 +155,12 @@ int communicator::receiver_wrapper(int, char* [])
     xbt_cond_signal(comm->receiver_cond);
     xbt_mutex_release(comm->receiver_mutex);
 
-    return result;
+    return 0;
 }
 
 void communicator::receiver1(msg_comm_t& comm, m_task_t& task, const char* mbox)
 {
-    MSG_comm_destroy(comm);
+    comm_check_n_destroy(comm);
     if (strcmp(MSG_task_get_name(task), "finalize")) {
         XBT_DEBUG("received message on %s", mbox);
         xbt_mutex_acquire(receiver_mutex);
@@ -185,7 +177,7 @@ void communicator::receiver1(msg_comm_t& comm, m_task_t& task, const char* mbox)
     }
 }
 
-int communicator::receiver()
+void communicator::receiver()
 {
     ctrl_comm = MSG_task_irecv(&ctrl_task, get_ctrl_mbox());
     data_comm = MSG_task_irecv(&data_task, get_data_mbox());
@@ -209,13 +201,25 @@ int communicator::receiver()
             receiver1(ctrl_comm, ctrl_task, get_ctrl_mbox());
         else if (finished_comm == data_comm)
             receiver1(data_comm, data_task, get_data_mbox());
-        else {
-            XBT_ERROR("Handling unknown comm -- %p", finished_comm);
-            MSG_comm_destroy(finished_comm);
-        }
+        else
+            THROW1(0, 0, "Cannot handle unknown comm -- %p", finished_comm);
     }
     xbt_dynar_free(&comms);
-    return 0;
+}
+
+void communicator::comm_check_n_destroy(msg_comm_t comm)
+{
+    xbt_assert(MSG_comm_get_status(comm) == MSG_OK);
+    MSG_comm_destroy(comm);
+}
+
+bool communicator::comm_test_n_destroy(msg_comm_t comm)
+{
+    if (MSG_comm_test(comm)) {
+        comm_check_n_destroy(comm);
+        return true;
+    } else
+        return false;
 }
 
 // Local variables: