8 <object id="TOC" data="graphical-toc.svg" type="image/svg+xml"></object>
10 window.onload=function() { // Wait for the SVG to be loaded before changing it
11 var elem=document.querySelector("#TOC").contentDocument.getElementById("ActorBox")
12 elem.style="opacity:0.93999999;fill:#ff0000;fill-opacity:0.1;stroke:#000000;stroke-width:0.35277778;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1";
18 The S4U interface (SimGrid for you) mixes the full power of SimGrid
19 with the full power of C++. This is the preferred interface to describe
20 abstract algorithms in the domains of Cloud, P2P, HPC, IoT, and similar
23 Since v3.20 (June 2018), S4U is the way to go for long-term
24 projects. It is feature complete, but may still evolve slightly in
25 future releases. It can already be used to do everything that can be
26 done in SimGrid, but you may have to adapt your code in future
27 releases. When this happens, compiling your code will produce
28 deprecation warnings for 4 releases (one year) before the removal of
30 If you want an API that will never ever evolve in the future, you
31 should use the :ref:`deprecated MSG API <MSG_doc>` instead.
36 A typical SimGrid simulation is composed of several |API_s4u_Actors|_, that
37 execute user-provided functions. The actors have to explicitly use the
38 S4U interface to express their :ref:`computation <API_s4u_Exec>`,
39 :ref:`communication <API_s4u_Comm>`, :ref:`disk usage <API_s4u_Io>`,
40 and other |API_s4u_Activities|_, so that they get reflected within the
41 simulator. These activities take place on resources such as |API_s4u_Hosts|_,
42 |API_s4u_Links|_, and |API_s4u_Disks|_. SimGrid predicts the time taken by each
43 activity and orchestrates the actors accordingly, waiting for the
44 completion of these activities.
47 When **communicating**, data is not directly sent to other actors but
48 posted onto a |API_s4u_Mailbox|_ that serves as a rendezvous point between
49 communicating actors. This means that you don't need to know who you
50 are talking to, you just put your communication `Put` request in a
51 mailbox, and it will be matched with a complementary `Get`
52 request. Alternatively, actors can interact through **classical
53 synchronization mechanisms** such as |API_s4u_Barrier|_, |API_s4u_Semaphore|_,
54 |API_s4u_Mutex|_, and |API_s4u_ConditionVariable|_.
56 Each actor is located on a simulated |API_s4u_Host|_. Each host is located
57 in a |API_s4u_NetZone|_, that knows the networking path between one
58 resource to another. Each NetZone is included in another one, forming
59 a tree of NetZones which root zone contains the whole platform. The
60 actors can also be located on a |API_s4U_VirtualMachine|_ that may
61 restrict the activities it contains to a limited amount of cores.
62 Virtual machines can also be migrated between hosts.
64 The :ref:`simgrid::s4u::this_actor <API_s4u_this_actor>` namespace
65 provides many helper functions to simplify the code of actors.
67 .. rst-class:: compact-list
69 - **Simulation Elements**
71 - :ref:`class Actor <API_s4u_Actor>`: Active entities executing your application.
72 - :ref:`class Engine <API_s4u_Engine>`: Simulation engine (singleton).
73 - :ref:`class Mailbox <API_s4u_Mailbox>`: Communication rendezvous, with which actors meet each other.
77 - :ref:`class Disk <API_s4u_Disk>`: Resource on which actors can write and read data.
78 - :ref:`class Host <API_s4u_Host>`: Actor location, providing computational power.
79 - :ref:`class Link <API_s4u_Link>`: Interconnecting hosts.
80 - :ref:`class NetZone <API_s4u_NetZone>`: Sub-region of the platform, containing resources (Hosts, Links, etc).
81 - :ref:`class VirtualMachine <API_s4u_VirtualMachine>`: Execution containers that can be moved between Hosts.
83 - **Activities** (:ref:`class Activity <API_s4u_Activity>`): The things that actors can do on resources.
85 - :ref:`class Comm <API_s4u_Comm>`: Communication activity, started on Mailboxes and consuming links.
86 - :ref:`class Exec <API_s4u_Exec>`: Computation activity, started on Host and consuming CPU resources.
87 - :ref:`class Io <API_s4u_Io>`: I/O activity, started on and consuming disks.
89 - **Synchronization Objects**: Classical IPC that actors can use
91 - :ref:`class Barrier <API_s4u_Barrier>`
92 - :ref:`class ConditionVariable <API_s4u_ConditionVariable>`
93 - :ref:`class Mutex <API_s4u_Mutex>`
94 - :ref:`class Semaphore <API_s4u_Semaphore>`
96 .. |API_s4u_Actors| replace:: **Actors**
97 .. _API_s4u_Actors: #api-s4u-actor
99 .. |API_s4u_Activities| replace:: **Activities**
100 .. _API_s4u_Activities: #api-s4u-activity
102 .. |API_s4u_Hosts| replace:: **Hosts**
103 .. _API_s4u_Hosts: #api-s4u-host
105 .. |API_s4u_Links| replace:: **Links**
106 .. _API_s4u_Links: #api-s4u-link
108 .. |API_s4u_Disks| replace:: **Disks**
109 .. _API_s4u_Disks: #api-s4u-disk
111 .. |API_s4u_VirtualMachine| replace:: **VirtualMachines**
113 .. |API_s4u_Host| replace:: **Host**
115 .. |API_s4u_Mailbox| replace:: **Mailbox**
117 .. |API_s4u_Mailboxes| replace:: **Mailboxes**
118 .. _API_s4u_Mailboxes: #s4u-mailbox
120 .. |API_s4u_NetZone| replace:: **NetZone**
122 .. |API_s4u_Barrier| replace:: **Barrier**
124 .. |API_s4u_Semaphore| replace:: **Semaphore**
126 .. |API_s4u_ConditionVariable| replace:: **ConditionVariable**
128 .. |API_s4u_Mutex| replace:: **Mutex**
135 Activities represent the actions that consume a resource, such as a
136 :ref:`Comm <API_s4u_Comm>` that consumes the *transmitting power* of
137 :ref:`Link <API_s4u_Link>` resources, or an :ref:`Exec <API_s4u_Exec>`
138 that consumes the *computing power* of :ref:`Host <API_s4u_Host>` resources.
139 See also the :ref:`full API <API_s4u_Activity>` below.
141 =======================
142 Asynchronous Activities
143 =======================
145 Every activity can be either **blocking** or **asynchronous**. For
146 example, :cpp:func:`s4u::Mailbox::put() <simgrid::s4u::Mailbox::put>`
147 and :cpp:func:`s4u::Mailbox::get() <simgrid::s4u::Mailbox::get>`
148 create blocking communications: the actor is blocked until the
149 completion of that communication. Asynchronous communications do not
150 block the actor during their execution but progress on their own.
152 Once your asynchronous activity is started, you can test for its
153 completion using :cpp:func:`s4u::Activity::test() <simgrid::s4u::Activity::test>`.
154 This function returns ``true`` if the activity is completed already.
155 You can also use :cpp:func:`s4u::Activity::wait() <simgrid::s4u::Activity::wait>`
156 to block until the completion of the activity. To wait for at most a given amount of time,
157 use :cpp:func:`s4u::Activity::wait_for() <simgrid::s4u::Activity::wait_for>`.
158 Finally, to wait at most until a specified time limit, use
159 :cpp:func:`s4u::Activity::wait_until() <simgrid::s4u::Activity::wait_until>`.
161 Every kind of activity can be asynchronous.
162 :ref:`s4u::CommPtr <API_s4u_Comm>` are created with :cpp:func:`s4u::Mailbox::put_async() <simgrid::s4u::Mailbox::put_async>` and
163 :cpp:func:`s4u::Mailbox::get_async() <simgrid::s4u::Mailbox::get_async>`;
164 :ref:`s4u::IoPtr <API_s4u_Io>` are created with :cpp:func:`s4u::Disk::read_async() <simgrid::s4u::Disk::read_async>` and
165 :cpp:func:`s4u::Disk::write_async() <simgrid::s4u::Disk::write_async>`; and
166 :ref:`s4u::ExecPtr <API_s4u_Exec>` are created with
167 :cpp:func:`s4u::Host::exec_async() <simgrid::s4u::Host::exec_async>`.
168 In the future, it will become possible to have asynchronous IPC such as asynchronous mutex lock requests.
170 The following example shows how to have several concurrent
171 communications ongoing. First, you have to declare a vector in which
172 we will store the ongoing communications. It is also useful to have a
175 .. literalinclude:: ../../examples/cpp/comm-waitall/s4u-comm-waitall.cpp
177 :start-after: init-begin
178 :end-before: init-end
181 Then, you start all the communications that should occur concurrently with
182 :cpp:func:`s4u::Mailbox::put_async() <simgrid::s4u::Mailbox::put_async>`.
183 Finally, the actor waits for the completion of all of them at once
184 with :cpp:func:`s4u::Comm::wait_all() <simgrid::s4u::Comm::wait_all>`.
186 .. literalinclude:: ../../examples/cpp/comm-waitall/s4u-comm-waitall.cpp
188 :start-after: put-begin
192 =====================
193 Activities Life cycle
194 =====================
196 Sometimes, you want to change the setting of an activity before it even starts.
198 .. todo:: write this section
205 Please also refer to the :ref:`API reference for s4u::Mailbox
212 |API_s4u_Mailboxes|_ are rendezvous points for network communications,
213 similar to URLs on which you could post and retrieve data. Actually,
214 the mailboxes are not involved in the communication once it starts,
215 but only to find the contact with which you want to communicate.
217 They are similar to many common things: The phone number, which allows
218 the caller to find the receiver. The Twitter hashtag, which helps
219 senders and receivers to find each other. In TCP, the pair
220 ``{host name, host port}`` to which you can connect to find your peer.
221 In HTTP, URLs through which the clients can connect to the servers.
222 In ZeroMQ, the queues are used to match senders and receivers.
224 One big difference with most of these systems is that no actor is the
225 exclusive owner of a mailbox, neither in sending nor in receiving.
226 Many actors can send into and/or receive from the same mailbox. TCP
227 socket ports for example are shared on the sender side but exclusive
228 on the receiver side (only one process can receive from a given socket
229 at a given point of time).
231 A big difference with TCP sockets or MPI communications is that
232 communications do not start right away after a
233 :cpp:func:`Mailbox::put() <simgrid::s4u::Mailbox::put>`, but wait
234 for the corresponding :cpp:func:`Mailbox::get() <simgrid::s4u::Mailbox::get>`.
235 You can change this by :ref:`declaring a receiving actor <s4u_receiving_actor>`.
237 A big difference with Twitter hashtags is that SimGrid does not
238 offer easy support to broadcast a given message to many
239 receivers. So that would be like a Twitter tag where each message
240 is consumed by the first receiver.
242 A big difference with the ZeroMQ queues is that you cannot filter
243 on the data you want to get from the mailbox. To model such settings
244 in SimGrid, you'd have one mailbox per potential topic, and subscribe
245 to each topic individually with a
246 :cpp:func:`get_async() <simgrid::s4u::Mailbox::get_async>` on each mailbox.
247 Then, use :cpp:func:`Comm::wait_any() <simgrid::s4u::Comm::wait_any>`
248 to get the first message on any of the mailboxes you are subscribed to.
250 The mailboxes are not located on the network, and you can access
251 them without any latency. The network delays are only related to the
252 location of the sender and receiver once the match between them is
253 done on the mailbox. This is just like the phone number that you
254 can use locally, and the geographical distance only comes into play
255 once you start the communication by dialing this number.
257 =====================
258 How to use Mailboxes?
259 =====================
261 You can retrieve any existing mailbox from its name (which is a
262 unique string, just like a Twitter tag). This results in a
263 versatile tool that can be used to build many different
266 To model classical socket communications, use "hostname:port" as
267 mailbox names, and make sure that only one actor reads into a given
268 mailbox. This does not make it easy to build a perfectly realistic
269 model of the TCP sockets, but in most cases, this system is too
270 cumbersome for your simulations anyway. You probably want something
271 simpler, that turns out to be easy to build with the mailboxes.
273 Many SimGrid examples use a sort of yellow page system where the
274 mailbox names are the name of the service (such as "worker",
275 "master", or "reducer"). That way, you don't have to know where your
276 peer is located to contact it. You don't even need its name. Its
277 function is enough for that. This also gives you some sort of load
278 balancing for free if more than one actor pulls from the mailbox:
279 the first actor that can deal with the request will handle it.
281 =========================================
282 How are put() and get() requests matched?
283 =========================================
285 The matching algorithm simple: first come, first serve. When a new
286 send arrives, it matches the oldest enqueued receive. If no receive is
287 currently enqueued, then the incoming send is enqueued. As you can
288 see, the mailbox cannot contain both send and receive requests: all
289 enqueued requests must be of the same sort.
291 .. _s4u_receiving_actor:
293 ===========================
294 Declaring a Receiving Actor
295 ===========================
297 The last twist is that by default in the simulator, the data starts
298 to be exchanged only when both the sender and the receiver are
299 announced (it waits until both :cpp:func:`put() <simgrid::s4u::Mailbox::put()>`
300 and :cpp:func:`get() <simgrid::s4u::Mailbox::get()>` are posted).
301 In TCP, since you establish connections beforehand, the data starts to
302 flow as soon as the sender posts it, even if the receiver did not post
303 its :cpp:func:`put() <simgrid::s4u::Mailbox::put()>` yet.
305 To model this in SimGrid, you can declare a specific receiver to a
306 given mailbox (with the function
307 :cpp:func:`set_receiver() <simgrid::s4u::Mailbox::set_receiver()>`).
308 That way, any :cpp:func:`put() <simgrid::s4u::Mailbox::put()>`
309 posted to that mailbox will start as soon as possible, and the data
310 will already be there on the receiver host when the receiver actor
311 posts its :cpp:func:`get() <simgrid::s4u::Mailbox::get()>`
313 Note that being permanent receivers of a mailbox prevents actors to be
314 garbage-collected. If your simulation creates many short-lived actors
315 that are marked as permanent receiver, you should call
316 ``mailbox->set_receiver(nullptr)`` by the end of the actors so that their
317 memory gets properly reclaimed. This call should be at the end of the
318 actor's function, not in an on_exit callback.
320 ===============================
321 Communicating without Mailboxes
322 ===============================
324 Sometimes you don't want to simulate communications between actors as
325 allowed by mailboxes, but you want to create a direct communication
326 between two arbitrary hosts. This can arise when you write a
327 high-level model of a centralized scheduler, or when you model direct
328 communications such as one-sided communications in MPI or remote
329 memory direct access in PGAS.
331 For that, :cpp:func:`Comm::sendto() <simgrid::s4u::Comm::sendto()>`
332 simulates a direct communication between the two specified hosts. No
333 mailbox is used, and there is no rendezvous between actors. You can
334 freely mix such direct communications and rendezvous-based
335 communications. Alternatively, :cpp:func:`Comm::sendto_init()
336 <simgrid::s4u::Comm::sendto_init()>` and
337 :cpp:func:`Comm::sendto_async() <simgrid::s4u::Comm::sendto_async()>`
338 create asynchronous direct communications.
345 For sake of simplicity, we use `RAII
346 <https://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization>`_
347 for many classes in S4U. This is an idiom where resources are automatically
348 managed through the context. Provided that you never manipulate
349 objects of type Foo directly but always FooPtr references (which are
350 defined as `boost::intrusive_ptr
351 <http://www.boost.org/doc/libs/1_61_0/libs/smart_ptr/intrusive_ptr.html>`_
352 <Foo>), you will never have to explicitly release the resource that
353 you use nor to free the memory of unused objects.
354 Here is a little example:
360 simgrid::s4u::MutexPtr mutex = simgrid::s4u::Mutex::create(); // Too bad we cannot use `new`
362 mutex->lock(); // use the mutex as a simple reference
366 } // The mutex gets automatically freed because the only existing reference gets out of scope
368 Note that Mailboxes, Hosts, and Links are not handled through smart
369 pointers (yet?). This means that it is currently impossible to destroy a
370 mailbox or a link. You can still destroy a host (but probably
371 shouldn't), using :cpp:func:`simgrid::s4u::Host::destroy`.
375 .. include:: ../../examples/README.rst
380 .. _API_s4u_simulation_object:
396 .. doxygenclass:: simgrid::s4u::Actor
398 .. doxygentypedef:: aid_t
401 .. group-tab:: Python
403 .. autoclass:: simgrid.Actor
414 #include <simgrid/s4u/Actor.hpp>
416 .. doxygentypedef:: ActorPtr
418 .. group-tab:: Python
422 from simgrid import Actor
428 #include <simgrid/actor.h>
430 .. doxygentypedef:: sg_actor_t
431 .. doxygentypedef:: const_sg_actor_t
432 .. doxygenfunction:: sg_actor_ref
433 .. doxygenfunction:: sg_actor_unref
439 See also :ref:`the relevant example <s4u_ex_actors_create>`.
445 .. doxygenfunction:: simgrid::s4u::Actor::create(const std::string &name, s4u::Host *host, const std::function< void()> &code)
446 .. doxygenfunction:: simgrid::s4u::Actor::create(const std::string &name, s4u::Host *host, F code)
447 .. doxygenfunction:: simgrid::s4u::Actor::create(const std::string &name, s4u::Host *host, F code, Args... args)
448 .. doxygenfunction:: simgrid::s4u::Actor::create(const std::string &name, s4u::Host *host, const std::string &function, std::vector< std::string > args)
450 .. doxygenfunction:: simgrid::s4u::Actor::init(const std::string &name, s4u::Host *host)
451 .. doxygenfunction:: simgrid::s4u::Actor::start(const std::function< void()> &code)
452 .. doxygenfunction:: simgrid::s4u::Actor::set_stacksize
454 .. group-tab:: Python
456 .. automethod:: simgrid.Actor.create
460 .. doxygenfunction:: sg_actor_create(const char *name, sg_host_t host, xbt_main_func_t code, int argc, char *const *argv)
461 .. doxygenfunction:: sg_actor_init(const char *name, sg_host_t host)
462 .. doxygenfunction:: sg_actor_start(sg_actor_t actor, xbt_main_func_t code, int argc, char *const *argv)
463 .. doxygenfunction:: sg_actor_set_stacksize
465 .. doxygenfunction:: sg_actor_attach(const char *name, void *data, sg_host_t host, xbt_dict_t properties)
466 .. doxygenfunction:: sg_actor_detach()
475 .. doxygenfunction:: simgrid::s4u::Actor::by_pid(aid_t pid)
476 .. doxygenfunction:: simgrid::s4u::Actor::self()
478 .. group-tab:: Python
480 .. automethod:: simgrid.Actor.by_pid
481 .. automethod:: simgrid.Actor.self
485 .. doxygenfunction:: sg_actor_by_pid(aid_t pid)
486 .. doxygenfunction:: sg_actor_self()
487 .. doxygenfunction:: sg_actor_list()
496 .. doxygenfunction:: simgrid::s4u::Actor::get_cname
497 .. doxygenfunction:: simgrid::s4u::Actor::get_name
498 .. doxygenfunction:: simgrid::s4u::Actor::get_pid
499 .. doxygenfunction:: simgrid::s4u::Actor::get_ppid
500 .. doxygenfunction:: simgrid::s4u::Actor::get_properties() const
501 .. doxygenfunction:: simgrid::s4u::Actor::get_property(const std::string &key) const
502 .. doxygenfunction:: simgrid::s4u::Actor::set_property(const std::string &key, const std::string &value)
504 .. doxygenfunction:: simgrid::s4u::Actor::get_host
505 .. doxygenfunction:: simgrid::s4u::Actor::set_host
507 .. doxygenfunction:: simgrid::s4u::Actor::get_refcount
508 .. doxygenfunction:: simgrid::s4u::Actor::get_impl
510 .. group-tab:: Python
512 .. autoattribute:: simgrid.Actor.name
513 .. autoattribute:: simgrid.Actor.host
514 .. autoattribute:: simgrid.Actor.pid
515 .. autoattribute:: simgrid.Actor.ppid
519 .. doxygenfunction:: sg_actor_get_name(const_sg_actor_t actor)
520 .. doxygenfunction:: sg_actor_get_pid(const_sg_actor_t actor)
521 .. doxygenfunction:: sg_actor_get_ppid(const_sg_actor_t actor)
522 .. doxygenfunction:: sg_actor_get_properties(const_sg_actor_t actor)
523 .. doxygenfunction:: sg_actor_get_property_value(const_sg_actor_t actor, const char *name)
525 .. doxygenfunction:: sg_actor_get_host(const_sg_actor_t actor)
526 .. doxygenfunction:: sg_actor_set_host(sg_actor_t actor, sg_host_t host)
528 .. doxygenfunction:: sg_actor_get_data(const_sg_actor_t actor)
529 .. doxygenfunction:: sg_actor_set_data(sg_actor_t actor, void *userdata)
531 Suspending and resuming actors
532 ------------------------------
538 .. doxygenfunction:: simgrid::s4u::Actor::suspend()
539 .. doxygenfunction:: simgrid::s4u::Actor::resume()
540 .. doxygenfunction:: simgrid::s4u::Actor::is_suspended
542 .. group-tab:: Python
544 .. automethod:: simgrid.Actor.resume
545 .. automethod:: simgrid.Actor.suspend
546 .. automethod:: simgrid.Actor.is_suspended
550 .. doxygenfunction:: sg_actor_suspend(sg_actor_t actor)
551 .. doxygenfunction:: sg_actor_resume(sg_actor_t actor)
552 .. doxygenfunction:: sg_actor_is_suspended(const_sg_actor_t actor)
554 Specifying when actors should terminate
555 ---------------------------------------
561 .. doxygenfunction:: simgrid::s4u::Actor::kill()
562 .. doxygenfunction:: simgrid::s4u::Actor::kill_all()
563 .. doxygenfunction:: simgrid::s4u::Actor::set_kill_time(double time)
564 .. doxygenfunction:: simgrid::s4u::Actor::get_kill_time
566 .. doxygenfunction:: simgrid::s4u::Actor::restart()
567 .. doxygenfunction:: simgrid::s4u::Actor::daemonize()
568 .. doxygenfunction:: simgrid::s4u::Actor::is_daemon
570 .. group-tab:: Python
572 .. automethod:: simgrid.Actor.kill
573 .. automethod:: simgrid.Actor.kill_all
575 .. automethod:: simgrid.Actor.daemonize
576 .. automethod:: simgrid.Actor.is_daemon
580 .. doxygenfunction:: sg_actor_kill(sg_actor_t actor)
581 .. doxygenfunction:: sg_actor_kill_all()
582 .. doxygenfunction:: sg_actor_set_kill_time(sg_actor_t actor, double kill_time)
584 .. doxygenfunction:: sg_actor_restart(sg_actor_t actor)
585 .. doxygenfunction:: sg_actor_daemonize(sg_actor_t actor)
586 .. doxygenfunction:: sg_actor_is_daemon
588 .. _API_s4u_Actor_end:
590 Reacting to the end of actors
591 -----------------------------
597 .. doxygenfunction:: simgrid::s4u::Actor::on_exit
598 .. doxygenfunction:: simgrid::s4u::Actor::join() const
599 .. doxygenfunction:: simgrid::s4u::Actor::join(double timeout) const
600 .. doxygenfunction:: simgrid::s4u::Actor::set_auto_restart(bool autorestart)
601 .. doxygenfunction:: simgrid::s4u::Actor::get_restart_count
603 .. group-tab:: Python
605 .. automethod:: simgrid.Actor.join
609 .. doxygenfunction:: sg_actor_on_exit
610 .. doxygenfunction:: sg_actor_join(const_sg_actor_t actor, double timeout)
611 .. doxygenfunction:: sg_actor_set_auto_restart(sg_actor_t actor, int auto_restart)
620 .. doxygenfunction:: simgrid::s4u::Actor::on_creation_cb
621 .. doxygenfunction:: simgrid::s4u::Actor::on_suspend_cb
622 .. doxygenfunction:: simgrid::s4u::Actor::on_host_change_cb
623 .. doxygenfunction:: simgrid::s4u::Actor::on_resume_cb
624 .. doxygenfunction:: simgrid::s4u::Actor::on_sleep_cb
625 .. doxygenfunction:: simgrid::s4u::Actor::on_wake_up_cb
626 .. doxygenfunction:: simgrid::s4u::Actor::on_termination_cb
627 .. doxygenfunction:: simgrid::s4u::Actor::on_destruction_cb
629 .. _API_s4u_this_actor:
635 These functions can be used in your user code to interact with the actor
636 currently running (the one retrieved with :cpp:func:`simgrid::s4u::Actor::self`).
637 Using these functions can greatly improve the code readability.
646 .. doxygenfunction:: simgrid::s4u::this_actor::get_cname()
647 .. doxygenfunction:: simgrid::s4u::this_actor::get_name()
648 .. doxygenfunction:: simgrid::s4u::this_actor::get_pid()
649 .. doxygenfunction:: simgrid::s4u::this_actor::get_ppid()
650 .. doxygenfunction:: simgrid::s4u::this_actor::is_maestro()
652 .. doxygenfunction:: simgrid::s4u::this_actor::get_host()
653 .. doxygenfunction:: simgrid::s4u::this_actor::set_host(Host *new_host)
655 .. group-tab:: Python
657 .. autofunction:: simgrid.this_actor.get_host
658 .. autofunction:: simgrid.this_actor.set_host
660 .. autofunction:: simgrid.this_actor.get_pid
661 .. autofunction:: simgrid.this_actor.get_ppid
665 .. doxygenfunction:: sg_actor_self_get_data()
666 .. doxygenfunction:: sg_actor_self_set_data(void *data)
667 .. doxygenfunction:: sg_actor_self_get_name()
668 .. doxygenfunction:: sg_actor_self_get_pid()
669 .. doxygenfunction:: sg_actor_self_get_ppid()
670 .. doxygenfunction:: sg_host_self()
671 .. doxygenfunction:: sg_host_self_get_name()
673 Suspending and resuming
674 -----------------------
680 .. doxygenfunction:: simgrid::s4u::this_actor::suspend()
681 .. doxygenfunction:: simgrid::s4u::this_actor::yield()
683 .. group-tab:: Python
685 .. autofunction:: simgrid.this_actor.suspend
686 .. autofunction:: simgrid.this_actor.yield_
690 .. doxygenfunction:: sg_actor_yield()
699 Please refer to :ref:`the relevant documentation <logging_prog>`.
701 .. group-tab:: Python
703 .. autofunction:: simgrid.this_actor.debug
704 .. autofunction:: simgrid.this_actor.info
705 .. autofunction:: simgrid.this_actor.warning
706 .. autofunction:: simgrid.this_actor.error
715 .. doxygenfunction:: simgrid::s4u::this_actor::sleep_for(double duration)
716 .. doxygenfunction:: simgrid::s4u::this_actor::sleep_for(std::chrono::duration< Rep, Period > duration)
717 .. doxygenfunction:: simgrid::s4u::this_actor::sleep_until(const SimulationTimePoint< Duration > &wakeup_time)
718 .. doxygenfunction:: simgrid::s4u::this_actor::sleep_until(double wakeup_time)
720 .. group-tab:: Python
722 .. autofunction:: simgrid.this_actor.sleep_for
723 .. autofunction:: simgrid.this_actor.sleep_until
727 .. doxygenfunction:: sg_actor_sleep_for(double duration)
729 Simulating executions
730 ---------------------
732 Simulate the execution of some code on this actor. You can either simulate
733 parallel or sequential code and you can either block upon the termination of
734 the execution, or start an asynchronous activity.
740 .. doxygenfunction:: simgrid::s4u::this_actor::exec_async
741 .. doxygenfunction:: simgrid::s4u::this_actor::exec_init(const std::vector< s4u::Host * > &hosts, const std::vector< double > &flops_amounts, const std::vector< double > &bytes_amounts)
742 .. doxygenfunction:: simgrid::s4u::this_actor::exec_init(double flops_amounts)
743 .. doxygenfunction:: simgrid::s4u::this_actor::execute(double flop)
744 .. doxygenfunction:: simgrid::s4u::this_actor::execute(double flop, double priority)
745 .. doxygenfunction:: simgrid::s4u::this_actor::parallel_execute(const std::vector< s4u::Host * > &hosts, const std::vector< double > &flops_amounts, const std::vector< double > &bytes_amounts)
746 .. doxygenfunction:: simgrid::s4u::this_actor::thread_execute
748 .. group-tab:: Python
750 .. autofunction:: simgrid.this_actor.exec_init
751 .. autofunction:: simgrid.this_actor.execute
755 .. doxygenfunction:: sg_actor_execute(double flops)
756 .. doxygenfunction:: sg_actor_execute_with_priority(double flops, double priority)
757 .. doxygenfunction:: sg_actor_exec_init(double computation_amount)
758 .. doxygenfunction:: sg_actor_exec_async(double computation_amount)
759 .. doxygenfunction:: sg_actor_parallel_exec_init(int host_nb, const sg_host_t* host_list, double* flops_amount, double* bytes_amount);
768 .. doxygenfunction:: simgrid::s4u::this_actor::exit()
769 .. doxygenfunction:: simgrid::s4u::this_actor::on_exit(const std::function< void(bool)> &fun)
771 .. group-tab:: Python
773 .. autofunction:: simgrid.this_actor.exit
774 .. autofunction:: simgrid.this_actor.on_exit
778 See also :cpp:func:`sg_actor_on_exit`.
780 .. doxygenfunction:: sg_actor_exit
792 .. doxygenclass:: simgrid::s4u::Engine
794 .. group-tab:: Python
796 .. autoclass:: simgrid.Engine
805 .. doxygenfunction:: simgrid::s4u::Engine::Engine(int *argc, char **argv)
806 .. doxygenfunction:: simgrid::s4u::Engine::is_initialized()
807 .. doxygenfunction:: simgrid::s4u::Engine::shutdown()
808 .. doxygenfunction:: simgrid::s4u::Engine::get_instance()
810 .. group-tab:: Python
812 .. automethod:: simgrid.Engine.__init__
813 .. autoattribute:: simgrid.Engine.instance
817 .. doxygenfunction:: simgrid_init
826 .. doxygenfunction:: simgrid::s4u::Engine::set_config(const std::string &str)
827 .. doxygenfunction:: simgrid::s4u::Engine::set_config(const std::string &name, bool value)
828 .. doxygenfunction:: simgrid::s4u::Engine::set_config(const std::string &name, double value)
829 .. doxygenfunction:: simgrid::s4u::Engine::set_config(const std::string &name, int value)
830 .. doxygenfunction:: simgrid::s4u::Engine::set_config(const std::string &name, const std::string &value)
832 .. doxygenfunction:: simgrid::s4u::Engine::load_deployment
833 .. doxygenfunction:: simgrid::s4u::Engine::load_platform
834 .. doxygenfunction:: simgrid::s4u::Engine::register_actor(const std::string &name)
835 .. doxygenfunction:: simgrid::s4u::Engine::register_actor(const std::string &name, F code)
836 .. doxygenfunction:: simgrid::s4u::Engine::register_default(const std::function< void(int, char **)> &code)
837 .. doxygenfunction:: simgrid::s4u::Engine::register_default(const kernel::actor::ActorCodeFactory &factory)
839 .. doxygenfunction:: simgrid::s4u::Engine::register_function(const std::string &name, const std::function< void(int, char **)> &code)
840 .. doxygenfunction:: simgrid::s4u::Engine::register_function(const std::string &name, const std::function< void(std::vector< std::string >)> &code)
841 .. doxygenfunction:: simgrid::s4u::Engine::register_function(const std::string &name, const kernel::actor::ActorCodeFactory &factory)
843 .. group-tab:: Python
845 .. automethod:: simgrid.Engine.load_deployment
846 .. automethod:: simgrid.Engine.load_platform
847 .. automethod:: simgrid.Engine.register_actor
851 .. doxygenfunction:: simgrid_load_deployment
852 .. doxygenfunction:: simgrid_load_platform
853 .. doxygenfunction:: simgrid_register_default
854 .. doxygenfunction:: simgrid_register_function
864 .. doxygenfunction:: simgrid::s4u::Engine::get_clock()
865 .. doxygenfunction:: simgrid::s4u::Engine::run
866 .. doxygenfunction:: simgrid::s4u::Engine::run_until
868 .. group-tab:: Python
870 .. autoattribute:: simgrid.Engine.clock
871 .. automethod:: simgrid.Engine.run
872 .. automethod:: simgrid.Engine.run_until
876 .. doxygenfunction:: simgrid_get_clock
877 .. doxygenfunction:: simgrid_run
878 .. doxygenfunction:: simgrid_run_until
887 .. doxygenfunction:: simgrid::s4u::Engine::get_actor_count
888 .. doxygenfunction:: simgrid::s4u::Engine::get_all_actors
889 .. doxygenfunction:: simgrid::s4u::Engine::get_filtered_actors
893 .. doxygenfunction:: sg_actor_count()
902 .. doxygenfunction:: simgrid::s4u::Engine::get_all_hosts
903 .. doxygenfunction:: simgrid::s4u::Engine::get_host_count
904 .. doxygenfunction:: simgrid::s4u::Engine::get_filtered_hosts
905 .. doxygenfunction:: simgrid::s4u::Engine::host_by_name
906 .. doxygenfunction:: simgrid::s4u::Engine::host_by_name_or_null
908 .. group-tab:: Python
910 .. autoattribute:: simgrid.Engine.all_hosts
911 .. automethod:: simgrid::s4u::Engine::host_by_name
915 See also :cpp:func:`sg_host_list` and :cpp:func:`sg_host_count`.
924 .. doxygenfunction:: simgrid::s4u::Engine::get_all_links
925 .. doxygenfunction:: simgrid::s4u::Engine::get_link_count
926 .. doxygenfunction:: simgrid::s4u::Engine::get_filtered_links
927 .. doxygenfunction:: simgrid::s4u::Engine::link_by_name
928 .. doxygenfunction:: simgrid::s4u::Engine::link_by_name_or_null
930 .. group-tab:: Python
932 .. autoattribute:: simgrid.Engine.all_links
934 Interacting with the routing
935 ----------------------------
941 .. doxygenfunction:: simgrid::s4u::Engine::get_all_netpoints
942 .. doxygenfunction:: simgrid::s4u::Engine::get_filtered_netzones
943 .. doxygenfunction:: simgrid::s4u::Engine::get_netzone_root
944 .. doxygenfunction:: simgrid::s4u::Engine::netpoint_by_name_or_null
945 .. doxygenfunction:: simgrid::s4u::Engine::netzone_by_name_or_null
947 .. group-tab:: Python
949 .. autoattribute:: simgrid.Engine.all_netpoints
950 .. autoattribute:: simgrid.Engine.netzone_root
951 .. automethod:: simgrid.Engine.netpoint_by_name
952 .. automethod:: simgrid.Engine.netzone_by_name
961 .. doxygenfunction:: simgrid::s4u::Engine::on_deadlock_cb
962 .. doxygenfunction:: simgrid::s4u::Engine::on_platform_created_cb
963 .. doxygenfunction:: simgrid::s4u::Engine::on_platform_creation_cb
964 .. doxygenfunction:: simgrid::s4u::Engine::on_simulation_start_cb
965 .. doxygenfunction:: simgrid::s4u::Engine::on_simulation_end_cb
966 .. doxygenfunction:: simgrid::s4u::Engine::on_time_advance_cb
978 .. doxygenclass:: simgrid::s4u::Mailbox
980 .. group-tab:: Python
982 .. autoclass:: simgrid.Mailbox
984 Please also refer to the :ref:`full doc on s4u::Mailbox <s4u_mailbox>`.
995 #include <simgrid/s4u/Mailbox.hpp>
997 Note that there is no MailboxPtr type and that you cannot use the RAII
998 idiom on mailboxes because they are internal objects to the simulation
999 engine. Once created, there is no way to destroy a mailbox before the end
1002 .. doxygenfunction:: simgrid::s4u::Mailbox::by_name(const std::string &name)
1004 .. group-tab:: Python
1008 #include <simgrid/mailbox.h>
1010 .. automethod:: simgrid.Mailbox.by_name
1016 #include <simgrid/s4u/mailbox.h>
1018 .. doxygentypedef:: sg_mailbox_t
1019 .. doxygentypedef:: const_sg_mailbox_t
1021 .. doxygenfunction:: sg_mailbox_by_name(const char *alias)
1030 .. doxygenfunction:: simgrid::s4u::Mailbox::get_cname
1031 .. doxygenfunction:: simgrid::s4u::Mailbox::get_name
1033 .. group-tab:: Python
1035 .. autoattribute:: simgrid.Mailbox.name
1044 .. doxygenfunction:: simgrid::s4u::Mailbox::put(void *payload, uint64_t simulated_size_in_bytes)
1045 .. doxygenfunction:: simgrid::s4u::Mailbox::put(void *payload, uint64_t simulated_size_in_bytes, double timeout)
1046 .. doxygenfunction:: simgrid::s4u::Mailbox::put_async(void *data, uint64_t simulated_size_in_bytes)
1047 .. doxygenfunction:: simgrid::s4u::Mailbox::put_init()
1048 .. doxygenfunction:: simgrid::s4u::Mailbox::put_init(void *data, uint64_t simulated_size_in_bytes)
1050 .. group-tab:: Python
1052 .. automethod:: simgrid.Mailbox.put
1053 .. automethod:: simgrid.Mailbox.put_async
1054 .. automethod:: simgrid.Mailbox.put_init
1058 .. doxygenfunction:: sg_mailbox_put(sg_mailbox_t mailbox, void *payload, long simulated_size_in_bytes)
1059 .. doxygenfunction:: sg_mailbox_put_init(sg_mailbox_t mailbox, void *payload, long simulated_size_in_bytes)
1060 .. doxygenfunction:: sg_mailbox_put_async(sg_mailbox_t mailbox, void *payload, long simulated_size_in_bytes)
1070 .. doxygenfunction:: simgrid::s4u::Mailbox::empty
1071 .. doxygenfunction:: simgrid::s4u::Mailbox::front
1072 .. doxygenfunction:: simgrid::s4u::Mailbox::get()
1073 .. doxygenfunction:: simgrid::s4u::Mailbox::get(double timeout)
1074 .. doxygenfunction:: simgrid::s4u::Mailbox::get_async(T **data)
1075 .. doxygenfunction:: simgrid::s4u::Mailbox::get_init()
1076 .. doxygenfunction:: simgrid::s4u::Mailbox::iprobe(int type, const std::function<bool(void *, void *, kernel::activity::CommImpl *)>& match_fun, void *data)
1077 .. doxygenfunction:: simgrid::s4u::Mailbox::listen
1078 .. doxygenfunction:: simgrid::s4u::Mailbox::ready
1080 .. group-tab:: Python
1082 .. automethod:: simgrid.Mailbox.get
1083 .. automethod:: simgrid.Mailbox.get_async
1084 .. autoattribute:: simgrid.Mailbox.ready
1088 .. doxygenfunction:: sg_mailbox_get(sg_mailbox_t mailbox)
1089 .. doxygenfunction:: sg_mailbox_get_async(sg_mailbox_t mailbox, void **data)
1090 .. doxygenfunction:: sg_mailbox_get_name(const_sg_mailbox_t mailbox)
1091 .. doxygenfunction:: sg_mailbox_listen(const char *alias)
1096 See :ref:`s4u_receiving_actor`.
1102 .. doxygenfunction:: simgrid::s4u::Mailbox::get_receiver
1103 .. doxygenfunction:: simgrid::s4u::Mailbox::set_receiver(ActorPtr actor)
1107 .. doxygenfunction:: sg_mailbox_set_receiver(const char *alias)
1109 .. _API_s4u_Resource:
1125 .. doxygenclass:: simgrid::s4u::Disk
1127 .. group-tab:: Python
1129 .. autoclass:: simgrid.Disk
1133 .. doxygentypedef:: sg_disk_t
1134 .. doxygentypedef:: const_sg_disk_t
1145 #include <simgrid/s4u/Disk.hpp>
1147 Note that there is no DiskPtr type and that you cannot use the RAII
1148 idiom on disks because SimGrid does not allow (yet) to create nor
1149 destroy resources once the simulation is started.
1151 .. doxygenfunction:: simgrid::s4u::Disk::seal()
1153 .. group-tab:: Python
1157 from simgrid import Disk
1159 .. automethod:: simgrid.Disk.seal
1169 .. doxygenfunction:: simgrid::s4u::Disk::get_cname() const
1170 .. doxygenfunction:: simgrid::s4u::Disk::get_host() const
1171 .. doxygenfunction:: simgrid::s4u::Disk::get_name() const
1172 .. doxygenfunction:: simgrid::s4u::Disk::get_properties() const
1173 .. doxygenfunction:: simgrid::s4u::Disk::get_property(const std::string &key) const
1174 .. doxygenfunction:: simgrid::s4u::Disk::get_read_bandwidth() const
1175 .. doxygenfunction:: simgrid::s4u::Disk::get_write_bandwidth() const
1176 .. doxygenfunction:: simgrid::s4u::Disk::set_property(const std::string &, const std::string &value)
1177 .. doxygenfunction:: simgrid::s4u::Disk::set_sharing_policy(Operation op, SharingPolicy policy, const s4u::NonLinearResourceCb& cb = {})
1179 .. group-tab:: Python
1181 .. autoattribute:: simgrid.Disk.name
1182 .. automethod:: simgrid.Disk.set_sharing_policy
1191 .. doxygenfunction:: simgrid::s4u::Disk::io_init(sg_size_t size, s4u::Io::OpType type) const
1192 .. doxygenfunction:: simgrid::s4u::Disk::read(sg_size_t size) const
1193 .. doxygenfunction:: simgrid::s4u::Disk::read_async(sg_size_t size) const
1194 .. doxygenfunction:: simgrid::s4u::Disk::write(sg_size_t size) const
1195 .. doxygenfunction:: simgrid::s4u::Disk::write_async(sg_size_t size) const
1197 .. group-tab:: Python
1199 .. automethod:: simgrid.Disk.read
1200 .. automethod:: simgrid.Disk.read_async
1201 .. automethod:: simgrid.Disk.write
1202 .. automethod:: simgrid.Disk.write_async
1211 .. doxygenfunction:: simgrid::s4u::Disk::on_creation_cb
1212 .. doxygenfunction:: simgrid::s4u::Disk::on_destruction_cb
1213 .. doxygenfunction:: simgrid::s4u::Disk::on_state_change_cb
1226 .. doxygenclass:: simgrid::s4u::Host
1228 .. group-tab:: Python
1230 .. autoclass:: simgrid.Host
1241 #include <simgrid/s4u/Host.hpp>
1243 Note that there is no HostPtr type, and that you cannot use the RAII
1244 idiom on hosts because SimGrid does not allow (yet) to create nor
1245 destroy resources once the simulation is started.
1247 .. doxygenfunction:: simgrid::s4u::Host::destroy()
1248 .. doxygenfunction:: simgrid::s4u::Host::seal()
1250 .. group-tab:: Python
1254 from simgrid import Host
1256 .. automethod:: simgrid.Host.seal
1262 #include <simgrid/host.h>
1264 .. doxygentypedef:: sg_host_t
1265 .. cpp:type:: const s4u_Host* const_sg_host_t
1267 Pointer to a constant host object.
1276 See also :cpp:func:`simgrid::s4u::Engine::get_all_hosts`.
1278 .. doxygenfunction:: simgrid::s4u::Host::by_name(const std::string &name)
1279 .. doxygenfunction:: simgrid::s4u::Host::by_name_or_null(const std::string &name)
1280 .. doxygenfunction:: simgrid::s4u::Host::current()
1282 .. group-tab:: Python
1284 See also :py:attr:`simgrid.Engine.all_hosts`.
1286 .. automethod:: simgrid.Host.by_name
1287 .. automethod:: simgrid.Host.current
1291 .. doxygenfunction:: sg_host_by_name(const char *name)
1292 .. doxygenfunction:: sg_host_count()
1293 .. doxygenfunction:: sg_host_list()
1295 Modifying characteristics
1296 -------------------------
1302 .. doxygenfunction:: simgrid::s4u::Host::set_core_count(int core_count)
1303 .. doxygenfunction:: simgrid::s4u::Host::set_coordinates(const std::string& coords)
1304 .. doxygenfunction:: simgrid::s4u::Host::set_sharing_policy(SharingPolicy policy, const s4u::NonLinearResourceCb& cb = {})
1306 .. group-tab:: Python
1308 .. autoattribute:: simgrid.Host.core_count
1309 .. automethod:: simgrid.Host.set_coordinates
1310 .. automethod:: simgrid.Host.set_sharing_policy
1319 .. doxygenfunction:: simgrid::s4u::Host::get_cname() const
1320 .. doxygenfunction:: simgrid::s4u::Host::get_core_count() const
1321 .. doxygenfunction:: simgrid::s4u::Host::get_name() const
1322 .. doxygenfunction:: simgrid::s4u::Host::get_available_speed() const
1323 .. doxygenfunction:: simgrid::s4u::Host::get_load() const
1324 .. doxygenfunction:: simgrid::s4u::Host::get_speed() const
1326 .. group-tab:: Python
1328 .. autoattribute:: simgrid.Host.name
1329 .. autoattribute:: simgrid.Host.core_count
1330 .. autoattribute:: simgrid.Host.load
1331 .. autoattribute:: simgrid.Host.pstate
1332 .. autoattribute:: simgrid.Host.speed
1333 .. autoattribute:: simgrid.Host.available_speed
1337 .. doxygenfunction:: sg_host_core_count(const_sg_host_t host)
1338 .. doxygenfunction:: sg_host_get_name(const_sg_host_t host)
1339 .. doxygenfunction:: sg_host_get_load(const_sg_host_t host)
1340 .. doxygenfunction:: sg_host_get_speed(const_sg_host_t host)
1342 User data and properties
1343 ------------------------
1349 .. doxygenfunction:: simgrid::s4u::Host::get_properties() const
1350 .. doxygenfunction:: simgrid::s4u::Host::get_property(const std::string &key) const
1351 .. doxygenfunction:: simgrid::s4u::Host::set_properties(const std::unordered_map< std::string, std::string > &properties)
1352 .. doxygenfunction:: simgrid::s4u::Host::set_property(const std::string &key, const std::string &value)
1356 .. doxygenfunction:: sg_host_set_property_value(sg_host_t host, const char *name, const char *value)
1357 .. doxygenfunction:: sg_host_get_properties(const_sg_host_t host)
1358 .. doxygenfunction:: sg_host_get_property_value(const_sg_host_t host, const char *name)
1359 .. doxygenfunction:: sg_host_extension_create(void(*deleter)(void *))
1360 .. doxygenfunction:: sg_host_extension_get(const_sg_host_t host, size_t rank)
1362 Retrieving components
1363 ---------------------
1369 .. doxygenfunction:: simgrid::s4u::Host::add_disk(const Disk *disk)
1370 .. doxygenfunction:: simgrid::s4u::Host::get_actor_count() const
1371 .. doxygenfunction:: simgrid::s4u::Host::get_all_actors() const
1372 .. doxygenfunction:: simgrid::s4u::Host::get_disks() const
1373 .. doxygenfunction:: simgrid::s4u::Host::remove_disk(const std::string &disk_name)
1375 .. group-tab:: Python
1377 .. automethod:: simgrid.Host.get_disks
1381 .. doxygenfunction:: sg_host_get_actor_list(const_sg_host_t host, xbt_dynar_t whereto)
1390 .. doxygenfunction:: simgrid::s4u::Host::is_on() const
1391 .. doxygenfunction:: simgrid::s4u::Host::turn_off()
1392 .. doxygenfunction:: simgrid::s4u::Host::turn_on()
1396 .. doxygenfunction:: sg_host_is_on(const_sg_host_t host)
1397 .. doxygenfunction:: sg_host_turn_off(sg_host_t host)
1398 .. doxygenfunction:: sg_host_turn_on(sg_host_t host)
1407 .. doxygenfunction:: simgrid::s4u::Host::get_pstate() const
1408 .. doxygenfunction:: simgrid::s4u::Host::get_pstate_count() const
1409 .. doxygenfunction:: simgrid::s4u::Host::get_pstate_speed(unsigned long pstate_index) const
1410 .. doxygenfunction:: simgrid::s4u::Host::set_pstate(unsigned long pstate_index)
1412 .. group-tab:: Python
1414 .. autoattribute:: simgrid.Host.pstate_count
1415 .. automethod:: simgrid.Host.pstate_speed
1419 .. doxygenfunction:: sg_host_get_available_speed(const_sg_host_t host)
1420 .. doxygenfunction:: sg_host_get_nb_pstates(const_sg_host_t host)
1421 .. doxygenfunction:: sg_host_get_pstate(const_sg_host_t host)
1422 .. doxygenfunction:: sg_host_get_pstate_speed(const_sg_host_t host, unsigned long pstate_index)
1423 .. doxygenfunction:: sg_host_set_pstate(sg_host_t host, unsigned long pstate)
1432 .. doxygenfunction:: simgrid::s4u::Host::set_speed_profile(kernel::profile::Profile *p)
1433 .. doxygenfunction:: simgrid::s4u::Host::set_state_profile(kernel::profile::Profile *p)
1435 .. group-tab:: Python
1437 .. automethod:: simgrid.Host.set_speed_profile
1438 .. automethod:: simgrid.Host.set_state_profile
1447 .. doxygenfunction:: simgrid::s4u::Host::exec_async
1448 .. doxygenfunction:: simgrid::s4u::Host::execute(double flops) const
1449 .. doxygenfunction:: simgrid::s4u::Host::execute(double flops, double priority) const
1451 Platform and routing
1452 --------------------
1454 You can also start direct communications between two arbitrary hosts
1455 using :cpp:func:`Comm::sendto() <simgrid::s4u::Comm::sendto()>`.
1461 .. doxygenfunction:: simgrid::s4u::Host::get_englobing_zone() const
1462 .. doxygenfunction:: simgrid::s4u::Host::get_netpoint() const
1463 .. doxygenfunction:: simgrid::s4u::Host::route_to(const Host *dest, std::vector< Link * > &links, double *latency) const
1464 .. doxygenfunction:: simgrid::s4u::Host::route_to(const Host *dest, std::vector< kernel::resource::StandardLinkImpl * > &links, double *latency) const
1465 .. doxygenfunction:: simgrid::s4u::Host::create_disk(const std::string& name, double read_bandwidth, double write_bandwidth)
1466 .. doxygenfunction:: simgrid::s4u::Host::create_disk(const std::string& name, const std::string& read_bandwidth, const std::string& write_bandwidth)
1468 .. group-tab:: Python
1470 .. autoattribute:: simgrid.Host.netpoint
1471 .. automethod:: simgrid.Host.create_disk
1473 .. automethod:: simgrid.Host.route_to
1477 .. doxygenfunction:: sg_host_get_route(const_sg_host_t from, const_sg_host_t to, xbt_dynar_t links)
1478 .. doxygenfunction:: sg_host_get_route_bandwidth(const_sg_host_t from, const_sg_host_t to)
1479 .. doxygenfunction:: sg_host_get_route_latency(const_sg_host_t from, const_sg_host_t to)
1480 .. doxygenfunction:: sg_host_sendto(sg_host_t from, sg_host_t to, double byte_amount)
1489 .. doxygenfunction:: simgrid::s4u::Host::on_creation_cb
1490 .. doxygenfunction:: simgrid::s4u::Host::on_destruction_cb
1491 .. doxygenfunction:: simgrid::s4u::Host::on_speed_change_cb
1492 .. doxygenfunction:: simgrid::s4u::Host::on_state_change_cb
1504 .. doxygenclass:: simgrid::s4u::Link
1505 .. doxygenclass:: simgrid::s4u::SplitDuplexLink
1506 .. doxygenclass:: simgrid::s4u::LinkInRoute
1509 .. group-tab:: Python
1511 .. autoclass:: simgrid.Link
1522 #include <simgrid/s4u/Link.hpp>
1524 Note that there is no LinkPtr type and that you cannot use the RAII
1525 idiom on hosts because SimGrid does not allow (yet) to create nor
1526 destroy resources once the simulation is started.
1528 .. doxygenfunction:: simgrid::s4u::Link::seal()
1530 .. group-tab:: Python
1534 from simgrid import Link
1536 .. automethod:: simgrid.Link.seal
1542 #include <simgrid/link.h>
1544 .. doxygentypedef:: sg_link_t
1545 .. cpp:type:: const s4u_Link* const_sg_link_t
1547 Pointer to a constant link object.
1556 See also :cpp:func:`simgrid::s4u::Engine::get_all_links`.
1558 .. doxygenfunction:: simgrid::s4u::Link::by_name(const std::string &name)
1559 .. doxygenfunction:: simgrid::s4u::Link::by_name_or_null(const std::string &name)
1561 .. group-tab:: Python
1563 See also :py:attr:`simgrid.Engine.all_links`.
1565 .. automethod:: simgrid.Link.by_name
1566 .. autoattribute:: simgrid.Link.name
1570 .. doxygenfunction:: sg_link_by_name(const char *name)
1571 .. doxygenfunction:: sg_link_count()
1572 .. doxygenfunction:: sg_link_list()
1581 .. doxygenfunction:: simgrid::s4u::Link::get_bandwidth() const
1582 .. doxygenfunction:: simgrid::s4u::Link::get_cname() const
1583 .. doxygenfunction:: simgrid::s4u::Link::get_latency() const
1584 .. doxygenfunction:: simgrid::s4u::Link::get_name() const
1585 .. doxygenfunction:: simgrid::s4u::Link::get_sharing_policy() const
1586 .. doxygenfunction:: simgrid::s4u::Link::get_usage() const
1587 .. doxygenfunction:: simgrid::s4u::Link::is_used() const
1589 .. group-tab:: Python
1591 .. autoattribute:: simgrid.Link.bandwidth
1592 .. autoattribute:: simgrid.Link.latency
1596 .. doxygenfunction:: sg_link_get_bandwidth(const_sg_link_t link)
1597 .. doxygenfunction:: sg_link_get_latency(const_sg_link_t link)
1598 .. doxygenfunction:: sg_link_get_name(const_sg_link_t link)
1599 .. doxygenfunction:: sg_link_is_shared(const_sg_link_t link)
1601 Modifying characteristics
1602 -------------------------
1608 .. doxygenfunction:: simgrid::s4u::Link::set_bandwidth(double value)
1609 .. doxygenfunction:: simgrid::s4u::Link::set_latency(double value)
1610 .. doxygenfunction:: simgrid::s4u::Link::set_latency(const std::string& value)
1611 .. doxygenfunction:: simgrid::s4u::Link::set_concurrency_limit(int limit)
1612 .. doxygenfunction:: simgrid::s4u::Link::set_sharing_policy(SharingPolicy policy, const NonLinearResourceCb& cb = {})
1614 .. group-tab:: Python
1616 .. automethod:: simgrid.Link.set_bandwidth
1617 .. automethod:: simgrid.Link.set_latency
1618 .. automethod:: simgrid.Link.set_concurrency_limit
1619 .. automethod:: simgrid.Link.set_sharing_policy
1623 .. doxygenfunction:: sg_link_set_bandwidth(sg_link_t link, double value)
1624 .. doxygenfunction:: sg_link_set_latency(sg_link_t link, double value)
1626 User data and properties
1627 ------------------------
1633 .. doxygenfunction:: simgrid::s4u::Link::get_property(const std::string &key) const
1634 .. doxygenfunction:: simgrid::s4u::Link::set_property(const std::string &key, const std::string &value)
1638 .. doxygenfunction:: sg_link_get_data(const_sg_link_t link)
1639 .. doxygenfunction:: sg_link_set_data(sg_link_t link, void *data)
1648 See also :cpp:func:`simgrid::s4u::Link::set_state_profile`.
1650 .. doxygenfunction:: simgrid::s4u::Link::is_on() const
1651 .. doxygenfunction:: simgrid::s4u::Link::turn_off()
1652 .. doxygenfunction:: simgrid::s4u::Link::turn_on()
1654 .. group-tab:: Python
1656 See also :py:func:`simgrid.Link.set_state_profile`.
1658 .. automethod:: simgrid.Link.is_on
1659 .. automethod:: simgrid.Link.turn_off
1660 .. automethod:: simgrid.Link.turn_on
1665 See :ref:`howto_churn` for more details.
1671 .. doxygenfunction:: simgrid::s4u::Link::set_bandwidth_profile(kernel::profile::Profile *profile)
1672 .. doxygenfunction:: simgrid::s4u::Link::set_latency_profile(kernel::profile::Profile *profile)
1673 .. doxygenfunction:: simgrid::s4u::Link::set_state_profile(kernel::profile::Profile *profile)
1675 .. group-tab:: Python
1677 .. automethod:: simgrid.Link.set_bandwidth_profile
1678 .. automethod:: simgrid.Link.set_latency_profile
1679 .. automethod:: simgrid.Link.set_state_profile
1688 .. doxygenfunction:: simgrid::s4u::Link::set_host_wifi_rate
1690 .. group-tab:: Python
1692 .. automethod:: simgrid.Link.set_host_wifi_rate
1701 .. doxygenfunction:: simgrid::s4u::Link::on_bandwidth_change_cb
1702 .. doxygenfunction:: simgrid::s4u::Link::on_communication_state_change_cb
1703 .. doxygenfunction:: simgrid::s4u::Link::on_creation_cb
1704 .. doxygenfunction:: simgrid::s4u::Link::on_destruction_cb
1705 .. doxygenfunction:: simgrid::s4u::Link::on_state_change_cb
1707 .. _API_s4u_NetZone:
1717 .. doxygenclass:: simgrid::s4u::NetZone
1719 .. group-tab:: Python
1721 .. autoclass:: simgrid.NetZone
1732 #include <simgrid/s4u/NetZone.hpp>
1734 Note that there is no NetZonePtr type and that you cannot use the RAII
1735 idiom on network zones because SimGrid does not allow (yet) to create nor
1736 destroy resources once the simulation is started.
1738 .. doxygenfunction:: simgrid::s4u::NetZone::seal
1740 .. group-tab:: Python
1744 from simgrid import NetZone
1746 .. automethod:: simgrid.NetZone.seal
1752 #include <simgrid/zone.h>
1754 .. doxygentypedef:: sg_netzone_t
1755 .. cpp:type:: const s4u_NetZone* const_sg_netzone_t
1757 Pointer to a constant network zone object.
1766 See :cpp:func:`simgrid::s4u::Engine::get_netzone_root`,
1767 :cpp:func:`simgrid::s4u::Engine::netzone_by_name_or_null` and
1768 :cpp:func:`simgrid::s4u::Engine::get_filtered_netzones`.
1772 .. doxygenfunction:: sg_zone_get_by_name(const char *name)
1773 .. doxygenfunction:: sg_zone_get_root()
1782 .. doxygenfunction:: simgrid::s4u::NetZone::get_cname() const
1783 .. doxygenfunction:: simgrid::s4u::NetZone::get_name() const
1784 .. doxygenfunction:: simgrid::s4u::NetZone::get_netpoint()
1786 .. group-tab:: Python
1788 .. autoattribute:: simgrid.NetZone.name
1789 .. autoattribute:: simgrid.NetZone.netpoint
1793 .. doxygenfunction:: sg_zone_get_name(const_sg_netzone_t zone)
1795 User data and properties
1796 ------------------------
1802 .. doxygenfunction:: simgrid::s4u::NetZone::get_properties() const
1803 .. doxygenfunction:: simgrid::s4u::NetZone::get_property(const std::string &key) const
1804 .. doxygenfunction:: simgrid::s4u::NetZone::set_property(const std::string &key, const std::string &value)
1806 .. group-tab:: Python
1808 .. automethod:: simgrid.NetZone.set_property
1812 .. doxygenfunction:: sg_zone_get_property_value(const_sg_netzone_t as, const char *name)
1813 .. doxygenfunction:: sg_zone_set_property_value(sg_netzone_t netzone, const char *name, const char *value)
1815 Retrieving components
1816 ---------------------
1822 .. doxygenfunction:: simgrid::s4u::NetZone::get_all_hosts() const
1823 .. doxygenfunction:: simgrid::s4u::NetZone::get_host_count() const
1827 .. doxygenfunction:: sg_zone_get_hosts(const_sg_netzone_t zone, xbt_dynar_t whereto)
1836 .. doxygenfunction:: simgrid::s4u::NetZone::add_component(kernel::routing::NetPoint *elm)
1837 .. doxygenfunction:: simgrid::s4u::NetZone::add_route
1838 .. doxygenfunction:: simgrid::s4u::NetZone::add_bypass_route
1839 .. doxygenfunction:: simgrid::s4u::NetZone::get_children() const
1840 .. doxygenfunction:: simgrid::s4u::NetZone::get_parent() const
1841 .. doxygenfunction:: simgrid::s4u::NetZone::set_parent(const NetZone* parent)
1843 .. group-tab:: Python
1845 .. automethod:: simgrid.NetZone.add_route
1846 .. automethod:: simgrid.NetZone.set_parent
1850 .. doxygenfunction:: sg_zone_get_sons(const_sg_netzone_t zone, xbt_dict_t whereto)
1859 .. doxygenfunction:: simgrid::s4u::NetZone::on_creation_cb
1860 .. doxygenfunction:: simgrid::s4u::NetZone::on_seal_cb
1871 .. doxygenfunction:: simgrid::s4u::create_full_zone(const std::string& name)
1872 .. doxygenfunction:: simgrid::s4u::create_empty_zone(const std::string& name)
1873 .. doxygenfunction:: simgrid::s4u::create_star_zone(const std::string& name)
1874 .. doxygenfunction:: simgrid::s4u::create_dijkstra_zone(const std::string& name, bool cache)
1875 .. doxygenfunction:: simgrid::s4u::create_floyd_zone(const std::string& name)
1876 .. doxygenfunction:: simgrid::s4u::create_vivaldi_zone(const std::string& name)
1877 .. doxygenfunction:: simgrid::s4u::create_wifi_zone(const std::string& name)
1878 .. doxygenfunction:: simgrid::s4u::create_torus_zone
1879 .. doxygenfunction:: simgrid::s4u::create_fatTree_zone(const std::string& name, const NetZone* parent, const FatTreeParams& parameters, const ClusterCallbacks& set_callbacks, double bandwidth, double latency, Link::SharingPolicy sharing_policy)
1880 .. doxygenfunction:: simgrid::s4u::create_dragonfly_zone(const std::string& name, const NetZone* parent, const DragonflyParams& parameters, const ClusterCallbacks& set_callbacks, double bandwidth, double latency, Link::SharingPolicy sharing_policy)
1882 .. group-tab:: Python
1884 .. automethod:: simgrid.NetZone.create_full_zone
1885 .. automethod:: simgrid.NetZone.create_empty_zone
1886 .. automethod:: simgrid.NetZone.create_star_zone
1887 .. automethod:: simgrid.NetZone.create_dijkstra_zone
1888 .. automethod:: simgrid.NetZone.create_floyd_zone
1889 .. automethod:: simgrid.NetZone.create_vivaldi_zone
1890 .. automethod:: simgrid.NetZone.create_wifi_zone
1891 .. automethod:: simgrid.NetZone.create_torus_zone
1892 .. automethod:: simgrid.NetZone.create_fatTree_zone
1893 .. automethod:: simgrid.NetZone.create_dragonfly_zone
1902 .. doxygenfunction:: simgrid::s4u::NetZone::create_host(const std::string& name, const std::vector<double>& speed_per_pstate)
1903 .. doxygenfunction:: simgrid::s4u::NetZone::create_host(const std::string& name, double speed)
1904 .. doxygenfunction:: simgrid::s4u::NetZone::create_host(const std::string& name, const std::vector<std::string>& speed_per_pstate)
1905 .. doxygenfunction:: simgrid::s4u::NetZone::create_host(const std::string& name, const std::string& speed)
1907 .. group-tab:: Python
1909 .. automethod:: simgrid.NetZone.create_host
1918 .. doxygenfunction:: simgrid::s4u::NetZone::create_link(const std::string& name, const std::vector<double>& bandwidths)
1919 .. doxygenfunction:: simgrid::s4u::NetZone::create_link(const std::string& name, double bandwidth)
1920 .. doxygenfunction:: simgrid::s4u::NetZone::create_link(const std::string& name, const std::vector<std::string>& bandwidthds)
1921 .. doxygenfunction:: simgrid::s4u::NetZone::create_link(const std::string& name, const std::string& bandwidth)
1922 .. doxygenfunction:: simgrid::s4u::NetZone::create_split_duplex_link(const std::string& name, const std::string& bandwidth)
1923 .. doxygenfunction:: simgrid::s4u::NetZone::create_split_duplex_link(const std::string& name, double bandwidth)
1925 .. group-tab:: Python
1927 .. automethod:: simgrid.NetZone.create_link
1928 .. automethod:: simgrid.NetZone.create_split_duplex_link
1937 .. doxygenfunction:: simgrid::s4u::NetZone::create_router(const std::string& name)
1939 .. group-tab:: Python
1941 .. automethod:: simgrid.NetZone.create_router
1943 .. _API_s4u_VirtualMachine:
1945 =======================
1946 class VirtualMachine
1947 =======================
1950 .. doxygenclass:: simgrid::s4u::VirtualMachine
1960 #include <simgrid/s4u/VirtualMachine.hpp>
1962 Note that there is no VirtualMachinePtr type, and that you cannot use the RAII
1963 idiom on virtual machines. There is no good reason for that and should change in the future.
1969 #include <simgrid/vm.h>
1971 .. doxygentypedef:: sg_vm_t
1972 .. cpp:type:: const s4u_VirtualMachine* const_sg_vm_t
1974 Pointer to a constant virtual machine object.
1983 .. doxygenfunction:: simgrid::s4u::Host::create_vm(const std::string &name, int core_amount)
1984 .. doxygenfunction:: simgrid::s4u::Host::create_vm(const std::string &name, int core_amount, size_t ramsize)
1985 .. doxygenfunction:: simgrid::s4u::VirtualMachine::destroy
1989 .. doxygenfunction:: sg_vm_create_core
1990 .. doxygenfunction:: sg_vm_create_multicore
1991 .. doxygenfunction:: sg_vm_destroy
2000 .. doxygenfunction:: simgrid::s4u::VirtualMachine::get_pm() const
2001 .. doxygenfunction:: simgrid::s4u::VirtualMachine::get_ramsize() const
2002 .. doxygenfunction:: simgrid::s4u::VirtualMachine::get_state() const
2004 .. doxygenfunction:: simgrid::s4u::VirtualMachine::set_bound(double bound)
2005 .. doxygenfunction:: simgrid::s4u::VirtualMachine::set_pm(Host *pm)
2006 .. doxygenfunction:: simgrid::s4u::VirtualMachine::set_ramsize(size_t ramsize)
2010 .. doxygenfunction:: sg_vm_get_ramsize(const_sg_vm_t vm)
2011 .. doxygenfunction:: sg_vm_set_bound(sg_vm_t vm, double bound)
2012 .. doxygenfunction:: sg_vm_set_ramsize(sg_vm_t vm, size_t size)
2014 .. doxygenfunction:: sg_vm_get_name
2015 .. doxygenfunction:: sg_vm_get_pm
2016 .. doxygenfunction:: sg_vm_is_created
2017 .. doxygenfunction:: sg_vm_is_running
2018 .. doxygenfunction:: sg_vm_is_suspended
2027 .. doxygenfunction:: simgrid::s4u::VirtualMachine::resume()
2028 .. doxygenfunction:: simgrid::s4u::VirtualMachine::shutdown()
2029 .. doxygenfunction:: simgrid::s4u::VirtualMachine::start()
2030 .. doxygenfunction:: simgrid::s4u::VirtualMachine::suspend()
2034 .. doxygenfunction:: sg_vm_start
2035 .. doxygenfunction:: sg_vm_suspend
2036 .. doxygenfunction:: sg_vm_resume
2037 .. doxygenfunction:: sg_vm_shutdown
2046 .. doxygenfunction:: simgrid::s4u::VirtualMachine::on_creation_cb
2047 .. doxygenfunction:: simgrid::s4u::VirtualMachine::on_destruction_cb
2048 .. doxygenfunction:: simgrid::s4u::VirtualMachine::on_migration_end_cb
2049 .. doxygenfunction:: simgrid::s4u::VirtualMachine::on_migration_start_cb
2050 .. doxygenfunction:: simgrid::s4u::VirtualMachine::on_resume_cb
2051 .. doxygenfunction:: simgrid::s4u::VirtualMachine::on_shutdown_cb
2052 .. doxygenfunction:: simgrid::s4u::VirtualMachine::on_start_cb
2053 .. doxygenfunction:: simgrid::s4u::VirtualMachine::on_started_cb
2054 .. doxygenfunction:: simgrid::s4u::VirtualMachine::on_suspend_cb
2056 .. _API_s4u_Activity:
2066 .. doxygenclass:: simgrid::s4u::Activity
2068 **Known subclasses:**
2069 :ref:`Communications <API_s4u_Comm>` (started on Mailboxes and consuming links),
2070 :ref:`Executions <API_s4u_Exec>` (started on Host and consuming CPU resources)
2071 :ref:`I/O <API_s4u_Io>` (started on and consuming disks).
2072 See also the :ref:`section on activities <s4u_Activities>` above.
2083 #include <simgrid/s4u/Activity.hpp>
2085 .. doxygentypedef:: ActivityPtr
2094 .. doxygenfunction:: simgrid::s4u::Activity::get_cname
2095 .. doxygenfunction:: simgrid::s4u::Activity::get_name
2096 .. doxygenfunction:: simgrid::s4u::Activity::get_remaining() const
2097 .. doxygenfunction:: simgrid::s4u::Activity::get_state() const
2098 .. doxygenfunction:: simgrid::s4u::Activity::set_remaining(double remains)
2099 .. doxygenfunction:: simgrid::s4u::Activity::set_state(Activity::State state)
2102 Activities life cycle
2103 ---------------------
2109 .. doxygenfunction:: simgrid::s4u::Activity::start
2110 .. doxygenfunction:: simgrid::s4u::Activity::cancel
2111 .. doxygenfunction:: simgrid::s4u::Activity::test
2112 .. doxygenfunction:: simgrid::s4u::Activity::wait
2113 .. doxygenfunction:: simgrid::s4u::Activity::wait_for
2114 .. doxygenfunction:: simgrid::s4u::Activity::wait_until(double time_limit)
2115 .. doxygenfunction:: simgrid::s4u::Activity::vetoable_start()
2117 Suspending and resuming an activity
2118 -----------------------------------
2124 .. doxygenfunction:: simgrid::s4u::Activity::suspend
2125 .. doxygenfunction:: simgrid::s4u::Activity::resume
2126 .. doxygenfunction:: simgrid::s4u::Activity::is_suspended
2135 .. doxygenfunction:: simgrid::s4u::Activity::on_completion_cb
2136 .. doxygenfunction:: simgrid::s4u::Activity::on_suspend_cb
2137 .. doxygenfunction:: simgrid::s4u::Activity::on_resume_cb
2149 .. doxygenclass:: simgrid::s4u::Comm
2151 .. group-tab:: Python
2153 .. autoclass:: simgrid.Comm
2164 #include <simgrid/s4u/Comm.hpp>
2166 .. doxygentypedef:: CommPtr
2168 .. group-tab:: Python
2172 from simgrid import Comm
2178 #include <simgrid/comm.h>
2180 .. doxygentypedef:: sg_comm_t
2189 .. doxygenfunction:: simgrid::s4u::Comm::get_dst_data_size() const
2190 .. doxygenfunction:: simgrid::s4u::Comm::get_mailbox() const
2191 .. doxygenfunction:: simgrid::s4u::Comm::get_sender() const
2192 .. doxygenfunction:: simgrid::s4u::Comm::set_dst_data(void **buff)
2193 .. doxygenfunction:: simgrid::s4u::Comm::set_dst_data(void **buff, size_t size)
2194 .. doxygenfunction:: simgrid::s4u::Comm::detach()
2195 .. doxygenfunction:: simgrid::s4u::Comm::detach(const std::function<void(void*)>& clean_function)
2196 .. doxygenfunction:: simgrid::s4u::Comm::set_payload_size(uint64_t bytes)
2197 .. doxygenfunction:: simgrid::s4u::Comm::set_rate(double rate)
2198 .. doxygenfunction:: simgrid::s4u::Comm::set_src_data(void *buff)
2199 .. doxygenfunction:: simgrid::s4u::Comm::set_src_data(void *buff, size_t size)
2200 .. doxygenfunction:: simgrid::s4u::Comm::set_src_data_size(size_t size)
2202 .. group-tab:: Python
2204 .. autoattribute:: simgrid.Comm.dst_data_size
2205 .. autoattribute:: simgrid.Comm.mailbox
2206 .. autoattribute:: simgrid.Comm.sender
2207 .. autoattribute:: simgrid.Comm.state_str
2208 .. automethod:: simgrid.Comm.detach
2209 .. automethod:: simgrid.Comm.set_payload_size
2210 .. automethod:: simgrid.Comm.set_rate
2211 .. automethod:: simgrid.Comm.detach
2216 Most communications are created using :ref:`s4u_mailbox`, but you can
2217 also start direct communications as shown below.
2223 .. doxygenfunction:: simgrid::s4u::Comm::sendto
2224 .. doxygenfunction:: simgrid::s4u::Comm::sendto_init()
2225 .. doxygenfunction:: simgrid::s4u::Comm::sendto_init(Host *from, Host *to)
2226 .. doxygenfunction:: simgrid::s4u::Comm::sendto_async
2228 .. doxygenfunction:: simgrid::s4u::Comm::cancel
2229 .. doxygenfunction:: simgrid::s4u::Comm::start
2230 .. doxygenfunction:: simgrid::s4u::Comm::test
2231 .. doxygenfunction:: simgrid::s4u::Comm::test_any(const std::vector< CommPtr >& comms)
2232 .. doxygenfunction:: simgrid::s4u::Comm::wait
2233 .. doxygenfunction:: simgrid::s4u::Comm::wait_all(const std::vector< CommPtr >& comms)
2234 .. doxygenfunction:: simgrid::s4u::Comm::wait_all_for(const std::vector< CommPtr >& comms, double timeout)
2235 .. doxygenfunction:: simgrid::s4u::Comm::wait_any(const std::vector< CommPtr >& comms)
2236 .. doxygenfunction:: simgrid::s4u::Comm::wait_any_for(const std::vector< CommPtr >& comms, double timeout)
2237 .. doxygenfunction:: simgrid::s4u::Comm::wait_for
2238 .. doxygenfunction:: simgrid::s4u::Comm::wait_until
2240 .. group-tab:: Python
2242 .. automethod:: simgrid.Comm.sendto
2243 .. automethod:: simgrid.Comm.sendto_init
2244 .. automethod:: simgrid.Comm.sendto_async
2246 .. automethod:: simgrid.Comm.cancel
2247 .. automethod:: simgrid.Comm.start
2248 .. automethod:: simgrid.Comm.test
2249 .. automethod:: simgrid.Comm.test_any
2250 .. automethod:: simgrid.Comm.wait
2251 .. automethod:: simgrid.Comm.wait_for
2252 .. automethod:: simgrid.Comm.wait_all
2253 .. automethod:: simgrid.Comm.wait_all_for
2254 .. automethod:: simgrid.Comm.wait_any
2255 .. automethod:: simgrid.Comm.wait_any_for
2256 .. automethod:: simgrid.Comm.wait_until
2260 .. doxygenfunction:: sg_comm_test
2261 .. doxygenfunction:: sg_comm_wait
2262 .. doxygenfunction:: sg_comm_wait_all
2263 .. doxygenfunction:: sg_comm_wait_any
2272 .. doxygenfunction:: simgrid::s4u::Comm::on_start_cb
2273 .. doxygenfunction:: simgrid::s4u::Comm::on_completion_cb
2274 .. doxygenfunction:: simgrid::s4u::Comm::on_recv_cb
2275 .. doxygenfunction:: simgrid::s4u::Comm::on_send_cb
2287 .. doxygenclass:: simgrid::s4u::Exec
2289 .. group-tab:: Python
2291 .. autoclass:: simgrid.Exec
2302 #include <simgrid/s4u/Exec.hpp>
2304 .. doxygentypedef:: ExecPtr
2306 .. group-tab:: Python
2310 from simgrid import Exec
2316 #include <simgrid/exec.h>
2318 .. doxygentypedef:: sg_exec_t
2319 .. doxygentypedef:: const_sg_exec_t
2328 .. doxygenfunction:: simgrid::s4u::Exec::get_cost() const
2329 .. doxygenfunction:: simgrid::s4u::Exec::get_finish_time() const
2330 .. doxygenfunction:: simgrid::s4u::Exec::get_host() const
2331 .. doxygenfunction:: simgrid::s4u::Exec::get_host_number() const
2332 .. doxygenfunction:: simgrid::s4u::Exec::get_remaining
2333 .. doxygenfunction:: simgrid::s4u::Exec::get_remaining_ratio
2334 .. doxygenfunction:: simgrid::s4u::Exec::get_start_time() const
2335 .. doxygenfunction:: simgrid::s4u::Exec::set_bound(double bound)
2336 .. doxygenfunction:: simgrid::s4u::Exec::set_host
2337 .. doxygenfunction:: simgrid::s4u::Exec::set_priority(double priority)
2339 .. group-tab:: Python
2341 .. autoattribute:: simgrid.Exec.host
2342 .. autoattribute:: simgrid.Exec.remaining
2343 .. autoattribute:: simgrid.Exec.remaining_ratio
2347 .. doxygenfunction:: sg_exec_set_bound(sg_exec_t exec, double bound)
2348 .. doxygenfunction:: sg_exec_get_name(const_sg_exec_t exec)
2349 .. doxygenfunction:: sg_exec_set_name(sg_exec_t exec, const char* name)
2350 .. doxygenfunction:: sg_exec_set_host(sg_exec_t exec, sg_host_t new_host)
2351 .. doxygenfunction:: sg_exec_get_remaining(const_sg_exec_t exec)
2352 .. doxygenfunction:: sg_exec_get_remaining_ratio(const_sg_exec_t exec)
2361 .. doxygenfunction:: simgrid::s4u::Exec::cancel
2362 .. doxygenfunction:: simgrid::s4u::Exec::start
2363 .. doxygenfunction:: simgrid::s4u::Exec::test
2364 .. doxygenfunction:: simgrid::s4u::Exec::wait
2365 .. doxygenfunction:: simgrid::s4u::Exec::wait_any(const std::vector< ExecPtr >& execs)
2366 .. doxygenfunction:: simgrid::s4u::Exec::wait_any_for(const std::vector< ExecPtr >& execs, double timeout)
2367 .. doxygenfunction:: simgrid::s4u::Exec::wait_for
2369 .. group-tab:: Python
2371 .. automethod:: simgrid.Exec.cancel
2372 .. automethod:: simgrid.Exec.start
2373 .. automethod:: simgrid.Exec.test
2374 .. automethod:: simgrid.Exec.wait
2378 .. doxygenfunction:: sg_exec_start(sg_exec_t exec)
2379 .. doxygenfunction:: sg_exec_cancel(sg_exec_t exec);
2380 .. doxygenfunction:: sg_exec_test(sg_exec_t exec);
2381 .. doxygenfunction:: sg_exec_wait(sg_exec_t exec);
2382 .. doxygenfunction:: sg_exec_wait_for(sg_exec_t exec, double timeout);
2383 .. doxygenfunction:: sg_exec_wait_any_for(sg_exec_t* execs, size_t count, double timeout);
2384 .. doxygenfunction:: sg_exec_wait_any(sg_exec_t* execs, size_t count);
2393 .. doxygenfunction:: simgrid::s4u::Exec::on_start_cb
2394 .. doxygenfunction:: simgrid::s4u::Exec::on_completion_cb
2406 .. doxygenclass:: simgrid::s4u::Io
2408 .. group-tab:: Python
2410 .. autoclass:: simgrid.Io
2421 #include <simgrid/s4u/Io.hpp>
2423 .. doxygentypedef:: IoPtr
2432 .. doxygenfunction:: simgrid::s4u::Io::get_performed_ioops() const
2433 .. doxygenfunction:: simgrid::s4u::Io::get_remaining
2442 .. doxygenfunction:: simgrid::s4u::Io::cancel
2443 .. doxygenfunction:: simgrid::s4u::Io::start
2444 .. doxygenfunction:: simgrid::s4u::Io::test
2445 .. doxygenfunction:: simgrid::s4u::Io::wait
2446 .. doxygenfunction:: simgrid::s4u::Io::wait_for
2447 .. doxygenfunction:: simgrid::s4u::Io::wait_any(const std::vector<IoPtr> &ios)
2448 .. doxygenfunction:: simgrid::s4u::Io::wait_any_for(const std::vector<IoPtr> &ios, double timeout)
2450 .. group-tab:: Python
2452 .. automethod:: simgrid.Io.test
2453 .. automethod:: simgrid.Io.wait
2454 .. automethod:: simgrid.Io.wait_any_for
2455 .. automethod:: simgrid.Io.wait_any
2464 .. doxygenfunction:: simgrid::s4u::Io::on_start_cb
2465 .. doxygenfunction:: simgrid::s4u::Io::on_completion_cb
2467 .. _API_s4u_Synchronizations:
2469 =======================
2470 Synchronization Objects
2471 =======================
2483 .. doxygenclass:: simgrid::s4u::Mutex
2485 .. group-tab:: Python
2487 .. autoclass:: simgrid.Mutex
2498 #include <simgrid/s4u/Mutex.hpp>
2500 .. doxygentypedef:: MutexPtr
2502 .. doxygenfunction:: simgrid::s4u::Mutex::create()
2504 .. group-tab:: Python
2506 .. code-block:: Python
2508 from simgrid import Mutex
2511 # Use a context manager to acquire and automatically release the mutex
2512 # when leaving the scope.
2514 # Access shared resource ...
2517 .. automethod:: simgrid.Mutex.__init__
2523 #include <simgrid/mutex.h>
2525 .. doxygentypedef:: sg_mutex_t
2526 .. cpp:type:: const s4u_Mutex* const_sg_mutex_t
2528 Pointer to a constant mutex object.
2530 .. doxygenfunction:: sg_mutex_init()
2531 .. doxygenfunction:: sg_mutex_destroy(const_sg_mutex_t mutex)
2540 .. doxygenfunction:: simgrid::s4u::Mutex::lock()
2541 .. doxygenfunction:: simgrid::s4u::Mutex::try_lock()
2542 .. doxygenfunction:: simgrid::s4u::Mutex::unlock()
2544 .. group-tab:: Python
2546 .. automethod:: simgrid.Mutex.lock
2547 .. automethod:: simgrid.Mutex.try_lock
2548 .. automethod:: simgrid.Mutex.unlock
2552 .. doxygenfunction:: sg_mutex_lock(sg_mutex_t mutex)
2553 .. doxygenfunction:: sg_mutex_try_lock(sg_mutex_t mutex)
2554 .. doxygenfunction:: sg_mutex_unlock(sg_mutex_t mutex)
2556 .. _API_s4u_Barrier:
2566 .. doxygenclass:: simgrid::s4u::Barrier
2568 .. group-tab:: Python
2570 .. autoclass:: simgrid.Barrier
2578 #include <simgrid/s4u/Barrier.hpp>
2580 .. doxygentypedef:: BarrierPtr
2582 .. doxygenfunction:: simgrid::s4u::Barrier::create(unsigned int expected_actors)
2583 .. doxygenfunction:: simgrid::s4u::Barrier::wait()
2585 .. group-tab:: Python
2587 .. code-block:: Python
2589 from simgrid import Barrier
2590 barrier = Barrier(2)
2592 .. automethod:: simgrid.Barrier.__init__
2593 .. automethod:: simgrid.Barrier.wait
2599 #include <simgrid/barrier.hpp>
2601 .. doxygentypedef:: sg_bar_t
2603 .. doxygenfunction:: sg_barrier_init(unsigned int count)
2604 .. doxygenfunction:: sg_barrier_destroy(sg_bar_t bar)
2605 .. doxygenfunction:: sg_barrier_wait(sg_bar_t bar)
2608 .. _API_s4u_ConditionVariable:
2610 ==========================
2611 Condition variable
2612 ==========================
2614 .. doxygenclass:: simgrid::s4u::ConditionVariable
2625 #include <simgrid/s4u/ConditionVariable.hpp>
2627 .. doxygentypedef:: ConditionVariablePtr
2629 .. doxygenfunction:: simgrid::s4u::ConditionVariable::create()
2635 #include <simgrid/cond.h>
2637 .. doxygentypedef:: sg_cond_t
2638 .. doxygentypedef:: const_sg_cond_t
2639 .. doxygenfunction:: sg_cond_init
2640 .. doxygenfunction:: sg_cond_destroy
2642 Waiting and notifying
2643 ---------------------
2649 .. doxygenfunction:: simgrid::s4u::ConditionVariable::notify_all()
2650 .. doxygenfunction:: simgrid::s4u::ConditionVariable::notify_one()
2651 .. doxygenfunction:: simgrid::s4u::ConditionVariable::wait(s4u::MutexPtr lock)
2652 .. doxygenfunction:: simgrid::s4u::ConditionVariable::wait(const std::unique_lock< s4u::Mutex > &lock)
2653 .. doxygenfunction:: simgrid::s4u::ConditionVariable::wait(const std::unique_lock< Mutex > &lock, P pred)
2654 .. doxygenfunction:: simgrid::s4u::ConditionVariable::wait_for(const std::unique_lock< s4u::Mutex > &lock, double duration)
2655 .. doxygenfunction:: simgrid::s4u::ConditionVariable::wait_for(const std::unique_lock< s4u::Mutex > &lock, double duration, P pred)
2656 .. doxygenfunction:: simgrid::s4u::ConditionVariable::wait_for(const std::unique_lock< s4u::Mutex > &lock, std::chrono::duration< Rep, Period > duration)
2657 .. doxygenfunction:: simgrid::s4u::ConditionVariable::wait_for(const std::unique_lock< s4u::Mutex > &lock, std::chrono::duration< Rep, Period > duration, P pred)
2658 .. doxygenfunction:: simgrid::s4u::ConditionVariable::wait_until(const std::unique_lock< s4u::Mutex > &lock, const SimulationTimePoint< Duration > &timeout_time)
2659 .. doxygenfunction:: simgrid::s4u::ConditionVariable::wait_until(const std::unique_lock< s4u::Mutex > &lock, const SimulationTimePoint< Duration > &timeout_time, P pred)
2660 .. doxygenfunction:: simgrid::s4u::ConditionVariable::wait_until(const std::unique_lock< s4u::Mutex > &lock, double timeout_time)
2661 .. doxygenfunction:: simgrid::s4u::ConditionVariable::wait_until(const std::unique_lock< s4u::Mutex > &lock, double timeout_time, P pred)
2665 .. doxygenfunction:: sg_cond_notify_all
2666 .. doxygenfunction:: sg_cond_notify_one
2667 .. doxygenfunction:: sg_cond_wait
2668 .. doxygenfunction:: sg_cond_wait_for
2670 .. _API_s4u_Semaphore:
2680 .. doxygenclass:: simgrid::s4u::Semaphore
2682 .. group-tab:: Python
2684 .. autoclass:: simgrid.Semaphore
2695 #include <simgrid/s4u/Semaphore.hpp>
2697 .. doxygentypedef:: SemaphorePtr
2698 .. doxygenfunction:: simgrid::s4u::Semaphore::create(unsigned int initial_capacity)
2700 .. group-tab:: Python
2702 .. code-block:: Python
2704 from simgrid import Semaphore
2705 semaphore = Semaphore(1)
2706 # Automatically acquire the semaphore, and release it after leaving the scope.
2708 # Do something with the shared resource
2711 .. automethod:: simgrid.Semaphore.__init__
2717 #include <simgrid/semaphore.h>
2719 .. doxygentypedef:: sg_sem_t
2720 .. cpp:type:: const s4u_Semaphore* const_sg_sem_t
2722 Pointer to a constant semaphore object.
2724 .. doxygenfunction:: sg_sem_init(int initial_value)
2725 .. doxygenfunction:: sg_sem_destroy(const_sg_sem_t sem)
2734 .. doxygenfunction:: simgrid::s4u::Semaphore::acquire()
2735 .. doxygenfunction:: simgrid::s4u::Semaphore::acquire_timeout(double timeout)
2736 .. doxygenfunction:: simgrid::s4u::Semaphore::get_capacity() const
2737 .. doxygenfunction:: simgrid::s4u::Semaphore::release()
2738 .. doxygenfunction:: simgrid::s4u::Semaphore::would_block() const
2740 .. group-tab:: Python
2742 .. automethod:: simgrid.Semaphore.acquire
2743 .. automethod:: simgrid.Semaphore.acquire_timeout
2744 .. autoattribute:: simgrid.Semaphore.capacity
2745 .. automethod:: simgrid.Semaphore.release
2746 .. autoattribute:: simgrid.Semaphore.would_block
2750 .. doxygenfunction:: sg_sem_acquire(sg_sem_t sem)
2751 .. doxygenfunction:: sg_sem_acquire_timeout(sg_sem_t sem, double timeout)
2752 .. doxygenfunction:: sg_sem_get_capacity(const_sg_sem_t sem)
2753 .. doxygenfunction:: sg_sem_release(sg_sem_t sem)
2754 .. doxygenfunction:: sg_sem_would_block(const_sg_sem_t sem)