foreach(x actor actor-autorestart actor-migration
activity-lifecycle
- comm-pt2pt
+ comm-pt2pt wait-any-for
cloud-interrupt-migration cloud-sharing
concurrent_rw storage_client_server listen_async pid )
add_executable (${x} EXCLUDE_FROM_ALL ${x}/${x}.cpp)
## Add the tests.
## Some need to be run with all factories, some need not tesh to run
foreach(x actor actor-autorestart actor-migration
- activity-lifecycle
+ activity-lifecycle wait-any-for
cloud-interrupt-migration concurrent_rw) # TODO: actor-autorestart is disabled for now
set(tesh_files ${tesh_files} ${CMAKE_CURRENT_SOURCE_DIR}/${x}/${x}.tesh)
ADD_TESH_FACTORIES(tesh-s4u-${x} "thread;ucontext;raw;boost" --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/s4u/${x} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite/s4u/${x} --setenv platfdir=${CMAKE_HOME_DIRECTORY}/examples/platforms --cd ${CMAKE_BINARY_DIR}/teshsuite/s4u/${x} ${CMAKE_HOME_DIRECTORY}/teshsuite/s4u/${x}/${x}.tesh)
--- /dev/null
+#include <cstdlib>
+#include <iostream>
+#include <string>
+#include <simgrid/s4u.hpp>
+
+XBT_LOG_NEW_DEFAULT_CATEGORY(meh, "meh");
+
+static void worker()
+{
+ auto mbox = simgrid::s4u::Mailbox::by_name("meh");
+ int input_data[2] = {42, 51};
+
+ XBT_INFO("Sending and receiving %d and %d asynchronously", input_data[0], input_data[1]);
+
+ auto put1 = mbox->put_async(input_data, 1000*1000*500);
+ auto put2 = mbox->put_async(input_data + 1, 1000*1000*1000);
+
+ int * out1;
+ auto get1 = mbox->get_async((void**)&out1);
+
+ int * out2;
+ auto get2 = mbox->get_async((void**)&out2);
+
+ XBT_INFO("All comms have started");
+ std::vector<simgrid::s4u::CommPtr> comms = {put1, put2, get1, get2};
+
+ while (!comms.empty()) {
+ int index = simgrid::s4u::Comm::wait_any_for(&comms, 0.5);
+ if (index < 0)
+ XBT_INFO("wait_any_for: Timeout reached");
+ else {
+ XBT_INFO("wait_any_for: A comm finished (index=%d, #comms=%zu)", index, comms.size());
+ comms.erase(comms.begin() + index);
+ }
+ }
+
+ XBT_INFO("All comms have finished");
+ XBT_INFO("Got %d and %d", *out1, *out2);
+}
+
+int main(int argc, char* argv[])
+
+{
+ simgrid::s4u::Engine e(&argc, argv);
+ e.load_platform(argv[1]);
+ simgrid::s4u::Actor::create("worker", simgrid::s4u::Host::by_name("Tremblay"), worker);
+ e.run();
+ return 0;
+}
--- /dev/null
+#!/usr/bin/env tesh
+
+p Testing the wait_any_for feature of S4U
+
+! output sort 19
+$ ${bindir:=.}/wait-any-for ${platfdir:=.}/small_platform.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
+> [ 0.000000] (1:worker@Tremblay) Sending and receiving 42 and 51 asynchronously
+> [ 0.000000] (1:worker@Tremblay) All comms have started
+> [ 0.500000] (1:worker@Tremblay) wait_any_for: Timeout reached
+> [ 1.000000] (1:worker@Tremblay) wait_any_for: Timeout reached
+> [ 1.035263] (1:worker@Tremblay) wait_any_for: A comm finished (index=0, #comms=4)
+> [ 1.035263] (1:worker@Tremblay) wait_any_for: A comm finished (index=1, #comms=3)
+> [ 1.535263] (1:worker@Tremblay) wait_any_for: Timeout reached
+> [ 2.035263] (1:worker@Tremblay) wait_any_for: Timeout reached
+> [ 2.070331] (1:worker@Tremblay) wait_any_for: A comm finished (index=0, #comms=2)
+> [ 2.070331] (1:worker@Tremblay) wait_any_for: A comm finished (index=0, #comms=1)
+> [ 2.070331] (1:worker@Tremblay) All comms have finished
+> [ 2.070331] (1:worker@Tremblay) Got 42 and 51