X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/fe304706848f0a64477d4687b3ea97d5b9a0c35c..57b4c9b9a53ac467c4b41700cba7f0dce1d4c445:/examples/s4u/actor-exiting/s4u-actor-exiting.cpp?ds=sidebyside diff --git a/examples/s4u/actor-exiting/s4u-actor-exiting.cpp b/examples/s4u/actor-exiting/s4u-actor-exiting.cpp index 64cd98185a..aa2215bea5 100644 --- a/examples/s4u/actor-exiting/s4u-actor-exiting.cpp +++ b/examples/s4u/actor-exiting/s4u-actor-exiting.cpp @@ -1,11 +1,11 @@ -/* Copyright (c) 2017-2019. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2017-2020. 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. */ /* There is two very different ways of being informed when an actor exits. * - * The this_actor::on_exit() function allows to register a function to be + * The this_actor::on_exit() function allows one to register a function to be * executed when this very actor exits. The registered function will run * when this actor terminates (either because its main function returns, or * because it's killed in any way). No simcall are allowed here: your actor @@ -15,11 +15,17 @@ * Usually, the functions registered in this_actor::on_exit() are in charge * of releasing any memory allocated by the actor during its execution. * - * The other way of getting informed when an actor dies is to connect a - * function in the Actor::on_destruction signal, that is shared between + * The other way of getting informed when an actor terminates is to connect a + * function in the Actor::on_termination signal, that is shared between * all actors. Callbacks to this signal are executed for each terminating * actors, no matter what. This is useful in many cases, in particular - * when developping SimGrid plugins. + * when developing SimGrid plugins. + * + * Finally, you can attach callbacks to the Actor::on_destruction signal. + * It is also shared between all actors, and gets fired when the actors + * are destroyed. A delay is possible between the termination of an actor + * (ie, when it terminates executing its code) and its destruction (ie, + * when it is not referenced anywhere in the simulation and can be collected). * * In both cases, you can stack more than one callback in the signal. * They will all be executed in the registration order. @@ -34,12 +40,32 @@ static void actor_a() // Register a lambda function to be executed once it stops simgrid::s4u::this_actor::on_exit([](bool /*failed*/) { XBT_INFO("I stop now"); }); - simgrid::s4u::this_actor::execute(1e9); + simgrid::s4u::this_actor::sleep_for(1); } static void actor_b() { - simgrid::s4u::this_actor::execute(2e9); + simgrid::s4u::this_actor::sleep_for(2); +} + +static void actor_c() +{ + // Register a lambda function to be executed once it stops + simgrid::s4u::this_actor::on_exit([](bool failed) { + if (failed) { + XBT_INFO("I was killed!"); + if (xbt_log_no_loc) + XBT_INFO("The backtrace would be displayed here if --log=no_loc would not have been passed"); + else + xbt_backtrace_display_current(); + } else + XBT_INFO("Exiting gracefully."); + }); + + simgrid::s4u::this_actor::sleep_for(3); + XBT_INFO("And now, induce a deadlock by waiting for a message that will never come\n\n"); + simgrid::s4u::Mailbox::by_name("nobody")->get(); + xbt_die("Receiving is not supposed to succeed when nobody is sending"); } int main(int argc, char* argv[]) @@ -49,13 +75,17 @@ int main(int argc, char* argv[]) e.load_platform(argv[1]); /* - Load the platform description */ - /* Register a callback in the Actor::on_destruction signal. It will be called for every terminated actors */ + /* Register a callback in the Actor::on_termination signal. It will be called for every terminated actors */ + simgrid::s4u::Actor::on_termination.connect( + [](simgrid::s4u::Actor const& actor) { XBT_INFO("Actor %s terminates now", actor.get_cname()); }); + /* Register a callback in the Actor::on_destruction signal. It will be called for every destructed actors */ simgrid::s4u::Actor::on_destruction.connect( - [](simgrid::s4u::Actor const& actor) { XBT_INFO("Actor %s stops now", actor.get_cname()); }); + [](simgrid::s4u::Actor const& actor) { XBT_INFO("Actor %s gets destroyed now", actor.get_cname()); }); /* Create some actors */ simgrid::s4u::Actor::create("A", simgrid::s4u::Host::by_name("Tremblay"), actor_a); simgrid::s4u::Actor::create("B", simgrid::s4u::Host::by_name("Fafard"), actor_b); + simgrid::s4u::Actor::create("C", simgrid::s4u::Host::by_name("Ginette"), actor_c); e.run(); /* - Run the simulation */