From 6d7383f64b075e36830f416210a1b2e069fdec1c Mon Sep 17 00:00:00 2001 From: Martin Quinson Date: Sun, 10 Sep 2017 18:07:14 +0200 Subject: [PATCH] implement simgrid::s4u::Comm::wait_all() and use it in example --- examples/s4u/async-waitall/s4u_async-waitall.cpp | 15 ++++++--------- include/simgrid/s4u/Comm.hpp | 15 +++++++++++++-- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/examples/s4u/async-waitall/s4u_async-waitall.cpp b/examples/s4u/async-waitall/s4u_async-waitall.cpp index c7ca1c5e25..f93a699998 100644 --- a/examples/s4u/async-waitall/s4u_async-waitall.cpp +++ b/examples/s4u/async-waitall/s4u_async-waitall.cpp @@ -3,14 +3,12 @@ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ -/* This example shows how to use asynchronous communications. +/* This example shows how to block on the completion of a set of communications. * - * The sender initiate all the messages it wants to send, and then block for their completion. - * All messages thus occurs concurrently. + * As for the other asynchronous examples, the sender initiate all the messages it wants to send and + * pack the resulting simgrid::s4u::CommPtr objects in a vector. All messages thus occurs concurrently. * - * On the receiver side, the reception is synchronous. - * - * TODO: this example is supposed to test the waitall function, but this is not ported to s4u yet. + * The sender then blocks until all ongoing communication terminate, using simgrid::s4u::Comm::wait_all() * */ @@ -66,9 +64,8 @@ void operator()() } XBT_INFO("Done dispatching all messages"); - /* Now that all message exchanges were initiated, this loop waits for the termination of them all */ - for (int i = 0; i < messages_count + receivers_count; i++) - pending_comms->at(i)->wait(); + /* Now that all message exchanges were initiated, wait for their completion in one single call */ + simgrid::s4u::Comm::wait_all(pending_comms); XBT_INFO("Goodbye now!"); delete pending_comms; diff --git a/include/simgrid/s4u/Comm.hpp b/include/simgrid/s4u/Comm.hpp index c972fe0de5..dcb0e17745 100644 --- a/include/simgrid/s4u/Comm.hpp +++ b/include/simgrid/s4u/Comm.hpp @@ -31,8 +31,8 @@ public: virtual ~Comm(); - /*! 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. */ + /*! take a vector s4u::CommPtr and return when one of them is finished. + * The return value is the rank of the first finished CommPtr. */ 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.*/ static int wait_any_for(std::vector * comms_in, double timeout) @@ -54,6 +54,17 @@ public: xbt_dynar_free(&comms); return idx; } + + /*! take a vector s4u::CommPtr and return when all of them is finished. */ + static void wait_all(std::vector * comms) + { + // TODO: this should be a simcall or something + // TODO: we are missing a version with timeout + for (CommPtr comm : *comms) { + comm->wait(); + } + } + /** Creates (but don't start) an async send to the mailbox @p dest */ static CommPtr XBT_ATTRIB_DEPRECATED_v320("Use Mailbox::put_init(): v3.20 will turn this warning into an error.") send_init(MailboxPtr dest) -- 2.20.1