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

Private GIT Repository
Document SG 3.5 bugs, and workarounds taken to circumvent them.
[loba.git] / communicator.cpp
index bcdce2fbda6d6dfda76e1558be50a62a68597925..e30d73187dc8e184ece920423ed33cca03e16454 100644 (file)
@@ -9,6 +9,7 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(comm);
 
 #include "misc.h"
 #include "options.h"
+#include "simgrid_features.h"
 #include "tracing.h"
 
 #include "communicator.h"
@@ -128,21 +129,14 @@ bool communicator::recv(message*& msg, m_host_t& from, double timeout)
 
 void communicator::flush(bool wait)
 {
-    using std::tr1::bind;
-    using std::tr1::placeholders::_1;
-
     sent_comm.remove_if(comm_test_n_destroy);
     if (wait && !sent_comm.empty()) {
-        xbt_dynar_t comms = xbt_dynar_new(sizeof(msg_comm_t), NULL);
-        while (!sent_comm.empty()) {
-            std::for_each(sent_comm.begin(), sent_comm.end(),
-                          bind(xbt_dynar_push,
-                               comms, bind(misc::address<msg_comm_t>(), _1)));
-            MSG_comm_waitany(comms);
-            xbt_dynar_reset(comms);
-            sent_comm.remove_if(comm_test_n_destroy);
-        }
-        xbt_dynar_free(&comms);
+        msg_comm_t comms[sent_comm.size()];
+        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);
+        sent_comm.clear();
     }
 }