Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
yet another example conversion
authorFrederic Suter <frederic.suter@cc.in2p3.fr>
Wed, 22 Mar 2017 08:54:43 +0000 (09:54 +0100)
committerFrederic Suter <frederic.suter@cc.in2p3.fr>
Wed, 22 Mar 2017 08:54:43 +0000 (09:54 +0100)
examples/s4u/CMakeLists.txt
examples/s4u/README.doc
examples/s4u/actor-suspend/s4u_actor-suspend.cpp [new file with mode: 0644]
examples/s4u/actor-suspend/s4u_actor-suspend.tesh [new file with mode: 0644]

index 9c6c9b0..be0937c 100644 (file)
@@ -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()
index 6ecf35c..7a88dce 100644 (file)
@@ -34,6 +34,11 @@ documentation, but it should remain readable directly.
 
 @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.
@@ -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 (file)
index 0000000..3a3a41c
--- /dev/null
@@ -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 <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;
+}
diff --git a/examples/s4u/actor-suspend/s4u_actor-suspend.tesh b/examples/s4u/actor-suspend/s4u_actor-suspend.tesh
new file mode 100644 (file)
index 0000000..b0d8b65
--- /dev/null
@@ -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.