-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})
${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()
@section s4u_ex_actors Acting on Actors
+ - <b>Suspend and Resume actors</b>.
+ @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.
+
- <b>Migrating Actors</b>.
@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.
@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
--- /dev/null
+/* 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 <simgrid/s4u.hpp>
+
+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<simgrid::s4u::Host*> list;
+ e->hostList(&list);
+ simgrid::s4u::Actor::createActor("dream_master", list.front(), dream_master);
+
+ e->run(); /* - Run the simulation */
+
+ return 0;
+}
--- /dev/null
+#! ./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.