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

Private GIT Repository
Check if communications are successfull.
authorArnaud Giersch <arnaud.giersch@iut-bm.univ-fcomte.fr>
Tue, 8 Feb 2011 14:24:18 +0000 (15:24 +0100)
committerArnaud Giersch <arnaud.giersch@iut-bm.univ-fcomte.fr>
Tue, 8 Feb 2011 14:55:08 +0000 (15:55 +0100)
TODO
communicator.cpp
communicator.h
simgrid_features.h

diff --git a/TODO b/TODO
index 640fb9e7a4c08b070338f998b97cbee778cf6a80..6fa956a28f5a40cf7cf417289b59f44e9c2338a1 100644 (file)
--- a/TODO
+++ b/TODO
@@ -2,9 +2,6 @@
   -> c'est stupide d'attendre la fin des calcules s'il y en a beaucoup
      surtout en bookkeeping...
 
-* check if communications can fail !
-  (restart them)
-
 * review receive with timeout.
 
 * verify bookkeeping version.
index 1da6deffea6c2af314a36f0706f22fa1c82964f6..1bf16cda43b88e475a6d60b9161fb2bacb12ee59 100644 (file)
@@ -137,20 +137,12 @@ 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;
@@ -168,7 +160,7 @@ int communicator::receiver_wrapper(int, char* [])
 
 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);
@@ -215,6 +207,21 @@ void communicator::receiver()
     xbt_dynar_free(&comms);
 }
 
+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:
 // mode: c++
 // End:
index efd0fb759efb346131e0a6643b9912bd8f46da2f..091594fe8f6bf36af3e39bf058593a6ea9f83759 100644 (file)
@@ -71,7 +71,9 @@ private:
     void receiver1(msg_comm_t& comm, m_task_t& task, const char* mbox);
     void receiver();
 
-    // Used to test if a communication is over, and to destroy it if it is
+    // Used to chek if a communication is successfull before destroying it
+    static void comm_check_n_destroy(msg_comm_t comm);
+    // If comm is over, call comm_check_n_destroy(comm), and return true
     static bool comm_test_n_destroy(msg_comm_t comm);
 };
 
index 56fcbfbc71eac9905cd3ca48f4f13f83c02e44c7..75a15214f4746a6f703aec9e666299b1a063cb47 100644 (file)
@@ -6,12 +6,20 @@
  *
  * MSG_WAIT_DESTROYS_COMMS      1 if MSG_wait destroys communications
  *                              (has changed after SimGrid 3.5)
+ *
+ * MSG_comm_get_status(comm)    MSG_OK on SG 3.5 where it does not exist.
  */
 
 #if !defined(SIMGRID_VERSION) // ========== SimGrid <= 3.5 ============= //
 
 #define MSG_WAIT_DESTROYS_COMMS 1
 
+inline
+MSG_error_t MSG_comm_get_status(msg_comm_t /*comm*/)
+{
+    return MSG_OK;
+}
+
 #else  // ================================= SimGrid > 3.5 ============== //
 
 #define MSG_WAIT_DESTROYS_COMMS 0