foreach (example actions-comm actions-storage
- actor-create actor-daemon actor-kill actor-migration actor-suspend
+ actor-create actor-daemon actor-execute actor-kill actor-lifetime actor-migration actor-suspend actor-priority
app-masterworker app-pingpong app-token-ring
- async-wait async-waitany async-waitall
+ async-wait async-waitany async-waitall actor-yield
+ energy-link
plugin-hostload io mutex)
add_executable (s4u-${example} ${example}/s4u-${example}.cpp)
target_link_libraries(s4u-${example} simgrid)
set(examples_src ${examples_src} PARENT_SCOPE)
set(tesh_files ${tesh_files} ${CMAKE_CURRENT_SOURCE_DIR}/app-bittorrent/s4u-app-bittorrent.tesh
${CMAKE_CURRENT_SOURCE_DIR}/dht-chord/s4u-dht-chord.tesh
+ ${CMAKE_CURRENT_SOURCE_DIR}/actor-yield/s4u-actor-yield.tesh
+ ${CMAKE_CURRENT_SOURCE_DIR}/actor-priority/s4u-actor-priority.tesh
+ ${CMAKE_CURRENT_SOURCE_DIR}/actor-lifetime/s4u-actor-lifetime.tesh
${CMAKE_CURRENT_SOURCE_DIR}/async-wait/s4u-async-wait.tesh
${CMAKE_CURRENT_SOURCE_DIR}/async-waitany/s4u-async-waitany.tesh
- ${CMAKE_CURRENT_SOURCE_DIR}/async-waitall/s4u-async-waitall.tesh PARENT_SCOPE)
+ ${CMAKE_CURRENT_SOURCE_DIR}/async-waitall/s4u-async-waitall.tesh
+ ${CMAKE_CURRENT_SOURCE_DIR}/actor-execute/s4u-actor-execute.tesh
+ PARENT_SCOPE)
set(xml_files ${xml_files} ${CMAKE_CURRENT_SOURCE_DIR}/actions-comm/s4u-actions-comm-split_d.xml
${CMAKE_CURRENT_SOURCE_DIR}/actions-comm/s4u-actions-comm_d.xml
${CMAKE_CURRENT_SOURCE_DIR}/actions-storage/s4u-actions-storage_d.xml
${CMAKE_CURRENT_SOURCE_DIR}/actor-create/s4u-actor-create_d.xml
+ ${CMAKE_CURRENT_SOURCE_DIR}/actor-priority/s4u-actor-priority_d.xml
${CMAKE_CURRENT_SOURCE_DIR}/app-bittorrent/s4u-app-bittorrent_d.xml
${CMAKE_CURRENT_SOURCE_DIR}/app-masterworker/s4u-app-masterworker_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}/dht-chord/s4u-dht-chord_d.xml PARENT_SCOPE)
+ ${CMAKE_CURRENT_SOURCE_DIR}/actor-yield/s4u-actor-yield_d.xml
+ ${CMAKE_CURRENT_SOURCE_DIR}/dht-chord/s4u-dht-chord_d.xml
+ ${CMAKE_CURRENT_SOURCE_DIR}/actor-lifetime/s4u-actor-lifetime_d.xml
+ PARENT_SCOPE)
set(txt_files ${txt_files} ${CMAKE_CURRENT_SOURCE_DIR}/actions-comm/s4u-actions-comm-split-p0.txt
${CMAKE_CURRENT_SOURCE_DIR}/actions-comm/s4u-actions-comm-split-p1.txt
${CMAKE_CURRENT_SOURCE_DIR}/actions-comm/s4u-actions-comm.txt
${CMAKE_CURRENT_SOURCE_DIR}/README.doc PARENT_SCOPE)
foreach(example actions-comm actions-storage
- actor-create actor-daemon actor-kill actor-migration actor-suspend
+ actor-create actor-daemon actor-execute actor-kill actor-lifetime actor-migration actor-suspend
app-bittorrent app-masterworker app-pingpong app-token-ring
- async-wait async-waitall async-waitany actor-yield
- dht-chord plugin-hostload io mutex)
- async-wait async-waitall async-waitany actor-priority
++ async-wait async-waitall async-waitany actor-priority actor-yield
+ dht-chord
+ energy-link
+ plugin-hostload io 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()
@ref examples/s4u/actor-create/s4u-actor-create_d.xml \n
Shows how to start your actors to populate your simulation.
- - <b>Ping Pong</b>: @ref examples/s4u/app-pingpong/s4u-app-pingpong.c\n
- It's hard to think of a simpler example: it is just sending one message back and forth.
- The tesh file laying in the directory show how to start the simulator binary, highlighting how to pass options to
- the simulators (as detailed in Section \ref options).
+ - <b>Ping Pong</b>: @ref examples/s4u/app-pingpong/s4u-app-pingpong.cpp\n
+ This simple example just sends one message back and forth.
+ The tesh file laying in the directory show how to start the simulator binary, highlighting how to pass options to
+ the simulators (as detailed in Section \ref options).
- <b>Token ring:</b> @ref examples/s4u/app-token-ring/s4u-app-token-ring.cpp \n
Shows how to implement a classical communication pattern, where a token is exchanged along a ring to reach every
Another good old example, where one Master process has a bunch of task to dispatch to a set of several Worker
processes.
- @section msg_ex_async Asynchronous communications
+ @section s4u_ex_async Asynchronous communications
- <b>Basic asynchronous communications</b>.
@ref examples/s4u/async-wait/s4u-async-wait.cpp \n
@ref examples/s4u/async-waitany/s4u-async-waitany.cpp\n
The @ref simgrid::s4u::Comm::wait_any() function is useful when you want to block
until one activity of the set completes, no matter which terminates
- first.
+ first.
@section s4u_ex_actors Acting on Actors
@ref examples/s4u/actor-create/s4u-actor-create.cpp \n
Most actors are started from the deployment XML file, but they exist other methods.
+ - <b>Actors using CPU time</b>.
+ @ref examples/s4u/actor-execute/s4u-actor-execute.cpp \n
+ The computations done in your program are not reported to the
+ simulated world, unless you explicitely request the simulator to pause
+ the actor until a given amount of flops gets computed on its simulated
+ host.
+
- <b>Daemonize actors</b>
@ref examples/s4u/actor-daemon/s4u-actor-daemon.cpp \n
Some actors may be intended to simulate daemons that run in background. This example show how to transform a regular
Actors can be suspended and resumed during their executions
thanks to the @ref suspend and @ref resume methods.
+ - <b>Priority actors</b>.
+ @ref examples/s4u/actor-priority/s4u-actor-priority.cpp \n
+ Actors can be launched according their priorities thanks to the @ref
+ execution method.
+
- <b>Kill actors</b>.
@ref examples/s4u/actor-kill/s4u-actor-kill.cpp \n
Actors can forcefully stop other actors with the @ref kill method.
+ - <b>Controling the actor life cycle from the XML</b>.
+ @ref examples/s4u/actor-lifetime/s4u-actor-lifetime.cpp
+ @ref examples/s4u/actor-lifetime/s4u-actor-lifetime_d.xml
+ \n
+ You can specify a start time and a kill time in the deployment file.
+
- <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.
+ - <b>Yielding to other actor</b>.
+ @ref examples/s4u/actor-yield/s4u-actor-yield.c\n
+ The @ref yield function interrupts the execution of the
+ current actor, leaving a chance to run to the other actor
+ that are ready to run at the exact same timestamp
+
@section s4u_ex_synchro Inter-Actor Synchronization
- <b>Mutex: </b> @ref examples/s4u/mutex/s4u-mutex.cpp \n
@example examples/s4u/actor-create/s4u-actor-create.cpp
@example examples/s4u/actor-create/s4u-actor-create_d.xml
@example examples/s4u/actor-daemon/s4u-actor-daemon.cpp
+ @example examples/s4u/actor-execute/s4u-actor-execute.cpp
@example examples/s4u/actor-kill/s4u-actor-kill.cpp
+ @example examples/s4u/actor-lifetime/s4u-actor-lifetime.cpp
+ @example examples/s4u/actor-lifetime/s4u-actor-lifetime_d.xml
@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
- /* Copyright (c) 2006-2016. The SimGrid Team. All rights reserved. */
+ /* Copyright (c) 2006-2017. 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. */
* <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd">
* <platform version="4">
*
- * <!-- Start a process called 'master' on the host called 'Tremblay' -->
- * <process host="Tremblay" function="master">
+ * <!-- Start an actor called 'master' on the host called 'Tremblay' -->
+ * <actor host="Tremblay" function="master">
* <!-- Here come the parameter that you want to feed to this instance of master -->
* <argument value="20"/> <!-- argv[1] -->
* <argument value="50000000"/> <!-- argv[2] -->
* <argument value="1000000"/> <!-- argv[3] -->
* <argument value="5"/> <!-- argv[4] -->
- * </process>
+ * </actor>
*
- * <!-- Start a process called 'worker' on the host called 'Jupiter' -->
- * <process host="Jupiter" function="worker"/> <!-- Don't provide any parameter ->>
+ * <!-- Start an actor called 'worker' on the host called 'Jupiter' -->
+ * <actor host="Jupiter" function="worker"/> <!-- Don't provide any parameter ->>
*
* </platform>
* @endcode
/** Create an actor using code
*
* Using this constructor, move-only type can be used. The consequence is
- * that we cannot copy the value and restart the process in its initial
+ * that we cannot copy the value and restart the actor in its initial
* state. In order to use auto-restart, an explicit `function` must be passed
* instead.
*/
static ActorPtr createActor(const char* name, s4u::Host* host, const char* function, std::vector<std::string> args);
// ***** Methods *****
- /** This actor will be automatically terminated when the last non-daemon process finishes **/
+ /** This actor will be automatically terminated when the last non-daemon actor finishes **/
void daemonize();
- /** Retrieves the name of that actor as a C string */
- const char* getCname();
/** Retrieves the name of that actor as a C++ string */
- simgrid::xbt::string getName();
+ const simgrid::xbt::string& getName() const;
+ /** Retrieves the name of that actor as a C string */
+ const char* getCname() const;
/** Retrieves the host on which that actor is running */
s4u::Host* getHost();
/** Retrieves the PID of that actor
/** Suspend an actor by suspending the task on which it was waiting for the completion. */
void suspend();
- /** Resume a suspended process by resuming the task on which it was waiting for the completion. */
+ /** Resume a suspended actor by resuming the task on which it was waiting for the completion. */
void resume();
--
++
+ void yield();
-
- /** Returns true if the process is suspended. */
++
+ /** Returns true if the actor is suspended. */
int isSuspended();
/** If set to true, the actor will automatically restart when its host reboots */
void setAutoRestart(bool autorestart);
/** Add a function to the list of "on_exit" functions for the current actor. The on_exit functions are the functions
- * executed when your actor is killed. You should use them to free the data used by your process.
+ * executed when your actor is killed. You should use them to free the data used by your actor.
*/
void onExit(int_f_pvoid_pvoid_t fun, void* data);
{
auto seconds = std::chrono::duration_cast<SimulationClockDuration>(duration);
this_actor::sleep_for(seconds.count());
- }
- template<class Duration>
- inline void sleep_until(const SimulationTimePoint<Duration>& timeout_time)
- {
- auto timeout_native = std::chrono::time_point_cast<SimulationClockDuration>(timeout_time);
- this_actor::sleep_until(timeout_native.time_since_epoch().count());
- }
+ }
- XBT_ATTRIB_DEPRECATED_v320("Use sleep_for(): v3.20 will turn this warning into an error.") inline void sleep(
- double duration)
- {
- return sleep_for(duration);
- }
+ template <class Duration> inline void sleep_until(const SimulationTimePoint<Duration>& timeout_time)
+ {
+ auto timeout_native = std::chrono::time_point_cast<SimulationClockDuration>(timeout_time);
+ this_actor::sleep_until(timeout_native.time_since_epoch().count());
+ }
- /** Block the actor, computing the given amount of flops */
- XBT_PUBLIC(void) execute(double flop);
+ XBT_ATTRIB_DEPRECATED_v320("Use sleep_for(): v3.20 will turn this warning into an error.") inline void sleep(
+ double duration)
+ {
+ return sleep_for(duration);
+ }
- /** Block the actor until it gets a message from the given mailbox.
- *
- * See \ref Comm for the full communication API (including non blocking communications).
- */
- XBT_PUBLIC(void*)
- XBT_ATTRIB_DEPRECATED_v320("Use Mailbox::get(): v3.20 will turn this warning into an error.") recv(MailboxPtr chan);
- XBT_PUBLIC(void*)
- XBT_ATTRIB_DEPRECATED_v320("Use Mailbox::get(): v3.20 will turn this warning into an error.")
- recv(MailboxPtr chan, double timeout);
- XBT_PUBLIC(CommPtr)
- XBT_ATTRIB_DEPRECATED_v320("Use Mailbox::recv_async(): v3.20 will turn this warning into an error.")
- irecv(MailboxPtr chan, void** data);
-
- /** Block the actor until it delivers a message of the given simulated size to the given mailbox
- *
- * See \ref Comm for the full communication API (including non blocking communications).
- */
- XBT_PUBLIC(void)
- XBT_ATTRIB_DEPRECATED_v320("Use Mailbox::put(): v3.20 will turn this warning into an error.")
- send(MailboxPtr chan, void* payload, double simulatedSize); // 3.17
- XBT_PUBLIC(void)
- XBT_ATTRIB_DEPRECATED_v320("Use Mailbox::put(): v3.20 will turn this warning into an error.")
- send(MailboxPtr chan, void* payload, double simulatedSize, double timeout); // 3.17
+ /** Block the actor, computing the given amount of flops */
+ XBT_PUBLIC(void) execute(double flop);
+ /** Block the actor, computing the given amount of flops at the given priority.
+ * An execution of priority 2 computes twice as fast as an execution at priority 1. */
+ XBT_PUBLIC(void) execute(double flop, double priority);
+
+ /** Block the actor until it gets a message from the given mailbox.
+ *
+ * See \ref Comm for the full communication API (including non blocking communications).
+ */
+ XBT_ATTRIB_DEPRECATED_v320("Use Mailbox::get(): v3.20 will turn this warning into an error.") XBT_PUBLIC(void*)
+ recv(MailboxPtr chan);
+ XBT_ATTRIB_DEPRECATED_v320("Use Mailbox::get(): v3.20 will turn this warning into an error.") XBT_PUBLIC(void*)
+ recv(MailboxPtr chan, double timeout);
+ XBT_ATTRIB_DEPRECATED_v320("Use Mailbox::recv_async(): v3.20 will turn this warning into an error.") XBT_PUBLIC(CommPtr)
+ irecv(MailboxPtr chan, void** data);
+
+ /** Block the actor until it delivers a message of the given simulated size to the given mailbox
+ *
+ * See \ref Comm for the full communication API (including non blocking communications).
+ */
+ XBT_ATTRIB_DEPRECATED_v320("Use Mailbox::put(): v3.20 will turn this warning into an error.") XBT_PUBLIC(void)
+ send(MailboxPtr chan, void* payload, double simulatedSize);
+ XBT_ATTRIB_DEPRECATED_v320("Use Mailbox::put(): v3.20 will turn this warning into an error.") XBT_PUBLIC(void)
+ send(MailboxPtr chan, void* payload, double simulatedSize, double timeout);
- XBT_PUBLIC(CommPtr)
- XBT_ATTRIB_DEPRECATED_v320("Use Mailbox::put_async(): v3.20 will turn this warning into an error.")
- isend(MailboxPtr chan, void* payload, double simulatedSize);
+ XBT_ATTRIB_DEPRECATED_v320("Use Mailbox::put_async(): v3.20 will turn this warning into an error.") XBT_PUBLIC(CommPtr)
+ isend(MailboxPtr chan, void* payload, double simulatedSize);
- /** @brief Returns the actor ID of the current actor (same as pid). */
- XBT_PUBLIC(aid_t) getPid();
+ /** @brief Returns the actor ID of the current actor). */
+ XBT_PUBLIC(aid_t) getPid();
- /** @brief Returns the ancestor's actor ID of the current actor (same as ppid). */
- XBT_PUBLIC(aid_t) getPpid();
+ /** @brief Returns the ancestor's actor ID of the current actor. */
+ XBT_PUBLIC(aid_t) getPpid();
- /** @brief Returns the name of the current actor. */
- XBT_PUBLIC(std::string) getName();
+ /** @brief Returns the name of the current actor. */
+ XBT_PUBLIC(std::string) getName();
- /** @brief Returns the name of the host on which the process is running. */
- XBT_PUBLIC(Host*) getHost();
+ /** @brief Returns the name of the current actor as a C string. */
+ XBT_PUBLIC(const char*) getCname();
- /** @brief Suspend the actor. */
- XBT_PUBLIC(void) suspend();
+ /** @brief Returns the name of the host on which the actor is running. */
+ XBT_PUBLIC(Host*) getHost();
- /** @brief Resume the actor. */
- XBT_PUBLIC(void) resume();
+ /** @brief Suspend the actor. */
+ XBT_PUBLIC(void) suspend();
- XBT_PUBLIC(void) yield();
++/** @brief yield the actor. */
++XBT_PUBLIC(void) yield();
+
- XBT_PUBLIC(bool) isSuspended();
+ /** @brief Resume the actor. */
+ XBT_PUBLIC(void) resume();
- /** @brief kill the actor. */
- XBT_PUBLIC(void) kill();
+ XBT_PUBLIC(bool) isSuspended();
- /** @brief Add a function to the list of "on_exit" functions. */
- XBT_PUBLIC(void) onExit(int_f_pvoid_pvoid_t fun, void* data);
+ /** @brief kill the actor. */
+ XBT_PUBLIC(void) kill();
- /** @brief Migrate the actor to a new host. */
- XBT_PUBLIC(void) migrate(Host* new_host);
- };
+ /** @brief Add a function to the list of "on_exit" functions. */
+ XBT_PUBLIC(void) onExit(int_f_pvoid_pvoid_t fun, void* data);
+
+ /** @brief Migrate the actor to a new host. */
+ XBT_PUBLIC(void) migrate(Host* new_host);
+ }
/** @} */