Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
add test proposed in #39
authorAugustin Degomme <adegomme@users.noreply.github.com>
Thu, 22 Aug 2019 23:44:10 +0000 (01:44 +0200)
committerAugustin Degomme <adegomme@users.noreply.github.com>
Thu, 22 Aug 2019 23:44:10 +0000 (01:44 +0200)
For now in teshsuite, might be moved to examples if someone asks

teshsuite/s4u/CMakeLists.txt
teshsuite/s4u/wait-any-for/wait-any-for.cpp [new file with mode: 0644]
teshsuite/s4u/wait-any-for/wait-any-for.tesh [new file with mode: 0644]

index 029dafd..049d6ba 100644 (file)
@@ -1,6 +1,6 @@
 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)
@@ -14,7 +14,7 @@ endforeach()
 ## 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)
diff --git a/teshsuite/s4u/wait-any-for/wait-any-for.cpp b/teshsuite/s4u/wait-any-for/wait-any-for.cpp
new file mode 100644 (file)
index 0000000..6558a47
--- /dev/null
@@ -0,0 +1,49 @@
+#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;
+}
diff --git a/teshsuite/s4u/wait-any-for/wait-any-for.tesh b/teshsuite/s4u/wait-any-for/wait-any-for.tesh
new file mode 100644 (file)
index 0000000..a28b790
--- /dev/null
@@ -0,0 +1,18 @@
+#!/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