foreach (example actions-comm actions-storage
- actor-create actor-daemon actor-kill actor-migration actor-suspend actor-priority
- actor-create actor-daemon actor-execute actor-kill actor-lifetime actor-migration actor-suspend
++ 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
plugin-hostload io mutex)
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-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}/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
+ async-wait async-waitall async-waitany actor-priority
dht-chord 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()
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).
+ 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.
@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. */
/** This actor will be automatically terminated when the last non-daemon process 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
{
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());
+ }
+
+ 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, computing the given amount of flops */
- XBT_PUBLIC(void) execute(double flop);
+ /** Block the actor, computing the given amount of flops */
+ XBT_PUBLIC(void) execute(double flop);
-/** 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, computing the given amount of flops and priority */
+ XBT_PUBLIC(void) execute(double flop, double priority);
-/** 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 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
- 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_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);
- /** @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 (same as pid). */
+ 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 (same as ppid). */
+ 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 process is running. */
+ XBT_PUBLIC(Host*) getHost();
- /** @brief Resume the actor. */
- XBT_PUBLIC(void) resume();
+ /** @brief Suspend the actor. */
+ XBT_PUBLIC(void) suspend();
- 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);
+ }
/** @} */
simgrid::simix::kernelImmediate([this]() { pimpl_->daemonize(); });
}
- const char* Actor::getCname()
+ const simgrid::xbt::string& Actor::getName() const
{
- return this->pimpl_->name.c_str();
+ return this->pimpl_->getName();
}
- simgrid::xbt::string Actor::getName()
+ const char* Actor::getCname() const
{
- return this->pimpl_->name;
+ return this->pimpl_->getCname();
}
aid_t Actor::getPid()
simcall_execution_wait(s);
}
+void execute(double flops,double priority)
+{
+ smx_activity_t s = simcall_execution_start(nullptr,flops,1 / priority/*priority*/,0./*bound*/);
+ simcall_execution_wait(s);
+}
+
void* recv(MailboxPtr chan) // deprecated
{
return chan->get();
std::string getName()
{
- return SIMIX_process_self()->name;
+ return SIMIX_process_self()->getName();
+ }
+
+ const char* getCname()
+ {
+ return SIMIX_process_self()->getCname();
}
Host* getHost()