From: Martin Quinson Date: Fri, 24 Aug 2018 14:13:14 +0000 (+0200) Subject: new test for the Activity::wait_until() function X-Git-Tag: v3_21~188 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/f753b6c7aeb098689e9e977e179ed72a09167e18?ds=sidebyside new test for the Activity::wait_until() function --- diff --git a/.gitignore b/.gitignore index d924cd862b..181dd1a860 100644 --- a/.gitignore +++ b/.gitignore @@ -160,6 +160,7 @@ examples/s4u/app-token-ring/s4u-app-token-ring examples/s4u/async-wait/s4u-async-wait examples/s4u/async-waitall/s4u-async-waitall examples/s4u/async-waitany/s4u-async-waitany +examples/s4u/async-waituntil/s4u-async-waituntil examples/s4u/cloud-capping/s4u-cloud-capping examples/s4u/cloud-migration/s4u-cloud-migration examples/s4u/cloud-simple/s4u-cloud-simple diff --git a/examples/s4u/CMakeLists.txt b/examples/s4u/CMakeLists.txt index 8f4060fbf0..a4dd1ef23c 100644 --- a/examples/s4u/CMakeLists.txt +++ b/examples/s4u/CMakeLists.txt @@ -3,7 +3,7 @@ foreach (example actor-create actor-daemon actor-join actor-kill actor-lifetime actor-migration actor-suspend actor-yield app-chainsend app-pingpong app-token-ring - async-wait async-waitany async-waitall + async-wait async-waitany async-waitall async-waituntil cloud-capping cloud-migration cloud-simple energy-exec energy-boot energy-link energy-vm engine-filtering @@ -73,9 +73,10 @@ set(xml_files ${xml_files} ${CMAKE_CURRENT_SOURCE_DIR}/actor-create/s4u-a ${CMAKE_CURRENT_SOURCE_DIR}/actor-yield/s4u-actor-yield_d.xml ${CMAKE_CURRENT_SOURCE_DIR}/app-bittorrent/s4u-app-bittorrent_d.xml ${CMAKE_CURRENT_SOURCE_DIR}/app-masterworkers/s4u-app-masterworkers_d.xml + ${CMAKE_CURRENT_SOURCE_DIR}/async-wait/s4u-async-wait_d.xml ${CMAKE_CURRENT_SOURCE_DIR}/async-waitany/s4u-async-waitany_d.xml ${CMAKE_CURRENT_SOURCE_DIR}/async-waitall/s4u-async-waitall_d.xml - ${CMAKE_CURRENT_SOURCE_DIR}/async-wait/s4u-async-wait_d.xml + ${CMAKE_CURRENT_SOURCE_DIR}/async-waituntil/s4u-async-waituntil_d.xml ${CMAKE_CURRENT_SOURCE_DIR}/dht-chord/s4u-dht-chord_d.xml ${CMAKE_CURRENT_SOURCE_DIR}/dht-kademlia/s4u-dht-kademlia_d.xml ${CMAKE_CURRENT_SOURCE_DIR}/energy-boot/platform_boot.xml @@ -96,7 +97,7 @@ set(txt_files ${txt_files} ${CMAKE_CURRENT_SOURCE_DIR}/replay-comm/s4u-re foreach(example actor-create actor-daemon actor-join actor-kill actor-lifetime actor-migration actor-suspend actor-yield app-bittorrent app-chainsend app-masterworkers app-pingpong app-token-ring - async-wait async-waitall async-waitany + async-wait async-waitall async-waitany async-waituntil cloud-capping cloud-migration cloud-simple dht-chord dht-kademlia energy-exec energy-boot energy-link energy-vm diff --git a/examples/s4u/async-waituntil/s4u-async-waituntil.cpp b/examples/s4u/async-waituntil/s4u-async-waituntil.cpp new file mode 100644 index 0000000000..0c10dcdcad --- /dev/null +++ b/examples/s4u/async-waituntil/s4u-async-waituntil.cpp @@ -0,0 +1,97 @@ +/* Copyright (c) 2010-2018. The SimGrid Team. All rights reserved. */ + +/* 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 simgrid::s4u::Activity::wait_until() and + * simgrid::s4u::Activity::wait_for() on a given communication. + * + * It is very similar to the async-wait example, but the sender initially + * does some waits that are too short before doing an infinite wait. + */ + +#include "simgrid/s4u.hpp" +#include +#include +#include + +XBT_LOG_NEW_DEFAULT_CATEGORY(msg_async_wait, "Messages specific for this s4u example"); + +static int sender(int argc, char** argv) +{ + xbt_assert(argc == 4, "Expecting 3 parameters from the XML deployment file but got %d", argc); + long messages_count = std::stol(argv[1]); /* - number of tasks */ + double msg_size = std::stol(argv[2]); /* - communication cost in bytes */ + long receivers_count = std::stod(argv[3]); /* - number of receivers */ + + std::vector pending_comms; + + /* Start dispatching all messages to receivers, in a round robin fashion */ + for (int i = 0; i < messages_count; i++) { + + std::string mboxName = std::string("receiver-") + std::to_string(i % receivers_count); + simgrid::s4u::MailboxPtr mbox = simgrid::s4u::Mailbox::by_name(mboxName); + std::string msgName = std::string("Message ") + std::to_string(i); + std::string* payload = new std::string(msgName); // copy the data we send: + // 'msgName' is not a stable storage location + XBT_INFO("Send '%s' to '%s'", msgName.c_str(), mboxName.c_str()); + /* Create a communication representing the ongoing communication */ + simgrid::s4u::CommPtr comm = mbox->put_async(payload, msg_size); + /* Add this comm to the vector of all known comms */ + pending_comms.push_back(comm); + } + + /* Start sending messages to let the workers know that they should stop */ + for (int i = 0; i < receivers_count; i++) { + std::string mboxName = std::string("receiver-") + std::to_string(i % receivers_count); + simgrid::s4u::MailboxPtr mbox = simgrid::s4u::Mailbox::by_name(mboxName); + std::string* payload = new std::string("finalize"); // Make a copy of the data we will send + + simgrid::s4u::CommPtr comm = mbox->put_async(payload, 0); + pending_comms.push_back(comm); + XBT_INFO("Send 'finalize' to 'receiver-%ld'", i % receivers_count); + } + XBT_INFO("Done dispatching all messages"); + + /* Now that all message exchanges were initiated, wait for their completion, in order of creation. */ + while (not pending_comms.empty()) { + simgrid::s4u::CommPtr comm = pending_comms.back(); + comm->wait_for(1); + pending_comms.pop_back(); // remove it from the list + } + + XBT_INFO("Goodbye now!"); + return 0; +} + +/* Receiver actor expects 1 argument: its ID */ +static int receiver(int argc, char** argv) +{ + xbt_assert(argc == 2, "Expecting one parameter from the XML deployment file but got %d", argc); + simgrid::s4u::MailboxPtr mbox = simgrid::s4u::Mailbox::by_name(std::string("receiver-") + argv[1]); + + XBT_INFO("Wait for my first message"); + for (bool cont = true; cont;) { + std::string* received = static_cast(mbox->get()); + XBT_INFO("I got a '%s'.", received->c_str()); + if (*received == "finalize") + cont = false; // If it's a finalize message, we're done. + delete received; + } + return 0; +} + +int main(int argc, char* argv[]) +{ + xbt_assert(argc > 2, "Usage: %s platform_file deployment_file\n", argv[0]); + + simgrid::s4u::Engine e(&argc, argv); + e.register_function("sender", &sender); + e.register_function("receiver", &receiver); + + e.load_platform(argv[1]); + e.load_deployment(argv[2]); + e.run(); + + return 0; +} diff --git a/examples/s4u/async-waituntil/s4u-async-waituntil.tesh b/examples/s4u/async-waituntil/s4u-async-waituntil.tesh new file mode 100644 index 0000000000..6d77ade03d --- /dev/null +++ b/examples/s4u/async-waituntil/s4u-async-waituntil.tesh @@ -0,0 +1,16 @@ +#!/usr/bin/env tesh + +p Test1 Sleep_sender > Sleep_receiver + +$ $SG_TEST_EXENV ${bindir:=.}/s4u-async-waituntil ${platfdir}/small_platform_fatpipe.xml s4u-async-waituntil_d.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" +> [ 0.000000] (1:sender@Tremblay) Send 'Message 0' to 'receiver-0' +> [ 0.000000] (2:receiver@Ruby) Wait for my first message +> [ 0.000000] (1:sender@Tremblay) Send 'Message 1' to 'receiver-0' +> [ 0.000000] (1:sender@Tremblay) Send 'Message 2' to 'receiver-0' +> [ 0.000000] (1:sender@Tremblay) Send 'finalize' to 'receiver-0' +> [ 0.000000] (1:sender@Tremblay) Done dispatching all messages +> [ 0.105458] (2:receiver@Ruby) I got a 'Message 0'. +> [ 0.210917] (2:receiver@Ruby) I got a 'Message 1'. +> [ 0.316375] (2:receiver@Ruby) I got a 'Message 2'. +> [ 0.318326] (2:receiver@Ruby) I got a 'finalize'. +> [ 0.318326] (1:sender@Tremblay) Goodbye now! \ No newline at end of file diff --git a/examples/s4u/async-waituntil/s4u-async-waituntil_d.xml b/examples/s4u/async-waituntil/s4u-async-waituntil_d.xml new file mode 100644 index 0000000000..88df6ecc12 --- /dev/null +++ b/examples/s4u/async-waituntil/s4u-async-waituntil_d.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + +