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.
33 .. _S4U_main_concepts:
38 A typical SimGrid simulation is composed of several |API_s4u_Actors|_, that
39 execute user-provided functions. The actors have to explicitly use the
40 S4U interface to express their :ref:`computation <API_s4u_Exec>`,
41 :ref:`communication <API_s4u_Comm>`, :ref:`disk usage <API_s4u_Io>`,
42 and other |API_s4u_Activities|_, so that they get reflected within the
43 simulator. These activities take place on resources such as |API_s4u_Hosts|_,
44 |API_s4u_Links|_, and |API_s4u_Disks|_. SimGrid predicts the time taken by each
45 activity and orchestrates the actors accordingly, waiting for the
46 completion of these activities.
49 When **communicating**, data is not directly sent to other actors but
50 posted onto a |API_s4u_Mailbox|_ that serves as a rendezvous point between
51 communicating actors. This means that you don't need to know who you
52 are talking to, you just put your communication `Put` request in a
53 mailbox, and it will be matched with a complementary `Get`
54 request. Alternatively, actors can interact through **classical
55 synchronization mechanisms** such as |API_s4u_Barrier|_, |API_s4u_Semaphore|_,
56 |API_s4u_Mutex|_, and |API_s4u_ConditionVariable|_.
58 Each actor is located on a simulated |API_s4u_Host|_. Each host is located
59 in a |API_s4u_NetZone|_, that knows the networking path between one
60 resource to another. Each NetZone is included in another one, forming
61 a tree of NetZones which root zone contains the whole platform. The
62 actors can also be located on a |API_s4U_VirtualMachine|_ that may
63 restrict the activities it contains to a limited amount of cores.
64 Virtual machines can also be migrated between hosts.
66 The :ref:`simgrid::s4u::this_actor <API_s4u_this_actor>` namespace
67 provides many helper functions to simplify the code of actors.
69 .. rst-class:: compact-list
71 - **Simulation Elements**
73 - :ref:`class Actor <API_s4u_Actor>`: Active entities executing your application.
74 - :ref:`class Engine <API_s4u_Engine>`: Simulation engine (singleton).
75 - :ref:`class Mailbox <API_s4u_Mailbox>`: Communication rendezvous, with which actors meet each other.
79 - :ref:`class Disk <API_s4u_Disk>`: Resource on which actors can write and read data.
80 - :ref:`class Host <API_s4u_Host>`: Actor location, providing computational power.
81 - :ref:`class Link <API_s4u_Link>`: Interconnecting hosts.
82 - :ref:`class NetZone <API_s4u_NetZone>`: Sub-region of the platform, containing resources (Hosts, Links, etc).
83 - :ref:`class VirtualMachine <API_s4u_VirtualMachine>`: Execution containers that can be moved between Hosts.
85 - **Activities** (:ref:`class Activity <API_s4u_Activity>`): The things that actors can do on resources.
87 - :ref:`class Comm <API_s4u_Comm>`: Communication activity, started on Mailboxes and consuming links.
88 - :ref:`class Exec <API_s4u_Exec>`: Computation activity, started on Host and consuming CPU resources.
89 - :ref:`class Io <API_s4u_Io>`: I/O activity, started on and consuming disks.
91 - **Synchronization Objects**: Classical IPC that actors can use
93 - :ref:`class Barrier <API_s4u_Barrier>`
94 - :ref:`class ConditionVariable <API_s4u_ConditionVariable>`
95 - :ref:`class Mutex <API_s4u_Mutex>`
96 - :ref:`class Semaphore <API_s4u_Semaphore>`
98 .. |API_s4u_Actors| replace:: **Actors**
99 .. _API_s4u_Actors: #api-s4u-actor
101 .. |API_s4u_Activities| replace:: **Activities**
102 .. _API_s4u_Activities: #api-s4u-activity
104 .. |API_s4u_Hosts| replace:: **Hosts**
105 .. _API_s4u_Hosts: #api-s4u-host
107 .. |API_s4u_Links| replace:: **Links**
108 .. _API_s4u_Links: #api-s4u-link
110 .. |API_s4u_Disks| replace:: **Disks**
111 .. _API_s4u_Disks: #api-s4u-disk
113 .. |API_s4u_VirtualMachine| replace:: **VirtualMachines**
115 .. |API_s4u_Host| replace:: **Host**
117 .. |API_s4u_Mailbox| replace:: **Mailbox**
119 .. |API_s4u_Mailboxes| replace:: **Mailboxes**
120 .. _API_s4u_Mailboxes: #s4u-mailbox
122 .. |API_s4u_NetZone| replace:: **NetZone**
124 .. |API_s4u_Barrier| replace:: **Barrier**
126 .. |API_s4u_Semaphore| replace:: **Semaphore**
128 .. |API_s4u_ConditionVariable| replace:: **ConditionVariable**
130 .. |API_s4u_Mutex| replace:: **Mutex**
137 Activities represent the actions that consume a resource, such as a
138 :ref:`Comm <API_s4u_Comm>` that consumes the *transmitting power* of
139 :ref:`Link <API_s4u_Link>` resources, or an :ref:`Exec <API_s4u_Exec>`
140 that consumes the *computing power* of :ref:`Host <API_s4u_Host>` resources.
141 See also the :ref:`full API <API_s4u_Activity>` below.
143 =======================
144 Asynchronous Activities
145 =======================
147 Every activity can be either **blocking** or **asynchronous**. For
148 example, :cpp:func:`s4u::Mailbox::put() <simgrid::s4u::Mailbox::put>`
149 and :cpp:func:`s4u::Mailbox::get() <simgrid::s4u::Mailbox::get>`
150 create blocking communications: the actor is blocked until the
151 completion of that communication. Asynchronous communications do not
152 block the actor during their execution but progress on their own.
154 Once your asynchronous activity is started, you can test for its
155 completion using :cpp:func:`s4u::Activity::test() <simgrid::s4u::Activity::test>`.
156 This function returns ``true`` if the activity is completed already.
157 You can also use :cpp:func:`s4u::Activity::wait() <simgrid::s4u::Activity::wait>`
158 to block until the completion of the activity. To wait for at most a given amount of time,
159 use :cpp:func:`s4u::Activity::wait_for() <simgrid::s4u::Activity::wait_for>`.
160 Finally, to wait at most until a specified time limit, use
161 :cpp:func:`s4u::Activity::wait_until() <simgrid::s4u::Activity::wait_until>`.
163 Every kind of activity can be asynchronous.
164 :ref:`s4u::CommPtr <API_s4u_Comm>` are created with :cpp:func:`s4u::Mailbox::put_async() <simgrid::s4u::Mailbox::put_async>` and
165 :cpp:func:`s4u::Mailbox::get_async() <simgrid::s4u::Mailbox::get_async>`;
166 :ref:`s4u::IoPtr <API_s4u_Io>` are created with :cpp:func:`s4u::Disk::read_async() <simgrid::s4u::Disk::read_async>` and
167 :cpp:func:`s4u::Disk::write_async() <simgrid::s4u::Disk::write_async>`; and
168 :ref:`s4u::ExecPtr <API_s4u_Exec>` are created with
169 :cpp:func:`s4u::Host::exec_async() <simgrid::s4u::Host::exec_async>`.
170 In the future, it will become possible to have asynchronous IPC such as asynchronous mutex lock requests.
172 The following example shows how to have several concurrent
173 communications ongoing. First, you have to declare a vector in which
174 we will store the ongoing communications. It is also useful to have a
177 .. literalinclude:: ../../examples/cpp/comm-waitall/s4u-comm-waitall.cpp
179 :start-after: init-begin
180 :end-before: init-end
183 Then, you start all the communications that should occur concurrently with
184 :cpp:func:`s4u::Mailbox::put_async() <simgrid::s4u::Mailbox::put_async>`.
185 Finally, the actor waits for the completion of all of them at once
186 with :cpp:func:`s4u::Comm::wait_all() <simgrid::s4u::Comm::wait_all>`.
188 .. literalinclude:: ../../examples/cpp/comm-waitall/s4u-comm-waitall.cpp
190 :start-after: put-begin
194 =====================
195 Activities Life cycle
196 =====================
198 Sometimes, you want to change the setting of an activity before it even starts.
200 .. todo:: write this section
207 Please also refer to the :ref:`API reference for s4u::Mailbox
214 |API_s4u_Mailboxes|_ are rendezvous points for network communications,
215 similar to URLs on which you could post and retrieve data. Actually,
216 the mailboxes are not involved in the communication once it starts,
217 but only to find the contact with which you want to communicate.
219 They are similar to many common things: The phone number, which allows
220 the caller to find the receiver. The Twitter hashtag, which helps
221 senders and receivers to find each other. In TCP, the pair
222 ``{host name, host port}`` to which you can connect to find your peer.
223 In HTTP, URLs through which the clients can connect to the servers.
224 In ZeroMQ, the queues are used to match senders and receivers.
226 One big difference with most of these systems is that no actor is the
227 exclusive owner of a mailbox, neither in sending nor in receiving.
228 Many actors can send into and/or receive from the same mailbox. TCP
229 socket ports for example are shared on the sender side but exclusive
230 on the receiver side (only one process can receive from a given socket
231 at a given point of time).
233 A big difference with TCP sockets or MPI communications is that
234 communications do not start right away after a
235 :cpp:func:`Mailbox::put() <simgrid::s4u::Mailbox::put>`, but wait
236 for the corresponding :cpp:func:`Mailbox::get() <simgrid::s4u::Mailbox::get>`.
237 You can change this by :ref:`declaring a receiving actor <s4u_receiving_actor>`.
239 A big difference with Twitter hashtags is that SimGrid does not
240 offer easy support to broadcast a given message to many
241 receivers. So that would be like a Twitter tag where each message
242 is consumed by the first receiver.
244 A big difference with the ZeroMQ queues is that you cannot filter
245 on the data you want to get from the mailbox. To model such settings
246 in SimGrid, you'd have one mailbox per potential topic, and subscribe
247 to each topic individually with a
248 :cpp:func:`get_async() <simgrid::s4u::Mailbox::get_async>` on each mailbox.
249 Then, use :cpp:func:`Comm::wait_any() <simgrid::s4u::Comm::wait_any>`
250 to get the first message on any of the mailboxes you are subscribed to.
252 The mailboxes are not located on the network, and you can access
253 them without any latency. The network delays are only related to the
254 location of the sender and receiver once the match between them is
255 done on the mailbox. This is just like the phone number that you
256 can use locally, and the geographical distance only comes into play
257 once you start the communication by dialing this number.
259 =====================
260 How to use Mailboxes?
261 =====================
263 You can retrieve any existing mailbox from its name (which is a
264 unique string, just like a Twitter tag). This results in a
265 versatile tool that can be used to build many different
268 To model classical socket communications, use "hostname:port" as
269 mailbox names, and make sure that only one actor reads into a given
270 mailbox. This does not make it easy to build a perfectly realistic
271 model of the TCP sockets, but in most cases, this system is too
272 cumbersome for your simulations anyway. You probably want something
273 simpler, that turns out to be easy to build with the mailboxes.
275 Many SimGrid examples use a sort of yellow page system where the
276 mailbox names are the name of the service (such as "worker",
277 "master", or "reducer"). That way, you don't have to know where your
278 peer is located to contact it. You don't even need its name. Its
279 function is enough for that. This also gives you some sort of load
280 balancing for free if more than one actor pulls from the mailbox:
281 the first actor that can deal with the request will handle it.
283 =========================================
284 How are put() and get() requests matched?
285 =========================================
287 The matching algorithm simple: first come, first serve. When a new
288 send arrives, it matches the oldest enqueued receive. If no receive is
289 currently enqueued, then the incoming send is enqueued. As you can
290 see, the mailbox cannot contain both send and receive requests: all
291 enqueued requests must be of the same sort.
293 .. _s4u_receiving_actor:
295 ===========================
296 Declaring a Receiving Actor
297 ===========================
299 The last twist is that by default in the simulator, the data starts
300 to be exchanged only when both the sender and the receiver are
301 announced (it waits until both :cpp:func:`put() <simgrid::s4u::Mailbox::put()>`
302 and :cpp:func:`get() <simgrid::s4u::Mailbox::get()>` are posted).
303 In TCP, since you establish connections beforehand, the data starts to
304 flow as soon as the sender posts it, even if the receiver did not post
305 its :cpp:func:`put() <simgrid::s4u::Mailbox::put()>` yet.
307 To model this in SimGrid, you can declare a specific receiver to a
308 given mailbox (with the function
309 :cpp:func:`set_receiver() <simgrid::s4u::Mailbox::set_receiver()>`).
310 That way, any :cpp:func:`put() <simgrid::s4u::Mailbox::put()>`
311 posted to that mailbox will start as soon as possible, and the data
312 will already be there on the receiver host when the receiver actor
313 posts its :cpp:func:`get() <simgrid::s4u::Mailbox::get()>`
315 Note that being permanent receivers of a mailbox prevents actors to be
316 garbage-collected. If your simulation creates many short-lived actors
317 that are marked as permanent receiver, you should call
318 ``mailbox->set_receiver(nullptr)`` by the end of the actors so that their
319 memory gets properly reclaimed. This call should be at the end of the
320 actor's function, not in an on_exit callback.
322 ===============================
323 Communicating without Mailboxes
324 ===============================
326 Sometimes you don't want to simulate communications between actors as
327 allowed by mailboxes, but you want to create a direct communication
328 between two arbitrary hosts. This can arise when you write a
329 high-level model of a centralized scheduler, or when you model direct
330 communications such as one-sided communications in MPI or remote
331 memory direct access in PGAS.
333 For that, :cpp:func:`Comm::sendto() <simgrid::s4u::Comm::sendto()>`
334 simulates a direct communication between the two specified hosts. No
335 mailbox is used, and there is no rendezvous between actors. You can
336 freely mix such direct communications and rendezvous-based
337 communications. Alternatively, :cpp:func:`Comm::sendto_init()
338 <simgrid::s4u::Comm::sendto_init()>` and
339 :cpp:func:`Comm::sendto_async() <simgrid::s4u::Comm::sendto_async()>`
340 create asynchronous direct communications.
347 For sake of simplicity, we use `RAII
348 <https://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization>`_
349 for many classes in S4U. This is an idiom where resources are automatically
350 managed through the context. Provided that you never manipulate
351 objects of type Foo directly but always FooPtr references (which are
352 defined as `boost::intrusive_ptr
353 <http://www.boost.org/doc/libs/1_61_0/libs/smart_ptr/intrusive_ptr.html>`_
354 <Foo>), you will never have to explicitly release the resource that
355 you use nor to free the memory of unused objects.
356 Here is a little example:
362 simgrid::s4u::MutexPtr mutex = simgrid::s4u::Mutex::create(); // Too bad we cannot use `new`
364 mutex->lock(); // use the mutex as a simple reference
368 } // The mutex gets automatically freed because the only existing reference gets out of scope
370 Note that Mailboxes, Hosts, and Links are not handled through smart
371 pointers (yet?). This means that it is currently impossible to destroy a
372 mailbox or a link. You can still destroy a host (but probably
373 shouldn't), using :cpp:func:`simgrid::s4u::Host::destroy`.
377 .. include:: ../../examples/README.rst
382 .. _API_s4u_simulation_object:
398 .. doxygenclass:: simgrid::s4u::Actor
400 .. doxygentypedef:: aid_t
403 .. group-tab:: Python
405 .. autoclass:: simgrid.Actor
416 #include <simgrid/s4u/Actor.hpp>
418 .. doxygentypedef:: ActorPtr
420 .. group-tab:: Python
424 from simgrid import Actor
430 #include <simgrid/actor.h>
432 .. doxygentypedef:: sg_actor_t
433 .. doxygentypedef:: const_sg_actor_t
434 .. doxygenfunction:: sg_actor_ref
435 .. doxygenfunction:: sg_actor_unref
441 See also :ref:`the relevant example <s4u_ex_actors_create>`.
447 .. doxygenfunction:: simgrid::s4u::Actor::create(const std::string &name, s4u::Host *host, const std::function< void()> &code)
448 .. doxygenfunction:: simgrid::s4u::Actor::create(const std::string &name, s4u::Host *host, F code)
449 .. doxygenfunction:: simgrid::s4u::Actor::create(const std::string &name, s4u::Host *host, F code, Args... args)
450 .. doxygenfunction:: simgrid::s4u::Actor::create(const std::string &name, s4u::Host *host, const std::string &function, std::vector< std::string > args)
452 .. doxygenfunction:: simgrid::s4u::Actor::init(const std::string &name, s4u::Host *host)
453 .. doxygenfunction:: simgrid::s4u::Actor::start(const std::function< void()> &code)
454 .. doxygenfunction:: simgrid::s4u::Actor::set_stacksize
456 .. group-tab:: Python
458 .. automethod:: simgrid.Actor.create
462 .. doxygenfunction:: sg_actor_create(const char *name, sg_host_t host, xbt_main_func_t code, int argc, char *const *argv)
463 .. doxygenfunction:: sg_actor_init(const char *name, sg_host_t host)
464 .. doxygenfunction:: sg_actor_start(sg_actor_t actor, xbt_main_func_t code, int argc, char *const *argv)
465 .. doxygenfunction:: sg_actor_set_stacksize
467 .. doxygenfunction:: sg_actor_attach(const char *name, void *data, sg_host_t host, xbt_dict_t properties)
468 .. doxygenfunction:: sg_actor_detach()
477 .. doxygenfunction:: simgrid::s4u::Actor::by_pid(aid_t pid)
478 .. doxygenfunction:: simgrid::s4u::Actor::self()
480 .. group-tab:: Python
482 .. automethod:: simgrid.Actor.by_pid
483 .. automethod:: simgrid.Actor.self
487 .. doxygenfunction:: sg_actor_by_pid(aid_t pid)
488 .. doxygenfunction:: sg_actor_self()
489 .. doxygenfunction:: sg_actor_list()
498 .. doxygenfunction:: simgrid::s4u::Actor::get_cname
499 .. doxygenfunction:: simgrid::s4u::Actor::get_name
500 .. doxygenfunction:: simgrid::s4u::Actor::get_pid
501 .. doxygenfunction:: simgrid::s4u::Actor::get_ppid
502 .. doxygenfunction:: simgrid::s4u::Actor::get_properties() const
503 .. doxygenfunction:: simgrid::s4u::Actor::get_property(const std::string &key) const
504 .. doxygenfunction:: simgrid::s4u::Actor::set_property(const std::string &key, const std::string &value)
506 .. doxygenfunction:: simgrid::s4u::Actor::get_host
507 .. doxygenfunction:: simgrid::s4u::Actor::set_host
509 .. doxygenfunction:: simgrid::s4u::Actor::get_refcount
510 .. doxygenfunction:: simgrid::s4u::Actor::get_impl
512 .. group-tab:: Python
514 .. autoattribute:: simgrid.Actor.name
515 .. autoattribute:: simgrid.Actor.host
516 .. autoattribute:: simgrid.Actor.pid
517 .. autoattribute:: simgrid.Actor.ppid
521 .. doxygenfunction:: sg_actor_get_name(const_sg_actor_t actor)
522 .. doxygenfunction:: sg_actor_get_pid(const_sg_actor_t actor)
523 .. doxygenfunction:: sg_actor_get_ppid(const_sg_actor_t actor)
524 .. doxygenfunction:: sg_actor_get_properties(const_sg_actor_t actor)
525 .. doxygenfunction:: sg_actor_get_property_value(const_sg_actor_t actor, const char *name)
527 .. doxygenfunction:: sg_actor_get_host(const_sg_actor_t actor)
528 .. doxygenfunction:: sg_actor_set_host(sg_actor_t actor, sg_host_t host)
530 .. doxygenfunction:: sg_actor_get_data(const_sg_actor_t actor)
531 .. doxygenfunction:: sg_actor_set_data(sg_actor_t actor, void *userdata)
533 Suspending and resuming actors
534 ------------------------------
540 .. doxygenfunction:: simgrid::s4u::Actor::suspend()
541 .. doxygenfunction:: simgrid::s4u::Actor::resume()
542 .. doxygenfunction:: simgrid::s4u::Actor::is_suspended
544 .. group-tab:: Python
546 .. automethod:: simgrid.Actor.resume
547 .. automethod:: simgrid.Actor.suspend
548 .. automethod:: simgrid.Actor.is_suspended
552 .. doxygenfunction:: sg_actor_suspend(sg_actor_t actor)
553 .. doxygenfunction:: sg_actor_resume(sg_actor_t actor)
554 .. doxygenfunction:: sg_actor_is_suspended(const_sg_actor_t actor)
556 Specifying when actors should terminate
557 ---------------------------------------
563 .. doxygenfunction:: simgrid::s4u::Actor::kill()
564 .. doxygenfunction:: simgrid::s4u::Actor::kill_all()
565 .. doxygenfunction:: simgrid::s4u::Actor::set_kill_time(double time)
566 .. doxygenfunction:: simgrid::s4u::Actor::get_kill_time
568 .. doxygenfunction:: simgrid::s4u::Actor::restart()
569 .. doxygenfunction:: simgrid::s4u::Actor::daemonize()
570 .. doxygenfunction:: simgrid::s4u::Actor::is_daemon
572 .. group-tab:: Python
574 .. automethod:: simgrid.Actor.kill
575 .. automethod:: simgrid.Actor.kill_all
577 .. automethod:: simgrid.Actor.daemonize
578 .. automethod:: simgrid.Actor.is_daemon
582 .. doxygenfunction:: sg_actor_kill(sg_actor_t actor)
583 .. doxygenfunction:: sg_actor_kill_all()
584 .. doxygenfunction:: sg_actor_set_kill_time(sg_actor_t actor, double kill_time)
586 .. doxygenfunction:: sg_actor_restart(sg_actor_t actor)
587 .. doxygenfunction:: sg_actor_daemonize(sg_actor_t actor)
588 .. doxygenfunction:: sg_actor_is_daemon
590 .. _API_s4u_Actor_end:
592 Reacting to the end of actors
593 -----------------------------
599 .. doxygenfunction:: simgrid::s4u::Actor::on_exit
600 .. doxygenfunction:: simgrid::s4u::Actor::join() const
601 .. doxygenfunction:: simgrid::s4u::Actor::join(double timeout) const
602 .. doxygenfunction:: simgrid::s4u::Actor::set_auto_restart(bool autorestart)
603 .. doxygenfunction:: simgrid::s4u::Actor::get_restart_count
605 .. group-tab:: Python
607 .. automethod:: simgrid.Actor.join
611 .. doxygenfunction:: sg_actor_on_exit
612 .. doxygenfunction:: sg_actor_join(const_sg_actor_t actor, double timeout)
613 .. doxygenfunction:: sg_actor_set_auto_restart(sg_actor_t actor, int auto_restart)
622 .. doxygenfunction:: simgrid::s4u::Actor::on_creation_cb
623 .. doxygenfunction:: simgrid::s4u::Actor::on_suspend_cb
624 .. doxygenfunction:: simgrid::s4u::Actor::on_host_change_cb
625 .. doxygenfunction:: simgrid::s4u::Actor::on_resume_cb
626 .. doxygenfunction:: simgrid::s4u::Actor::on_sleep_cb
627 .. doxygenfunction:: simgrid::s4u::Actor::on_wake_up_cb
628 .. doxygenfunction:: simgrid::s4u::Actor::on_termination_cb
629 .. doxygenfunction:: simgrid::s4u::Actor::on_destruction_cb
631 .. _API_s4u_this_actor:
637 These functions can be used in your user code to interact with the actor
638 currently running (the one retrieved with :cpp:func:`simgrid::s4u::Actor::self`).
639 Using these functions can greatly improve the code readability.
648 .. doxygenfunction:: simgrid::s4u::this_actor::get_cname()
649 .. doxygenfunction:: simgrid::s4u::this_actor::get_name()
650 .. doxygenfunction:: simgrid::s4u::this_actor::get_pid()
651 .. doxygenfunction:: simgrid::s4u::this_actor::get_ppid()
652 .. doxygenfunction:: simgrid::s4u::this_actor::is_maestro()
654 .. doxygenfunction:: simgrid::s4u::this_actor::get_host()
655 .. doxygenfunction:: simgrid::s4u::this_actor::set_host(Host *new_host)
657 .. group-tab:: Python
659 .. autofunction:: simgrid.this_actor.get_host
660 .. autofunction:: simgrid.this_actor.set_host
662 .. autofunction:: simgrid.this_actor.get_pid
663 .. autofunction:: simgrid.this_actor.get_ppid
667 .. doxygenfunction:: sg_actor_self_get_data()
668 .. doxygenfunction:: sg_actor_self_set_data(void *data)
669 .. doxygenfunction:: sg_actor_self_get_name()
670 .. doxygenfunction:: sg_actor_self_get_pid()
671 .. doxygenfunction:: sg_actor_self_get_ppid()
672 .. doxygenfunction:: sg_host_self()
673 .. doxygenfunction:: sg_host_self_get_name()
675 Suspending and resuming
676 -----------------------
682 .. doxygenfunction:: simgrid::s4u::this_actor::suspend()
683 .. doxygenfunction:: simgrid::s4u::this_actor::yield()
685 .. group-tab:: Python
687 .. autofunction:: simgrid.this_actor.suspend
688 .. autofunction:: simgrid.this_actor.yield_
692 .. doxygenfunction:: sg_actor_yield()
701 Please refer to :ref:`the relevant documentation <logging_prog>`.
703 .. group-tab:: Python
705 .. autofunction:: simgrid.this_actor.debug
706 .. autofunction:: simgrid.this_actor.info
707 .. autofunction:: simgrid.this_actor.warning
708 .. autofunction:: simgrid.this_actor.error
717 .. doxygenfunction:: simgrid::s4u::this_actor::sleep_for(double duration)
718 .. doxygenfunction:: simgrid::s4u::this_actor::sleep_for(std::chrono::duration< Rep, Period > duration)
719 .. doxygenfunction:: simgrid::s4u::this_actor::sleep_until(const SimulationTimePoint< Duration > &wakeup_time)
720 .. doxygenfunction:: simgrid::s4u::this_actor::sleep_until(double wakeup_time)
722 .. group-tab:: Python
724 .. autofunction:: simgrid.this_actor.sleep_for
725 .. autofunction:: simgrid.this_actor.sleep_until
729 .. doxygenfunction:: sg_actor_sleep_for(double duration)
731 Simulating executions
732 ---------------------
734 Simulate the execution of some code on this actor. You can either simulate
735 parallel or sequential code and you can either block upon the termination of
736 the execution, or start an asynchronous activity.
742 .. doxygenfunction:: simgrid::s4u::this_actor::exec_async
743 .. 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)
744 .. doxygenfunction:: simgrid::s4u::this_actor::exec_init(double flops_amounts)
745 .. doxygenfunction:: simgrid::s4u::this_actor::execute(double flop)
746 .. doxygenfunction:: simgrid::s4u::this_actor::execute(double flop, double priority)
747 .. 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)
748 .. doxygenfunction:: simgrid::s4u::this_actor::thread_execute
750 .. group-tab:: Python
752 .. autofunction:: simgrid.this_actor.exec_async
753 .. autofunction:: simgrid.this_actor.exec_init
754 .. autofunction:: simgrid.this_actor.execute
758 .. doxygenfunction:: sg_actor_execute(double flops)
759 .. doxygenfunction:: sg_actor_execute_with_priority(double flops, double priority)
760 .. doxygenfunction:: sg_actor_exec_init(double computation_amount)
761 .. doxygenfunction:: sg_actor_exec_async(double computation_amount)
762 .. doxygenfunction:: sg_actor_parallel_exec_init(int host_nb, const sg_host_t* host_list, double* flops_amount, double* bytes_amount);
771 .. doxygenfunction:: simgrid::s4u::this_actor::exit()
772 .. doxygenfunction:: simgrid::s4u::this_actor::on_exit(const std::function< void(bool)> &fun)
774 .. group-tab:: Python
776 .. autofunction:: simgrid.this_actor.exit
777 .. autofunction:: simgrid.this_actor.on_exit
781 See also :cpp:func:`sg_actor_on_exit`.
783 .. doxygenfunction:: sg_actor_exit
795 .. doxygenclass:: simgrid::s4u::Engine
797 .. group-tab:: Python
799 .. autoclass:: simgrid.Engine
808 .. doxygenfunction:: simgrid::s4u::Engine::Engine(int *argc, char **argv)
809 .. doxygenfunction:: simgrid::s4u::Engine::is_initialized()
810 .. doxygenfunction:: simgrid::s4u::Engine::shutdown()
811 .. doxygenfunction:: simgrid::s4u::Engine::get_instance()
813 .. group-tab:: Python
815 .. automethod:: simgrid.Engine.__init__
816 .. autoattribute:: simgrid.Engine.instance
820 .. doxygenfunction:: simgrid_init
829 .. doxygenfunction:: simgrid::s4u::Engine::set_config(const std::string &str)
830 .. doxygenfunction:: simgrid::s4u::Engine::set_config(const std::string &name, bool value)
831 .. doxygenfunction:: simgrid::s4u::Engine::set_config(const std::string &name, double value)
832 .. doxygenfunction:: simgrid::s4u::Engine::set_config(const std::string &name, int value)
833 .. doxygenfunction:: simgrid::s4u::Engine::set_config(const std::string &name, const std::string &value)
835 .. doxygenfunction:: simgrid::s4u::Engine::load_deployment
836 .. doxygenfunction:: simgrid::s4u::Engine::load_platform
837 .. doxygenfunction:: simgrid::s4u::Engine::register_actor(const std::string &name)
838 .. doxygenfunction:: simgrid::s4u::Engine::register_actor(const std::string &name, F code)
839 .. doxygenfunction:: simgrid::s4u::Engine::register_default(const std::function< void(int, char **)> &code)
840 .. doxygenfunction:: simgrid::s4u::Engine::register_default(const kernel::actor::ActorCodeFactory &factory)
842 .. doxygenfunction:: simgrid::s4u::Engine::register_function(const std::string &name, const std::function< void(int, char **)> &code)
843 .. doxygenfunction:: simgrid::s4u::Engine::register_function(const std::string &name, const std::function< void(std::vector< std::string >)> &code)
844 .. doxygenfunction:: simgrid::s4u::Engine::register_function(const std::string &name, const kernel::actor::ActorCodeFactory &factory)
846 .. group-tab:: Python
848 .. automethod:: simgrid.Engine.load_deployment
849 .. automethod:: simgrid.Engine.load_platform
850 .. automethod:: simgrid.Engine.register_actor
854 .. doxygenfunction:: simgrid_load_deployment
855 .. doxygenfunction:: simgrid_load_platform
856 .. doxygenfunction:: simgrid_register_default
857 .. doxygenfunction:: simgrid_register_function
867 .. doxygenfunction:: simgrid::s4u::Engine::get_clock()
868 .. doxygenfunction:: simgrid::s4u::Engine::run
869 .. doxygenfunction:: simgrid::s4u::Engine::run_until
871 .. group-tab:: Python
873 .. autoattribute:: simgrid.Engine.clock
874 .. automethod:: simgrid.Engine.run
875 .. automethod:: simgrid.Engine.run_until
879 .. doxygenfunction:: simgrid_get_clock
880 .. doxygenfunction:: simgrid_run
881 .. doxygenfunction:: simgrid_run_until
890 .. doxygenfunction:: simgrid::s4u::Engine::get_actor_count
891 .. doxygenfunction:: simgrid::s4u::Engine::get_all_actors
892 .. doxygenfunction:: simgrid::s4u::Engine::get_filtered_actors
896 .. doxygenfunction:: sg_actor_count()
905 .. doxygenfunction:: simgrid::s4u::Engine::get_all_hosts
906 .. doxygenfunction:: simgrid::s4u::Engine::get_host_count
907 .. doxygenfunction:: simgrid::s4u::Engine::get_filtered_hosts
908 .. doxygenfunction:: simgrid::s4u::Engine::host_by_name
909 .. doxygenfunction:: simgrid::s4u::Engine::host_by_name_or_null
911 .. group-tab:: Python
913 .. autoattribute:: simgrid.Engine.all_hosts
914 .. automethod:: simgrid.Engine.host_by_name
918 See also :cpp:func:`sg_host_list` and :cpp:func:`sg_host_count`.
927 .. doxygenfunction:: simgrid::s4u::Engine::get_all_links
928 .. doxygenfunction:: simgrid::s4u::Engine::get_link_count
929 .. doxygenfunction:: simgrid::s4u::Engine::get_filtered_links
930 .. doxygenfunction:: simgrid::s4u::Engine::link_by_name
931 .. doxygenfunction:: simgrid::s4u::Engine::link_by_name_or_null
933 .. group-tab:: Python
935 .. autoattribute:: simgrid.Engine.all_links
937 Interacting with the routing
938 ----------------------------
944 .. doxygenfunction:: simgrid::s4u::Engine::get_all_netpoints
945 .. doxygenfunction:: simgrid::s4u::Engine::get_filtered_netzones
946 .. doxygenfunction:: simgrid::s4u::Engine::get_netzone_root
947 .. doxygenfunction:: simgrid::s4u::Engine::netpoint_by_name_or_null
948 .. doxygenfunction:: simgrid::s4u::Engine::netzone_by_name_or_null
950 .. group-tab:: Python
952 .. autoattribute:: simgrid.Engine.all_netpoints
953 .. autoattribute:: simgrid.Engine.netzone_root
954 .. automethod:: simgrid.Engine.netpoint_by_name
955 .. automethod:: simgrid.Engine.netzone_by_name
964 .. doxygenfunction:: simgrid::s4u::Engine::on_deadlock_cb
965 .. doxygenfunction:: simgrid::s4u::Engine::on_platform_created_cb
966 .. doxygenfunction:: simgrid::s4u::Engine::on_platform_creation_cb
967 .. doxygenfunction:: simgrid::s4u::Engine::on_simulation_start_cb
968 .. doxygenfunction:: simgrid::s4u::Engine::on_simulation_end_cb
969 .. doxygenfunction:: simgrid::s4u::Engine::on_time_advance_cb
981 .. doxygenclass:: simgrid::s4u::Mailbox
983 .. group-tab:: Python
985 .. autoclass:: simgrid.Mailbox
987 Please also refer to the :ref:`full doc on s4u::Mailbox <s4u_mailbox>`.
998 #include <simgrid/s4u/Mailbox.hpp>
1000 Note that there is no MailboxPtr type and that you cannot use the RAII
1001 idiom on mailboxes because they are internal objects to the simulation
1002 engine. Once created, there is no way to destroy a mailbox before the end
1005 .. doxygenfunction:: simgrid::s4u::Mailbox::by_name(const std::string &name)
1007 .. group-tab:: Python
1011 #include <simgrid/mailbox.h>
1013 .. automethod:: simgrid.Mailbox.by_name
1019 #include <simgrid/s4u/mailbox.h>
1021 .. doxygentypedef:: sg_mailbox_t
1022 .. doxygentypedef:: const_sg_mailbox_t
1024 .. doxygenfunction:: sg_mailbox_by_name(const char *alias)
1033 .. doxygenfunction:: simgrid::s4u::Mailbox::get_cname
1034 .. doxygenfunction:: simgrid::s4u::Mailbox::get_name
1036 .. group-tab:: Python
1038 .. autoattribute:: simgrid.Mailbox.name
1047 .. doxygenfunction:: simgrid::s4u::Mailbox::put(void *payload, uint64_t simulated_size_in_bytes)
1048 .. doxygenfunction:: simgrid::s4u::Mailbox::put(void *payload, uint64_t simulated_size_in_bytes, double timeout)
1049 .. doxygenfunction:: simgrid::s4u::Mailbox::put_async(void *data, uint64_t simulated_size_in_bytes)
1050 .. doxygenfunction:: simgrid::s4u::Mailbox::put_init()
1051 .. doxygenfunction:: simgrid::s4u::Mailbox::put_init(void *data, uint64_t simulated_size_in_bytes)
1053 .. group-tab:: Python
1055 .. automethod:: simgrid.Mailbox.put
1056 .. automethod:: simgrid.Mailbox.put_async
1057 .. automethod:: simgrid.Mailbox.put_init
1061 .. doxygenfunction:: sg_mailbox_put(sg_mailbox_t mailbox, void *payload, long simulated_size_in_bytes)
1062 .. doxygenfunction:: sg_mailbox_put_init(sg_mailbox_t mailbox, void *payload, long simulated_size_in_bytes)
1063 .. doxygenfunction:: sg_mailbox_put_async(sg_mailbox_t mailbox, void *payload, long simulated_size_in_bytes)
1073 .. doxygenfunction:: simgrid::s4u::Mailbox::empty
1074 .. doxygenfunction:: simgrid::s4u::Mailbox::front
1075 .. doxygenfunction:: simgrid::s4u::Mailbox::get()
1076 .. doxygenfunction:: simgrid::s4u::Mailbox::get(double timeout)
1077 .. doxygenfunction:: simgrid::s4u::Mailbox::get_async(T **data)
1078 .. doxygenfunction:: simgrid::s4u::Mailbox::get_init()
1079 .. doxygenfunction:: simgrid::s4u::Mailbox::iprobe(int type, const std::function<bool(void *, void *, kernel::activity::CommImpl *)>& match_fun, void *data)
1080 .. doxygenfunction:: simgrid::s4u::Mailbox::listen
1081 .. doxygenfunction:: simgrid::s4u::Mailbox::ready
1083 .. group-tab:: Python
1085 .. automethod:: simgrid.Mailbox.get
1086 .. automethod:: simgrid.Mailbox.get_async
1087 .. autoattribute:: simgrid.Mailbox.ready
1091 .. doxygenfunction:: sg_mailbox_get(sg_mailbox_t mailbox)
1092 .. doxygenfunction:: sg_mailbox_get_async(sg_mailbox_t mailbox, void **data)
1093 .. doxygenfunction:: sg_mailbox_get_name(const_sg_mailbox_t mailbox)
1094 .. doxygenfunction:: sg_mailbox_listen(const char *alias)
1099 See :ref:`s4u_receiving_actor`.
1105 .. doxygenfunction:: simgrid::s4u::Mailbox::get_receiver
1106 .. doxygenfunction:: simgrid::s4u::Mailbox::set_receiver(ActorPtr actor)
1110 .. doxygenfunction:: sg_mailbox_set_receiver(const char *alias)
1112 .. _API_s4u_Resource:
1128 .. doxygenclass:: simgrid::s4u::Disk
1130 .. group-tab:: Python
1132 .. autoclass:: simgrid.Disk
1136 .. doxygentypedef:: sg_disk_t
1137 .. doxygentypedef:: const_sg_disk_t
1148 #include <simgrid/s4u/Disk.hpp>
1150 Note that there is no DiskPtr type and that you cannot use the RAII
1151 idiom on disks because SimGrid does not allow (yet) to create nor
1152 destroy resources once the simulation is started.
1154 .. doxygenfunction:: simgrid::s4u::Disk::seal()
1156 .. group-tab:: Python
1160 from simgrid import Disk
1162 .. automethod:: simgrid.Disk.seal
1172 .. doxygenfunction:: simgrid::s4u::Disk::get_cname() const
1173 .. doxygenfunction:: simgrid::s4u::Disk::get_host() const
1174 .. doxygenfunction:: simgrid::s4u::Disk::get_name() const
1175 .. doxygenfunction:: simgrid::s4u::Disk::get_properties() const
1176 .. doxygenfunction:: simgrid::s4u::Disk::get_property(const std::string &key) const
1177 .. doxygenfunction:: simgrid::s4u::Disk::get_read_bandwidth() const
1178 .. doxygenfunction:: simgrid::s4u::Disk::get_write_bandwidth() const
1179 .. doxygenfunction:: simgrid::s4u::Disk::set_property(const std::string &, const std::string &value)
1180 .. doxygenfunction:: simgrid::s4u::Disk::set_sharing_policy
1182 .. group-tab:: Python
1184 .. autoattribute:: simgrid.Disk.name
1185 .. automethod:: simgrid.Disk.set_sharing_policy
1194 .. doxygenfunction:: simgrid::s4u::Disk::io_init(sg_size_t size, s4u::Io::OpType type) const
1195 .. doxygenfunction:: simgrid::s4u::Disk::read(sg_size_t size) const
1196 .. doxygenfunction:: simgrid::s4u::Disk::read_async(sg_size_t size) const
1197 .. doxygenfunction:: simgrid::s4u::Disk::write(sg_size_t size) const
1198 .. doxygenfunction:: simgrid::s4u::Disk::write_async(sg_size_t size) const
1200 .. group-tab:: Python
1202 .. automethod:: simgrid.Disk.read
1203 .. automethod:: simgrid.Disk.read_async
1204 .. automethod:: simgrid.Disk.write
1205 .. automethod:: simgrid.Disk.write_async
1214 .. doxygenfunction:: simgrid::s4u::Disk::on_creation_cb
1215 .. doxygenfunction:: simgrid::s4u::Disk::on_destruction_cb
1216 .. doxygenfunction:: simgrid::s4u::Disk::on_state_change_cb
1229 .. doxygenclass:: simgrid::s4u::Host
1231 .. group-tab:: Python
1233 .. autoclass:: simgrid.Host
1244 #include <simgrid/s4u/Host.hpp>
1246 Note that there is no HostPtr type, and that you cannot use the RAII
1247 idiom on hosts because SimGrid does not allow (yet) to create nor
1248 destroy resources once the simulation is started.
1250 .. doxygenfunction:: simgrid::s4u::Host::destroy()
1251 .. doxygenfunction:: simgrid::s4u::Host::seal()
1253 .. group-tab:: Python
1257 from simgrid import Host
1259 .. automethod:: simgrid.Host.seal
1265 #include <simgrid/host.h>
1267 .. doxygentypedef:: sg_host_t
1268 .. cpp:type:: const s4u_Host* const_sg_host_t
1270 Pointer to a constant host object.
1279 See also :cpp:func:`simgrid::s4u::Engine::get_all_hosts`.
1281 .. doxygenfunction:: simgrid::s4u::Host::by_name(const std::string &name)
1282 .. doxygenfunction:: simgrid::s4u::Host::by_name_or_null(const std::string &name)
1283 .. doxygenfunction:: simgrid::s4u::Host::current()
1285 .. group-tab:: Python
1287 See also :py:attr:`simgrid.Engine.all_hosts`.
1289 .. automethod:: simgrid.Host.by_name
1290 .. automethod:: simgrid.Host.current
1294 .. doxygenfunction:: sg_host_by_name(const char *name)
1295 .. doxygenfunction:: sg_host_count()
1296 .. doxygenfunction:: sg_host_list()
1298 Modifying characteristics
1299 -------------------------
1305 .. doxygenfunction:: simgrid::s4u::Host::set_core_count(int core_count)
1306 .. doxygenfunction:: simgrid::s4u::Host::set_coordinates(const std::string& coords)
1307 .. doxygenfunction:: simgrid::s4u::Host::set_sharing_policy
1309 .. group-tab:: Python
1311 .. autoattribute:: simgrid.Host.core_count
1313 .. automethod:: simgrid.Host.set_coordinates
1314 .. automethod:: simgrid.Host.set_sharing_policy
1323 .. doxygenfunction:: simgrid::s4u::Host::get_cname() const
1324 .. doxygenfunction:: simgrid::s4u::Host::get_core_count() const
1325 .. doxygenfunction:: simgrid::s4u::Host::get_name() const
1326 .. doxygenfunction:: simgrid::s4u::Host::get_available_speed() const
1327 .. doxygenfunction:: simgrid::s4u::Host::get_load() const
1328 .. doxygenfunction:: simgrid::s4u::Host::get_speed() const
1330 .. group-tab:: Python
1332 .. autoattribute:: simgrid.Host.name
1333 .. autoattribute:: simgrid.Host.core_count
1334 .. autoattribute:: simgrid.Host.load
1335 .. autoattribute:: simgrid.Host.speed
1336 .. autoattribute:: simgrid.Host.available_speed
1340 .. doxygenfunction:: sg_host_core_count(const_sg_host_t host)
1341 .. doxygenfunction:: sg_host_get_name(const_sg_host_t host)
1342 .. doxygenfunction:: sg_host_get_load(const_sg_host_t host)
1343 .. doxygenfunction:: sg_host_get_speed(const_sg_host_t host)
1345 User data and properties
1346 ------------------------
1352 .. doxygenfunction:: simgrid::s4u::Host::get_properties() const
1353 .. doxygenfunction:: simgrid::s4u::Host::get_property(const std::string &key) const
1354 .. doxygenfunction:: simgrid::s4u::Host::set_properties(const std::unordered_map< std::string, std::string > &properties)
1355 .. doxygenfunction:: simgrid::s4u::Host::set_property(const std::string &key, const std::string &value)
1359 .. doxygenfunction:: sg_host_set_property_value(sg_host_t host, const char *name, const char *value)
1360 .. doxygenfunction:: sg_host_get_properties(const_sg_host_t host)
1361 .. doxygenfunction:: sg_host_get_property_value(const_sg_host_t host, const char *name)
1362 .. doxygenfunction:: sg_host_extension_create(void(*deleter)(void *))
1363 .. doxygenfunction:: sg_host_extension_get(const_sg_host_t host, size_t rank)
1365 Retrieving components
1366 ---------------------
1372 .. doxygenfunction:: simgrid::s4u::Host::add_disk(const Disk *disk)
1373 .. doxygenfunction:: simgrid::s4u::Host::get_actor_count() const
1374 .. doxygenfunction:: simgrid::s4u::Host::get_all_actors() const
1375 .. doxygenfunction:: simgrid::s4u::Host::get_disks() const
1376 .. doxygenfunction:: simgrid::s4u::Host::remove_disk(const std::string &disk_name)
1378 .. group-tab:: Python
1380 .. automethod:: simgrid.Host.get_disks
1384 .. doxygenfunction:: sg_host_get_actor_list(const_sg_host_t host, xbt_dynar_t whereto)
1393 .. doxygenfunction:: simgrid::s4u::Host::is_on() const
1394 .. doxygenfunction:: simgrid::s4u::Host::turn_off()
1395 .. doxygenfunction:: simgrid::s4u::Host::turn_on()
1399 .. doxygenfunction:: sg_host_is_on(const_sg_host_t host)
1400 .. doxygenfunction:: sg_host_turn_off(sg_host_t host)
1401 .. doxygenfunction:: sg_host_turn_on(sg_host_t host)
1410 .. doxygenfunction:: simgrid::s4u::Host::get_pstate() const
1411 .. doxygenfunction:: simgrid::s4u::Host::get_pstate_count() const
1412 .. doxygenfunction:: simgrid::s4u::Host::get_pstate_speed(unsigned long pstate_index) const
1413 .. doxygenfunction:: simgrid::s4u::Host::set_pstate(unsigned long pstate_index)
1415 .. group-tab:: Python
1417 .. autoattribute:: simgrid.Host.pstate
1418 .. autoattribute:: simgrid.Host.pstate_count
1419 .. automethod:: simgrid.Host.pstate_speed
1423 .. doxygenfunction:: sg_host_get_available_speed(const_sg_host_t host)
1424 .. doxygenfunction:: sg_host_get_nb_pstates(const_sg_host_t host)
1425 .. doxygenfunction:: sg_host_get_pstate(const_sg_host_t host)
1426 .. doxygenfunction:: sg_host_get_pstate_speed(const_sg_host_t host, unsigned long pstate_index)
1427 .. doxygenfunction:: sg_host_set_pstate(sg_host_t host, unsigned long pstate)
1436 .. doxygenfunction:: simgrid::s4u::Host::set_speed_profile(kernel::profile::Profile *p)
1437 .. doxygenfunction:: simgrid::s4u::Host::set_state_profile(kernel::profile::Profile *p)
1439 .. group-tab:: Python
1441 .. automethod:: simgrid.Host.set_speed_profile
1442 .. automethod:: simgrid.Host.set_state_profile
1451 .. doxygenfunction:: simgrid::s4u::Host::exec_async
1452 .. doxygenfunction:: simgrid::s4u::Host::execute(double flops) const
1453 .. doxygenfunction:: simgrid::s4u::Host::execute(double flops, double priority) const
1455 Platform and routing
1456 --------------------
1458 You can also start direct communications between two arbitrary hosts
1459 using :cpp:func:`Comm::sendto() <simgrid::s4u::Comm::sendto()>`.
1465 .. doxygenfunction:: simgrid::s4u::Host::get_englobing_zone() const
1466 .. doxygenfunction:: simgrid::s4u::Host::get_netpoint() const
1467 .. doxygenfunction:: simgrid::s4u::Host::route_to(const Host *dest, std::vector< Link * > &links, double *latency) const
1468 .. doxygenfunction:: simgrid::s4u::Host::route_to(const Host *dest, std::vector< kernel::resource::StandardLinkImpl * > &links, double *latency) const
1469 .. doxygenfunction:: simgrid::s4u::Host::create_disk(const std::string& name, double read_bandwidth, double write_bandwidth)
1470 .. doxygenfunction:: simgrid::s4u::Host::create_disk(const std::string& name, const std::string& read_bandwidth, const std::string& write_bandwidth)
1472 .. group-tab:: Python
1474 .. autoattribute:: simgrid.Host.netpoint
1475 .. automethod:: simgrid.Host.create_disk
1477 .. automethod:: simgrid.Host.route_to
1481 .. doxygenfunction:: sg_host_get_route(const_sg_host_t from, const_sg_host_t to, xbt_dynar_t links)
1482 .. doxygenfunction:: sg_host_get_route_bandwidth(const_sg_host_t from, const_sg_host_t to)
1483 .. doxygenfunction:: sg_host_get_route_latency(const_sg_host_t from, const_sg_host_t to)
1484 .. doxygenfunction:: sg_host_sendto(sg_host_t from, sg_host_t to, double byte_amount)
1493 .. doxygenfunction:: simgrid::s4u::Host::on_creation_cb
1494 .. doxygenfunction:: simgrid::s4u::Host::on_destruction_cb
1495 .. doxygenfunction:: simgrid::s4u::Host::on_speed_change_cb
1496 .. doxygenfunction:: simgrid::s4u::Host::on_state_change_cb
1508 .. doxygenclass:: simgrid::s4u::Link
1509 .. doxygenclass:: simgrid::s4u::SplitDuplexLink
1510 .. doxygenclass:: simgrid::s4u::LinkInRoute
1513 .. group-tab:: Python
1515 .. autoclass:: simgrid.Link
1526 #include <simgrid/s4u/Link.hpp>
1528 Note that there is no LinkPtr type and that you cannot use the RAII
1529 idiom on hosts because SimGrid does not allow (yet) to create nor
1530 destroy resources once the simulation is started.
1532 .. doxygenfunction:: simgrid::s4u::Link::seal()
1534 .. group-tab:: Python
1538 from simgrid import Link
1540 .. automethod:: simgrid.Link.seal
1546 #include <simgrid/link.h>
1548 .. doxygentypedef:: sg_link_t
1549 .. cpp:type:: const s4u_Link* const_sg_link_t
1551 Pointer to a constant link object.
1560 See also :cpp:func:`simgrid::s4u::Engine::get_all_links`.
1562 .. doxygenfunction:: simgrid::s4u::Link::by_name(const std::string &name)
1563 .. doxygenfunction:: simgrid::s4u::Link::by_name_or_null(const std::string &name)
1565 .. group-tab:: Python
1567 See also :py:attr:`simgrid.Engine.all_links`.
1569 .. automethod:: simgrid.Link.by_name
1570 .. autoattribute:: simgrid.Link.name
1574 .. doxygenfunction:: sg_link_by_name(const char *name)
1575 .. doxygenfunction:: sg_link_count()
1576 .. doxygenfunction:: sg_link_list()
1585 .. doxygenfunction:: simgrid::s4u::Link::get_bandwidth() const
1586 .. doxygenfunction:: simgrid::s4u::Link::get_cname() const
1587 .. doxygenfunction:: simgrid::s4u::Link::get_latency() const
1588 .. doxygenfunction:: simgrid::s4u::Link::get_name() const
1589 .. doxygenfunction:: simgrid::s4u::Link::get_sharing_policy() const
1590 .. doxygenfunction:: simgrid::s4u::Link::get_usage() const
1591 .. doxygenfunction:: simgrid::s4u::Link::is_used() const
1593 .. group-tab:: Python
1595 .. autoattribute:: simgrid.Link.bandwidth
1596 .. autoattribute:: simgrid.Link.latency
1600 .. doxygenfunction:: sg_link_get_bandwidth(const_sg_link_t link)
1601 .. doxygenfunction:: sg_link_get_latency(const_sg_link_t link)
1602 .. doxygenfunction:: sg_link_get_name(const_sg_link_t link)
1603 .. doxygenfunction:: sg_link_is_shared(const_sg_link_t link)
1605 Modifying characteristics
1606 -------------------------
1612 .. doxygenfunction:: simgrid::s4u::Link::set_bandwidth(double value)
1613 .. doxygenfunction:: simgrid::s4u::Link::set_latency(double value)
1614 .. doxygenfunction:: simgrid::s4u::Link::set_latency(const std::string& value)
1615 .. doxygenfunction:: simgrid::s4u::Link::set_concurrency_limit(int limit)
1616 .. doxygenfunction:: simgrid::s4u::Link::set_sharing_policy
1618 .. group-tab:: Python
1620 .. automethod:: simgrid.Link.set_bandwidth
1621 .. automethod:: simgrid.Link.set_latency
1622 .. automethod:: simgrid.Link.set_concurrency_limit
1623 .. automethod:: simgrid.Link.set_sharing_policy
1627 .. doxygenfunction:: sg_link_set_bandwidth(sg_link_t link, double value)
1628 .. doxygenfunction:: sg_link_set_latency(sg_link_t link, double value)
1630 User data and properties
1631 ------------------------
1637 .. doxygenfunction:: simgrid::s4u::Link::get_property(const std::string &key) const
1638 .. doxygenfunction:: simgrid::s4u::Link::set_property(const std::string &key, const std::string &value)
1642 .. doxygenfunction:: sg_link_get_data(const_sg_link_t link)
1643 .. doxygenfunction:: sg_link_set_data(sg_link_t link, void *data)
1652 See also :cpp:func:`simgrid::s4u::Link::set_state_profile`.
1654 .. doxygenfunction:: simgrid::s4u::Link::is_on() const
1655 .. doxygenfunction:: simgrid::s4u::Link::turn_off()
1656 .. doxygenfunction:: simgrid::s4u::Link::turn_on()
1658 .. group-tab:: Python
1660 See also :py:func:`simgrid.Link.set_state_profile`.
1662 .. automethod:: simgrid.Link.is_on
1663 .. automethod:: simgrid.Link.turn_off
1664 .. automethod:: simgrid.Link.turn_on
1669 See :ref:`howto_churn` for more details.
1675 .. doxygenfunction:: simgrid::s4u::Link::set_bandwidth_profile(kernel::profile::Profile *profile)
1676 .. doxygenfunction:: simgrid::s4u::Link::set_latency_profile(kernel::profile::Profile *profile)
1677 .. doxygenfunction:: simgrid::s4u::Link::set_state_profile(kernel::profile::Profile *profile)
1679 .. group-tab:: Python
1681 .. automethod:: simgrid.Link.set_bandwidth_profile
1682 .. automethod:: simgrid.Link.set_latency_profile
1683 .. automethod:: simgrid.Link.set_state_profile
1692 .. doxygenfunction:: simgrid::s4u::Link::set_host_wifi_rate
1694 .. group-tab:: Python
1696 .. automethod:: simgrid.Link.set_host_wifi_rate
1705 .. doxygenfunction:: simgrid::s4u::Link::on_bandwidth_change_cb
1706 .. doxygenfunction:: simgrid::s4u::Link::on_communication_state_change_cb
1707 .. doxygenfunction:: simgrid::s4u::Link::on_creation_cb
1708 .. doxygenfunction:: simgrid::s4u::Link::on_destruction_cb
1709 .. doxygenfunction:: simgrid::s4u::Link::on_state_change_cb
1711 .. _API_s4u_NetZone:
1721 .. doxygenclass:: simgrid::s4u::NetZone
1723 .. group-tab:: Python
1725 .. autoclass:: simgrid.NetZone
1736 #include <simgrid/s4u/NetZone.hpp>
1738 Note that there is no NetZonePtr type and that you cannot use the RAII
1739 idiom on network zones because SimGrid does not allow (yet) to create nor
1740 destroy resources once the simulation is started.
1742 .. doxygenfunction:: simgrid::s4u::NetZone::seal
1744 .. group-tab:: Python
1748 from simgrid import NetZone
1750 .. automethod:: simgrid.NetZone.seal
1756 #include <simgrid/zone.h>
1758 .. doxygentypedef:: sg_netzone_t
1759 .. cpp:type:: const s4u_NetZone* const_sg_netzone_t
1761 Pointer to a constant network zone object.
1770 See :cpp:func:`simgrid::s4u::Engine::get_netzone_root`,
1771 :cpp:func:`simgrid::s4u::Engine::netzone_by_name_or_null` and
1772 :cpp:func:`simgrid::s4u::Engine::get_filtered_netzones`.
1776 .. doxygenfunction:: sg_zone_get_by_name(const char *name)
1777 .. doxygenfunction:: sg_zone_get_root()
1786 .. doxygenfunction:: simgrid::s4u::NetZone::get_cname() const
1787 .. doxygenfunction:: simgrid::s4u::NetZone::get_name() const
1788 .. doxygenfunction:: simgrid::s4u::NetZone::get_netpoint()
1790 .. group-tab:: Python
1792 .. autoattribute:: simgrid.NetZone.name
1793 .. autoattribute:: simgrid.NetZone.netpoint
1797 .. doxygenfunction:: sg_zone_get_name(const_sg_netzone_t zone)
1799 User data and properties
1800 ------------------------
1806 .. doxygenfunction:: simgrid::s4u::NetZone::get_properties() const
1807 .. doxygenfunction:: simgrid::s4u::NetZone::get_property(const std::string &key) const
1808 .. doxygenfunction:: simgrid::s4u::NetZone::set_property(const std::string &key, const std::string &value)
1810 .. group-tab:: Python
1812 .. automethod:: simgrid.NetZone.set_property
1816 .. doxygenfunction:: sg_zone_get_property_value(const_sg_netzone_t as, const char *name)
1817 .. doxygenfunction:: sg_zone_set_property_value(sg_netzone_t netzone, const char *name, const char *value)
1819 Retrieving components
1820 ---------------------
1826 .. doxygenfunction:: simgrid::s4u::NetZone::get_all_hosts() const
1827 .. doxygenfunction:: simgrid::s4u::NetZone::get_host_count() const
1831 .. doxygenfunction:: sg_zone_get_hosts(const_sg_netzone_t zone, xbt_dynar_t whereto)
1840 .. doxygenfunction:: simgrid::s4u::NetZone::add_component(kernel::routing::NetPoint *elm)
1841 .. doxygenfunction:: simgrid::s4u::NetZone::add_route
1842 .. doxygenfunction:: simgrid::s4u::NetZone::add_bypass_route
1843 .. doxygenfunction:: simgrid::s4u::NetZone::get_children() const
1844 .. doxygenfunction:: simgrid::s4u::NetZone::get_parent() const
1845 .. doxygenfunction:: simgrid::s4u::NetZone::set_parent(const NetZone* parent)
1847 .. group-tab:: Python
1849 .. automethod:: simgrid.NetZone.add_route
1850 .. automethod:: simgrid.NetZone.set_parent
1854 .. doxygenfunction:: sg_zone_get_sons(const_sg_netzone_t zone, xbt_dict_t whereto)
1863 .. doxygenfunction:: simgrid::s4u::NetZone::on_creation_cb
1864 .. doxygenfunction:: simgrid::s4u::NetZone::on_seal_cb
1875 .. doxygenfunction:: simgrid::s4u::create_full_zone
1876 .. doxygenfunction:: simgrid::s4u::create_empty_zone
1877 .. doxygenfunction:: simgrid::s4u::create_star_zone
1878 .. doxygenfunction:: simgrid::s4u::create_dijkstra_zone
1879 .. doxygenfunction:: simgrid::s4u::create_floyd_zone
1880 .. doxygenfunction:: simgrid::s4u::create_vivaldi_zone
1881 .. doxygenfunction:: simgrid::s4u::create_wifi_zone
1882 .. doxygenfunction:: simgrid::s4u::create_torus_zone
1883 .. doxygenfunction:: simgrid::s4u::create_fatTree_zone
1884 .. doxygenfunction:: simgrid::s4u::create_dragonfly_zone
1886 .. group-tab:: Python
1888 .. automethod:: simgrid.NetZone.create_full_zone
1889 .. automethod:: simgrid.NetZone.create_empty_zone
1890 .. automethod:: simgrid.NetZone.create_star_zone
1891 .. automethod:: simgrid.NetZone.create_dijkstra_zone
1892 .. automethod:: simgrid.NetZone.create_floyd_zone
1893 .. automethod:: simgrid.NetZone.create_vivaldi_zone
1894 .. automethod:: simgrid.NetZone.create_wifi_zone
1895 .. automethod:: simgrid.NetZone.create_torus_zone
1896 .. automethod:: simgrid.NetZone.create_fatTree_zone
1897 .. automethod:: simgrid.NetZone.create_dragonfly_zone
1906 .. doxygenfunction:: simgrid::s4u::NetZone::create_host(const std::string& name, const std::vector<double>& speed_per_pstate)
1907 .. doxygenfunction:: simgrid::s4u::NetZone::create_host(const std::string& name, double speed)
1908 .. doxygenfunction:: simgrid::s4u::NetZone::create_host(const std::string& name, const std::vector<std::string>& speed_per_pstate)
1909 .. doxygenfunction:: simgrid::s4u::NetZone::create_host(const std::string& name, const std::string& speed)
1911 .. group-tab:: Python
1913 .. automethod:: simgrid.NetZone.create_host
1922 .. doxygenfunction:: simgrid::s4u::NetZone::create_link(const std::string& name, const std::vector<double>& bandwidths)
1923 .. doxygenfunction:: simgrid::s4u::NetZone::create_link(const std::string& name, double bandwidth)
1924 .. doxygenfunction:: simgrid::s4u::NetZone::create_link(const std::string& name, const std::vector<std::string>& bandwidthds)
1925 .. doxygenfunction:: simgrid::s4u::NetZone::create_link(const std::string& name, const std::string& bandwidth)
1926 .. doxygenfunction:: simgrid::s4u::NetZone::create_split_duplex_link(const std::string& name, const std::string& bandwidth)
1927 .. doxygenfunction:: simgrid::s4u::NetZone::create_split_duplex_link(const std::string& name, double bandwidth)
1929 .. group-tab:: Python
1931 .. automethod:: simgrid.NetZone.create_link
1932 .. automethod:: simgrid.NetZone.create_split_duplex_link
1941 .. doxygenfunction:: simgrid::s4u::NetZone::create_router(const std::string& name)
1943 .. group-tab:: Python
1945 .. automethod:: simgrid.NetZone.create_router
1947 .. _API_s4u_VirtualMachine:
1949 =======================
1950 class VirtualMachine
1951 =======================
1954 .. doxygenclass:: simgrid::s4u::VirtualMachine
1964 #include <simgrid/s4u/VirtualMachine.hpp>
1966 Note that there is no VirtualMachinePtr type, and that you cannot use the RAII
1967 idiom on virtual machines. There is no good reason for that and should change in the future.
1973 #include <simgrid/vm.h>
1975 .. doxygentypedef:: sg_vm_t
1976 .. cpp:type:: const s4u_VirtualMachine* const_sg_vm_t
1978 Pointer to a constant virtual machine object.
1987 .. doxygenfunction:: simgrid::s4u::Host::create_vm(const std::string &name, int core_amount)
1988 .. doxygenfunction:: simgrid::s4u::Host::create_vm(const std::string &name, int core_amount, size_t ramsize)
1989 .. doxygenfunction:: simgrid::s4u::VirtualMachine::destroy
1993 .. doxygenfunction:: sg_vm_create_core
1994 .. doxygenfunction:: sg_vm_create_multicore
1995 .. doxygenfunction:: sg_vm_destroy
2004 .. doxygenfunction:: simgrid::s4u::VirtualMachine::get_pm() const
2005 .. doxygenfunction:: simgrid::s4u::VirtualMachine::get_ramsize() const
2006 .. doxygenfunction:: simgrid::s4u::VirtualMachine::get_state() const
2008 .. doxygenfunction:: simgrid::s4u::VirtualMachine::set_bound(double bound)
2009 .. doxygenfunction:: simgrid::s4u::VirtualMachine::set_pm(Host *pm)
2010 .. doxygenfunction:: simgrid::s4u::VirtualMachine::set_ramsize(size_t ramsize)
2014 .. doxygenfunction:: sg_vm_get_ramsize(const_sg_vm_t vm)
2015 .. doxygenfunction:: sg_vm_set_bound(sg_vm_t vm, double bound)
2016 .. doxygenfunction:: sg_vm_set_ramsize(sg_vm_t vm, size_t size)
2018 .. doxygenfunction:: sg_vm_get_name
2019 .. doxygenfunction:: sg_vm_get_pm
2020 .. doxygenfunction:: sg_vm_is_created
2021 .. doxygenfunction:: sg_vm_is_running
2022 .. doxygenfunction:: sg_vm_is_suspended
2031 .. doxygenfunction:: simgrid::s4u::VirtualMachine::resume()
2032 .. doxygenfunction:: simgrid::s4u::VirtualMachine::shutdown()
2033 .. doxygenfunction:: simgrid::s4u::VirtualMachine::start()
2034 .. doxygenfunction:: simgrid::s4u::VirtualMachine::suspend()
2038 .. doxygenfunction:: sg_vm_start
2039 .. doxygenfunction:: sg_vm_suspend
2040 .. doxygenfunction:: sg_vm_resume
2041 .. doxygenfunction:: sg_vm_shutdown
2050 .. doxygenfunction:: simgrid::s4u::VirtualMachine::on_creation_cb
2051 .. doxygenfunction:: simgrid::s4u::VirtualMachine::on_destruction_cb
2052 .. doxygenfunction:: simgrid::s4u::VirtualMachine::on_migration_end_cb
2053 .. doxygenfunction:: simgrid::s4u::VirtualMachine::on_migration_start_cb
2054 .. doxygenfunction:: simgrid::s4u::VirtualMachine::on_resume_cb
2055 .. doxygenfunction:: simgrid::s4u::VirtualMachine::on_shutdown_cb
2056 .. doxygenfunction:: simgrid::s4u::VirtualMachine::on_start_cb
2057 .. doxygenfunction:: simgrid::s4u::VirtualMachine::on_started_cb
2058 .. doxygenfunction:: simgrid::s4u::VirtualMachine::on_suspend_cb
2060 .. _API_s4u_Activity:
2070 .. doxygenclass:: simgrid::s4u::Activity
2072 **Known subclasses:**
2073 :ref:`Communications <API_s4u_Comm>` (started on Mailboxes and consuming links),
2074 :ref:`Executions <API_s4u_Exec>` (started on Host and consuming CPU resources)
2075 :ref:`I/O <API_s4u_Io>` (started on and consuming disks).
2076 See also the :ref:`section on activities <s4u_Activities>` above.
2087 #include <simgrid/s4u/Activity.hpp>
2089 .. doxygentypedef:: ActivityPtr
2098 .. doxygenfunction:: simgrid::s4u::Activity::get_cname
2099 .. doxygenfunction:: simgrid::s4u::Activity::get_name
2100 .. doxygenfunction:: simgrid::s4u::Activity::get_remaining() const
2101 .. doxygenfunction:: simgrid::s4u::Activity::get_state() const
2102 .. doxygenfunction:: simgrid::s4u::Activity::set_remaining(double remains)
2103 .. doxygenfunction:: simgrid::s4u::Activity::set_state(Activity::State state)
2106 Activities life cycle
2107 ---------------------
2113 .. doxygenfunction:: simgrid::s4u::Activity::start
2114 .. doxygenfunction:: simgrid::s4u::Activity::cancel
2115 .. doxygenfunction:: simgrid::s4u::Activity::test
2116 .. doxygenfunction:: simgrid::s4u::Activity::wait
2117 .. doxygenfunction:: simgrid::s4u::Activity::wait_for
2118 .. doxygenfunction:: simgrid::s4u::Activity::wait_until(double time_limit)
2119 .. doxygenfunction:: simgrid::s4u::Activity::vetoable_start()
2121 Suspending and resuming an activity
2122 -----------------------------------
2128 .. doxygenfunction:: simgrid::s4u::Activity::suspend
2129 .. doxygenfunction:: simgrid::s4u::Activity::resume
2130 .. doxygenfunction:: simgrid::s4u::Activity::is_suspended
2139 .. doxygenfunction:: simgrid::s4u::Activity::on_completion_cb
2140 .. doxygenfunction:: simgrid::s4u::Activity::on_suspended_cb
2141 .. doxygenfunction:: simgrid::s4u::Activity::on_resumed_cb
2153 .. doxygenclass:: simgrid::s4u::Comm
2155 .. group-tab:: Python
2157 .. autoclass:: simgrid.Comm
2168 #include <simgrid/s4u/Comm.hpp>
2170 .. doxygentypedef:: CommPtr
2172 .. group-tab:: Python
2176 from simgrid import Comm
2182 #include <simgrid/comm.h>
2184 .. doxygentypedef:: sg_comm_t
2193 .. doxygenfunction:: simgrid::s4u::Comm::get_dst_data_size() const
2194 .. doxygenfunction:: simgrid::s4u::Comm::get_mailbox() const
2195 .. doxygenfunction:: simgrid::s4u::Comm::get_sender() const
2196 .. doxygenfunction:: simgrid::s4u::Comm::set_dst_data(void **buff)
2197 .. doxygenfunction:: simgrid::s4u::Comm::set_dst_data(void **buff, size_t size)
2198 .. doxygenfunction:: simgrid::s4u::Comm::detach()
2199 .. doxygenfunction:: simgrid::s4u::Comm::detach(const std::function<void(void*)>& clean_function)
2200 .. doxygenfunction:: simgrid::s4u::Comm::set_payload_size(uint64_t bytes)
2201 .. doxygenfunction:: simgrid::s4u::Comm::set_rate(double rate)
2202 .. doxygenfunction:: simgrid::s4u::Comm::set_src_data(void *buff)
2203 .. doxygenfunction:: simgrid::s4u::Comm::set_src_data(void *buff, size_t size)
2204 .. doxygenfunction:: simgrid::s4u::Comm::set_src_data_size(size_t size)
2206 .. group-tab:: Python
2208 .. autoattribute:: simgrid.Comm.dst_data_size
2209 .. autoattribute:: simgrid.Comm.mailbox
2210 .. autoattribute:: simgrid.Comm.sender
2211 .. autoattribute:: simgrid.Comm.state_str
2212 .. automethod:: simgrid.Comm.detach
2213 .. automethod:: simgrid.Comm.set_payload_size
2214 .. automethod:: simgrid.Comm.set_rate
2219 Most communications are created using :ref:`s4u_mailbox`, but you can
2220 also start direct communications as shown below.
2226 .. doxygenfunction:: simgrid::s4u::Comm::sendto
2227 .. doxygenfunction:: simgrid::s4u::Comm::sendto_init()
2228 .. doxygenfunction:: simgrid::s4u::Comm::sendto_init(Host *from, Host *to)
2229 .. doxygenfunction:: simgrid::s4u::Comm::sendto_async
2231 .. doxygenfunction:: simgrid::s4u::Comm::cancel
2232 .. doxygenfunction:: simgrid::s4u::Comm::start
2233 .. doxygenfunction:: simgrid::s4u::Comm::test
2234 .. doxygenfunction:: simgrid::s4u::Comm::test_any(const std::vector< CommPtr >& comms)
2235 .. doxygenfunction:: simgrid::s4u::Comm::wait
2236 .. doxygenfunction:: simgrid::s4u::Comm::wait_all(const std::vector< CommPtr >& comms)
2237 .. doxygenfunction:: simgrid::s4u::Comm::wait_all_for(const std::vector< CommPtr >& comms, double timeout)
2238 .. doxygenfunction:: simgrid::s4u::Comm::wait_any(const std::vector< CommPtr >& comms)
2239 .. doxygenfunction:: simgrid::s4u::Comm::wait_any_for(const std::vector< CommPtr >& comms, double timeout)
2240 .. doxygenfunction:: simgrid::s4u::Comm::wait_for
2241 .. doxygenfunction:: simgrid::s4u::Comm::wait_until
2243 .. group-tab:: Python
2245 .. automethod:: simgrid.Comm.sendto
2246 .. automethod:: simgrid.Comm.sendto_init
2247 .. automethod:: simgrid.Comm.sendto_async
2249 .. automethod:: simgrid.Comm.cancel
2250 .. automethod:: simgrid.Comm.start
2251 .. automethod:: simgrid.Comm.test
2252 .. automethod:: simgrid.Comm.test_any
2253 .. automethod:: simgrid.Comm.wait
2254 .. automethod:: simgrid.Comm.wait_for
2255 .. automethod:: simgrid.Comm.wait_all
2256 .. automethod:: simgrid.Comm.wait_all_for
2257 .. automethod:: simgrid.Comm.wait_any
2258 .. automethod:: simgrid.Comm.wait_any_for
2259 .. automethod:: simgrid.Comm.wait_until
2263 .. doxygenfunction:: sg_comm_test
2264 .. doxygenfunction:: sg_comm_wait
2265 .. doxygenfunction:: sg_comm_wait_all
2266 .. doxygenfunction:: sg_comm_wait_any
2275 .. doxygenfunction:: simgrid::s4u::Comm::on_start_cb
2276 .. doxygenfunction:: simgrid::s4u::Comm::on_completion_cb
2277 .. doxygenfunction:: simgrid::s4u::Comm::on_recv_cb
2278 .. doxygenfunction:: simgrid::s4u::Comm::on_send_cb
2290 .. doxygenclass:: simgrid::s4u::Exec
2292 .. group-tab:: Python
2294 .. autoclass:: simgrid.Exec
2305 #include <simgrid/s4u/Exec.hpp>
2307 .. doxygentypedef:: ExecPtr
2309 .. group-tab:: Python
2313 from simgrid import Exec
2319 #include <simgrid/exec.h>
2321 .. doxygentypedef:: sg_exec_t
2322 .. doxygentypedef:: const_sg_exec_t
2331 .. doxygenfunction:: simgrid::s4u::Exec::get_cost() const
2332 .. doxygenfunction:: simgrid::s4u::Exec::get_finish_time() const
2333 .. doxygenfunction:: simgrid::s4u::Exec::get_host() const
2334 .. doxygenfunction:: simgrid::s4u::Exec::get_host_number() const
2335 .. doxygenfunction:: simgrid::s4u::Exec::get_remaining
2336 .. doxygenfunction:: simgrid::s4u::Exec::get_remaining_ratio
2337 .. doxygenfunction:: simgrid::s4u::Exec::get_start_time() const
2338 .. doxygenfunction:: simgrid::s4u::Exec::set_bound(double bound)
2339 .. doxygenfunction:: simgrid::s4u::Exec::set_host
2340 .. doxygenfunction:: simgrid::s4u::Exec::set_priority(double priority)
2342 .. group-tab:: Python
2344 .. autoattribute:: simgrid.Exec.host
2345 .. autoattribute:: simgrid.Exec.remaining
2346 .. autoattribute:: simgrid.Exec.remaining_ratio
2350 .. doxygenfunction:: sg_exec_set_bound(sg_exec_t exec, double bound)
2351 .. doxygenfunction:: sg_exec_get_name(const_sg_exec_t exec)
2352 .. doxygenfunction:: sg_exec_set_name(sg_exec_t exec, const char* name)
2353 .. doxygenfunction:: sg_exec_set_host(sg_exec_t exec, sg_host_t new_host)
2354 .. doxygenfunction:: sg_exec_get_remaining(const_sg_exec_t exec)
2355 .. doxygenfunction:: sg_exec_get_remaining_ratio(const_sg_exec_t exec)
2364 .. doxygenfunction:: simgrid::s4u::Exec::cancel
2365 .. doxygenfunction:: simgrid::s4u::Exec::start
2366 .. doxygenfunction:: simgrid::s4u::Exec::test
2367 .. doxygenfunction:: simgrid::s4u::Exec::wait
2368 .. doxygenfunction:: simgrid::s4u::Exec::wait_any(const std::vector< ExecPtr >& execs)
2369 .. doxygenfunction:: simgrid::s4u::Exec::wait_any_for(const std::vector< ExecPtr >& execs, double timeout)
2370 .. doxygenfunction:: simgrid::s4u::Exec::wait_for
2372 .. group-tab:: Python
2374 .. automethod:: simgrid.Exec.cancel
2375 .. automethod:: simgrid.Exec.start
2376 .. automethod:: simgrid.Exec.test
2377 .. automethod:: simgrid.Exec.wait
2381 .. doxygenfunction:: sg_exec_start(sg_exec_t exec)
2382 .. doxygenfunction:: sg_exec_cancel(sg_exec_t exec);
2383 .. doxygenfunction:: sg_exec_test(sg_exec_t exec);
2384 .. doxygenfunction:: sg_exec_wait(sg_exec_t exec);
2385 .. doxygenfunction:: sg_exec_wait_for(sg_exec_t exec, double timeout);
2386 .. doxygenfunction:: sg_exec_wait_any_for(sg_exec_t* execs, size_t count, double timeout);
2387 .. doxygenfunction:: sg_exec_wait_any(sg_exec_t* execs, size_t count);
2396 .. doxygenfunction:: simgrid::s4u::Exec::on_start_cb
2397 .. doxygenfunction:: simgrid::s4u::Exec::on_completion_cb
2409 .. doxygenclass:: simgrid::s4u::Io
2411 .. group-tab:: Python
2413 .. autoclass:: simgrid.Io
2424 #include <simgrid/s4u/Io.hpp>
2426 .. doxygentypedef:: IoPtr
2435 .. doxygenfunction:: simgrid::s4u::Io::get_performed_ioops() const
2436 .. doxygenfunction:: simgrid::s4u::Io::get_remaining
2445 .. doxygenfunction:: simgrid::s4u::Io::cancel
2446 .. doxygenfunction:: simgrid::s4u::Io::start
2447 .. doxygenfunction:: simgrid::s4u::Io::test
2448 .. doxygenfunction:: simgrid::s4u::Io::wait
2449 .. doxygenfunction:: simgrid::s4u::Io::wait_for
2450 .. doxygenfunction:: simgrid::s4u::Io::wait_any(const std::vector<IoPtr> &ios)
2451 .. doxygenfunction:: simgrid::s4u::Io::wait_any_for(const std::vector<IoPtr> &ios, double timeout)
2453 .. group-tab:: Python
2455 .. automethod:: simgrid.Io.test
2456 .. automethod:: simgrid.Io.wait
2457 .. automethod:: simgrid.Io.wait_any_for
2458 .. automethod:: simgrid.Io.wait_any
2467 .. doxygenfunction:: simgrid::s4u::Io::on_start_cb
2468 .. doxygenfunction:: simgrid::s4u::Io::on_completion_cb
2470 .. _API_s4u_Synchronizations:
2472 =======================
2473 Synchronization Objects
2474 =======================
2486 .. doxygenclass:: simgrid::s4u::Mutex
2488 .. group-tab:: Python
2490 .. autoclass:: simgrid.Mutex
2501 #include <simgrid/s4u/Mutex.hpp>
2503 .. doxygentypedef:: MutexPtr
2505 .. doxygenfunction:: simgrid::s4u::Mutex::create()
2507 .. group-tab:: Python
2509 .. code-block:: Python
2511 from simgrid import Mutex
2514 # Use a context manager to acquire and automatically release the mutex
2515 # when leaving the scope.
2517 # Access shared resource ...
2520 .. automethod:: simgrid.Mutex.__init__
2526 #include <simgrid/mutex.h>
2528 .. doxygentypedef:: sg_mutex_t
2529 .. cpp:type:: const s4u_Mutex* const_sg_mutex_t
2531 Pointer to a constant mutex object.
2533 .. doxygenfunction:: sg_mutex_init()
2534 .. doxygenfunction:: sg_mutex_destroy(const_sg_mutex_t mutex)
2543 .. doxygenfunction:: simgrid::s4u::Mutex::lock()
2544 .. doxygenfunction:: simgrid::s4u::Mutex::try_lock()
2545 .. doxygenfunction:: simgrid::s4u::Mutex::unlock()
2547 .. group-tab:: Python
2549 .. automethod:: simgrid.Mutex.lock
2550 .. automethod:: simgrid.Mutex.try_lock
2551 .. automethod:: simgrid.Mutex.unlock
2555 .. doxygenfunction:: sg_mutex_lock(sg_mutex_t mutex)
2556 .. doxygenfunction:: sg_mutex_try_lock(sg_mutex_t mutex)
2557 .. doxygenfunction:: sg_mutex_unlock(sg_mutex_t mutex)
2559 .. _API_s4u_Barrier:
2569 .. doxygenclass:: simgrid::s4u::Barrier
2571 .. group-tab:: Python
2573 .. autoclass:: simgrid.Barrier
2581 #include <simgrid/s4u/Barrier.hpp>
2583 .. doxygentypedef:: BarrierPtr
2585 .. doxygenfunction:: simgrid::s4u::Barrier::create(unsigned int expected_actors)
2586 .. doxygenfunction:: simgrid::s4u::Barrier::wait()
2588 .. group-tab:: Python
2590 .. code-block:: Python
2592 from simgrid import Barrier
2593 barrier = Barrier(2)
2595 .. automethod:: simgrid.Barrier.__init__
2596 .. automethod:: simgrid.Barrier.wait
2602 #include <simgrid/barrier.hpp>
2604 .. doxygentypedef:: sg_bar_t
2606 .. doxygenfunction:: sg_barrier_init(unsigned int count)
2607 .. doxygenfunction:: sg_barrier_destroy(sg_bar_t bar)
2608 .. doxygenfunction:: sg_barrier_wait(sg_bar_t bar)
2611 .. _API_s4u_ConditionVariable:
2613 ==========================
2614 Condition variable
2615 ==========================
2617 .. doxygenclass:: simgrid::s4u::ConditionVariable
2628 #include <simgrid/s4u/ConditionVariable.hpp>
2630 .. doxygentypedef:: ConditionVariablePtr
2632 .. doxygenfunction:: simgrid::s4u::ConditionVariable::create()
2638 #include <simgrid/cond.h>
2640 .. doxygentypedef:: sg_cond_t
2641 .. doxygentypedef:: const_sg_cond_t
2642 .. doxygenfunction:: sg_cond_init
2643 .. doxygenfunction:: sg_cond_destroy
2645 Waiting and notifying
2646 ---------------------
2652 .. doxygenfunction:: simgrid::s4u::ConditionVariable::notify_all()
2653 .. doxygenfunction:: simgrid::s4u::ConditionVariable::notify_one()
2654 .. doxygenfunction:: simgrid::s4u::ConditionVariable::wait(s4u::MutexPtr lock)
2655 .. doxygenfunction:: simgrid::s4u::ConditionVariable::wait(const std::unique_lock< s4u::Mutex > &lock)
2656 .. doxygenfunction:: simgrid::s4u::ConditionVariable::wait(const std::unique_lock< Mutex > &lock, P pred)
2657 .. doxygenfunction:: simgrid::s4u::ConditionVariable::wait_for(const std::unique_lock< s4u::Mutex > &lock, double duration)
2658 .. doxygenfunction:: simgrid::s4u::ConditionVariable::wait_for(const std::unique_lock< s4u::Mutex > &lock, double duration, P pred)
2659 .. doxygenfunction:: simgrid::s4u::ConditionVariable::wait_for(const std::unique_lock< s4u::Mutex > &lock, std::chrono::duration< Rep, Period > duration)
2660 .. doxygenfunction:: simgrid::s4u::ConditionVariable::wait_for(const std::unique_lock< s4u::Mutex > &lock, std::chrono::duration< Rep, Period > duration, P pred)
2661 .. doxygenfunction:: simgrid::s4u::ConditionVariable::wait_until(const std::unique_lock< s4u::Mutex > &lock, const SimulationTimePoint< Duration > &timeout_time)
2662 .. doxygenfunction:: simgrid::s4u::ConditionVariable::wait_until(const std::unique_lock< s4u::Mutex > &lock, const SimulationTimePoint< Duration > &timeout_time, P pred)
2663 .. doxygenfunction:: simgrid::s4u::ConditionVariable::wait_until(const std::unique_lock< s4u::Mutex > &lock, double timeout_time)
2664 .. doxygenfunction:: simgrid::s4u::ConditionVariable::wait_until(const std::unique_lock< s4u::Mutex > &lock, double timeout_time, P pred)
2668 .. doxygenfunction:: sg_cond_notify_all
2669 .. doxygenfunction:: sg_cond_notify_one
2670 .. doxygenfunction:: sg_cond_wait
2671 .. doxygenfunction:: sg_cond_wait_for
2673 .. _API_s4u_Semaphore:
2683 .. doxygenclass:: simgrid::s4u::Semaphore
2685 .. group-tab:: Python
2687 .. autoclass:: simgrid.Semaphore
2698 #include <simgrid/s4u/Semaphore.hpp>
2700 .. doxygentypedef:: SemaphorePtr
2701 .. doxygenfunction:: simgrid::s4u::Semaphore::create(unsigned int initial_capacity)
2703 .. group-tab:: Python
2705 .. code-block:: Python
2707 from simgrid import Semaphore
2708 semaphore = Semaphore(1)
2709 # Automatically acquire the semaphore, and release it after leaving the scope.
2711 # Do something with the shared resource
2714 .. automethod:: simgrid.Semaphore.__init__
2720 #include <simgrid/semaphore.h>
2722 .. doxygentypedef:: sg_sem_t
2723 .. cpp:type:: const s4u_Semaphore* const_sg_sem_t
2725 Pointer to a constant semaphore object.
2727 .. doxygenfunction:: sg_sem_init(int initial_value)
2728 .. doxygenfunction:: sg_sem_destroy(const_sg_sem_t sem)
2737 .. doxygenfunction:: simgrid::s4u::Semaphore::acquire()
2738 .. doxygenfunction:: simgrid::s4u::Semaphore::acquire_timeout(double timeout)
2739 .. doxygenfunction:: simgrid::s4u::Semaphore::get_capacity() const
2740 .. doxygenfunction:: simgrid::s4u::Semaphore::release()
2741 .. doxygenfunction:: simgrid::s4u::Semaphore::would_block() const
2743 .. group-tab:: Python
2745 .. automethod:: simgrid.Semaphore.acquire
2746 .. automethod:: simgrid.Semaphore.acquire_timeout
2747 .. autoattribute:: simgrid.Semaphore.capacity
2748 .. automethod:: simgrid.Semaphore.release
2749 .. autoattribute:: simgrid.Semaphore.would_block
2753 .. doxygenfunction:: sg_sem_acquire(sg_sem_t sem)
2754 .. doxygenfunction:: sg_sem_acquire_timeout(sg_sem_t sem, double timeout)
2755 .. doxygenfunction:: sg_sem_get_capacity(const_sg_sem_t sem)
2756 .. doxygenfunction:: sg_sem_release(sg_sem_t sem)
2757 .. doxygenfunction:: sg_sem_would_block(const_sg_sem_t sem)