X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/380344ba7ad3d0ed0f7fb8f86990e83b97f39831..08447964cfc19a4b579429ef71c0fccebd60199f:/include/simgrid/s4u/Comm.hpp diff --git a/include/simgrid/s4u/Comm.hpp b/include/simgrid/s4u/Comm.hpp index d409c0b073..f57798004f 100644 --- a/include/simgrid/s4u/Comm.hpp +++ b/include/simgrid/s4u/Comm.hpp @@ -11,6 +11,9 @@ #include #include #include + +#include + namespace simgrid { namespace s4u { /** @brief Communication async @@ -28,19 +31,15 @@ public: /*! take a range of s4u::CommPtr (last excluded) and return when one of them is finished. The return value is an * iterator on the finished Comms. */ - template static I wait_any(I first, I last) - { - return wait_any_for(first, last, -1); - } + static int wait_any(std::vector * comms) { return wait_any_for(comms, -1); } /*! Same as wait_any, but with a timeout. If the timeout occurs, parameter last is returned.*/ - template static I wait_any_for(I first, I last, double timeout) + static int wait_any_for(std::vector * comms_in, double timeout) { // Map to dynar: xbt_dynar_t comms = xbt_dynar_new(sizeof(simgrid::kernel::activity::ActivityImpl*), [](void*ptr){ intrusive_ptr_release(*(simgrid::kernel::activity::ActivityImpl**)ptr); }); - for (I iter = first; iter != last; iter++) { - CommPtr comm = *iter; + for (auto comm : *comms_in) { if (comm->state_ == inited) comm->start(); xbt_assert(comm->state_ == started); @@ -51,13 +50,7 @@ public: // Call the underlying simcall: int idx = simcall_comm_waitany(comms, timeout); xbt_dynar_free(&comms); - // Not found: - if (idx == -1) - return last; - // Lift the index to the corresponding iterator: - auto res = std::next(first, idx); - (*res)->state_ = finished; - return res; + return idx; } /** Creates (but don't start) an async send to the mailbox @p dest */ static CommPtr send_init(MailboxPtr dest);