From: Frederic Suter Date: Wed, 22 Mar 2017 08:54:43 +0000 (+0100) Subject: yet another example conversion X-Git-Tag: v3_15~15 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/6cf65172eec69f4e0fe6c18dc9a1afa73a4b6f91 yet another example conversion --- diff --git a/examples/s4u/CMakeLists.txt b/examples/s4u/CMakeLists.txt index 9c6c9b055b..be0937c860 100644 --- a/examples/s4u/CMakeLists.txt +++ b/examples/s4u/CMakeLists.txt @@ -1,4 +1,5 @@ -foreach (example actor-migration app-masterworker app-token-ring io launching mutex actions-comm actions-storage) +foreach (example actions-comm actions-storage actor-migration actor-suspend app-masterworker app-token-ring + io launching mutex ) add_executable (s4u_${example} ${example}/s4u_${example}.cpp) target_link_libraries(s4u_${example} simgrid) set_target_properties(s4u_${example} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${example}) @@ -20,6 +21,7 @@ set(txt_files ${txt_files} ${CMAKE_CURRENT_SOURCE_DIR}/actions-comm/s4u_a ${CMAKE_CURRENT_SOURCE_DIR}/actions-storage/s4u_actions-storage.txt ${CMAKE_CURRENT_SOURCE_DIR}/README.doc PARENT_SCOPE) -foreach(example actor-migration app-masterworker app-token-ring io launching mutex actions-comm actions-storage) +foreach(example actions-comm actions-storage actor-migration actor-suspend app-masterworker app-token-ring + io launching mutex ) ADD_TESH_FACTORIES(s4u-${example} "thread;ucontext;raw;boost" --setenv bindir=${CMAKE_CURRENT_BINARY_DIR}/${example} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/platforms --cd ${CMAKE_HOME_DIRECTORY}/examples/s4u/${example} s4u_${example}.tesh) endforeach() diff --git a/examples/s4u/README.doc b/examples/s4u/README.doc index 6ecf35c1c3..7a88dce900 100644 --- a/examples/s4u/README.doc +++ b/examples/s4u/README.doc @@ -34,6 +34,11 @@ documentation, but it should remain readable directly. @section s4u_ex_actors Acting on Actors + - Suspend and Resume actors. + @ref examples/s4u/actor-suspend/actor-suspend.cpp \n + Actors can be suspended and resumed during their executions + thanks to the @ref suspend and @ref resume methods. + - Migrating Actors. @ref examples/s4u/actor-migration/s4u_actor-migration.cpp \n Actors can move or be moved from a host to another with the @ref migrate method. @@ -77,6 +82,7 @@ also the tesh files in the example directories for details. @example examples/s4u/actions-comm/s4u_actions-comm.cpp @example examples/s4u/actions-storage/s4u_actions-storage.cpp @example examples/s4u/actor-migration/s4u_actor-migration.cpp +@example examples/s4u/actor-suspend/s4u_actor-suspend.cpp @example examples/s4u/app-token-ring/s4u_app-token-ring.cpp @example examples/s4u/app-master-worker/s4u_app-master-worker.cpp @example examples/s4u/launching/deployment.xml diff --git a/examples/s4u/actor-suspend/s4u_actor-suspend.cpp b/examples/s4u/actor-suspend/s4u_actor-suspend.cpp new file mode 100644 index 0000000000..3a3a41cf84 --- /dev/null +++ b/examples/s4u/actor-suspend/s4u_actor-suspend.cpp @@ -0,0 +1,81 @@ +/* Copyright (c) 2007, 2009-2015. 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. */ + +#include + +XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_actor_suspend, "Messages specific for this s4u example"); + +/* The Lazy guy only wants to sleep, but can be awaken by the dream_master process. */ +static void lazy_guy() +{ + XBT_INFO("Nobody's watching me ? Let's go to sleep."); + simgrid::s4u::this_actor::suspend(); /* - Start by suspending itself */ + XBT_INFO("Uuuh ? Did somebody call me ?"); + + XBT_INFO("Going to sleep..."); /* - Then repetitively go to sleep, but got awaken */ + simgrid::s4u::this_actor::sleep_for(10); + XBT_INFO("Mmm... waking up."); + + XBT_INFO("Going to sleep one more time (for 10 sec)..."); + simgrid::s4u::this_actor::sleep_for(10); + XBT_INFO("Waking up once for all!"); + + XBT_INFO("Ok, let's do some work, then (for 10 sec on Boivin)."); + simgrid::s4u::this_actor::execute(980.95e6); + + XBT_INFO("Mmmh, I'm done now. Goodbye."); +} + +/* The Dream master: */ +static void dream_master() +{ + XBT_INFO("Let's create a lazy guy."); /* - Create a lazy_guy process */ + simgrid::s4u::ActorPtr lazy = simgrid::s4u::Actor::createActor("Lazy", simgrid::s4u::this_actor::host(), lazy_guy); + XBT_INFO("Let's wait a little bit..."); + simgrid::s4u::this_actor::sleep_for(10); /* - Wait for 10 seconds */ + XBT_INFO("Let's wake the lazy guy up! >:) BOOOOOUUUHHH!!!!"); + lazy->resume(); /* - Then wake up the lazy_guy */ + + simgrid::s4u::this_actor::sleep_for(5); /* Repeat two times: */ + XBT_INFO("Suspend the lazy guy while he's sleeping..."); + lazy->suspend(); /* - Suspend the lazy_guy while he's asleep */ + XBT_INFO("Let him finish his siesta."); + simgrid::s4u::this_actor::sleep_for(10); /* - Wait for 10 seconds */ + XBT_INFO("Wake up, lazy guy!"); + lazy->resume(); /* - Then wake up the lazy_guy again */ + + simgrid::s4u::this_actor::sleep_for(5); + XBT_INFO("Suspend again the lazy guy while he's sleeping..."); + lazy->suspend(); + XBT_INFO("This time, don't let him finish his siesta."); + simgrid::s4u::this_actor::sleep_for(2); + XBT_INFO("Wake up, lazy guy!"); + lazy->resume(); + + simgrid::s4u::this_actor::sleep_for(5); + XBT_INFO("Give a 2 seconds break to the lazy guy while he's working..."); + lazy->suspend(); + simgrid::s4u::this_actor::sleep_for(2); + XBT_INFO("Back to work, lazy guy!"); + lazy->resume(); + + XBT_INFO("OK, I'm done here."); +} + +int main(int argc, char* argv[]) +{ + simgrid::s4u::Engine* e = new simgrid::s4u::Engine(&argc, argv); + xbt_assert(argc == 2, "Usage: %s platform_file\n\tExample: %s msg_platform.xml\n", argv[0], argv[0]); + + e->loadPlatform(argv[1]); /* - Load the platform description */ + std::vector list; + e->hostList(&list); + simgrid::s4u::Actor::createActor("dream_master", list.front(), dream_master); + + e->run(); /* - Run the simulation */ + + return 0; +} diff --git a/examples/s4u/actor-suspend/s4u_actor-suspend.tesh b/examples/s4u/actor-suspend/s4u_actor-suspend.tesh new file mode 100644 index 0000000000..b0d8b65231 --- /dev/null +++ b/examples/s4u/actor-suspend/s4u_actor-suspend.tesh @@ -0,0 +1,26 @@ +#! ./tesh + +p Testing the suspend/resume feature of MSG + +! output sort 19 +$ $SG_TEST_EXENV ${bindir:=.}/s4u_actor-suspend ${srcdir:=.}/small_platform.xml "--log=root.fmt:[%10.6r]%e(%P@%h)%e%m%n" +> [ 0.000000] (dream_master@Boivin) Let's create a lazy guy. +> [ 0.000000] (Lazy@Boivin) Nobody's watching me ? Let's go to sleep. +> [ 0.000000] (dream_master@Boivin) Let's wait a little bit... +> [ 10.000000] (dream_master@Boivin) Let's wake the lazy guy up! >:) BOOOOOUUUHHH!!!! +> [ 10.000000] (Lazy@Boivin) Uuuh ? Did somebody call me ? +> [ 10.000000] (Lazy@Boivin) Going to sleep... +> [ 15.000000] (dream_master@Boivin) Suspend the lazy guy while he's sleeping... +> [ 15.000000] (dream_master@Boivin) Let him finish his siesta. +> [ 25.000000] (dream_master@Boivin) Wake up, lazy guy! +> [ 25.000000] (Lazy@Boivin) Mmm... waking up. +> [ 25.000000] (Lazy@Boivin) Going to sleep one more time (for 10 sec)... +> [ 30.000000] (dream_master@Boivin) Suspend again the lazy guy while he's sleeping... +> [ 30.000000] (dream_master@Boivin) This time, don't let him finish his siesta. +> [ 32.000000] (dream_master@Boivin) Wake up, lazy guy! +> [ 35.000000] (Lazy@Boivin) Waking up once for all! +> [ 35.000000] (Lazy@Boivin) Ok, let's do some work, then (for 10 sec on Boivin). +> [ 37.000000] (dream_master@Boivin) Give a 2 seconds break to the lazy guy while he's working... +> [ 39.000000] (dream_master@Boivin) Back to work, lazy guy! +> [ 39.000000] (dream_master@Boivin) OK, I'm done here. +> [ 47.000000] (Lazy@Boivin) Mmmh, I'm done now. Goodbye.