Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
b768946bc5c4b7d4abf038cea8936b727f4a5c4c
[simgrid.git] / docs / source / app_s4u.rst
1 .. _S4U_doc:
2
3 The S4U Interface
4 #################
5
6 .. raw:: html
7
8    <object id="TOC" data="graphical-toc.svg" type="image/svg+xml"></object>
9    <script>
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";
13    }
14    </script>
15    <br/>
16    <br/>
17
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
21 settings.
22
23 Since v3.33 (Spring 2023), S4U is the main interface of SimGrid for algorithms.
24 It is feature complete, but may still evolve slightly in future releases.
25 When this happens, compiling your code will produce deprecation warnings for 4
26 releases (one year) before the removal of the old symbols.
27
28 .. _S4U_main_concepts:
29
30 Main Concepts
31 *************
32
33 A typical SimGrid simulation is composed of several |API_s4u_Actors|_, that
34 execute user-provided functions. The actors have to explicitly use the
35 S4U interface to express their :ref:`computation <API_s4u_Exec>`,
36 :ref:`communication <API_s4u_Comm>`, :ref:`disk usage <API_s4u_Io>`,
37 and other |API_s4u_Activities|_, so that they get reflected within the
38 simulator. These activities take place on resources such as |API_s4u_Hosts|_,
39 |API_s4u_Links|_, and |API_s4u_Disks|_. SimGrid predicts the time taken by each
40 activity and orchestrates the actors accordingly, waiting for the
41 completion of these activities.
42
43
44 When **communicating**, data is not directly sent to other actors but
45 posted onto a |API_s4u_Mailbox|_ that serves as a rendezvous point between
46 communicating actors. This means that you don't need to know who you
47 are talking to, you just put your communication `Put` request in a
48 mailbox, and it will be matched with a complementary `Get`
49 request.  Alternatively, actors can interact through **classical
50 synchronization mechanisms** such as |API_s4u_Barrier|_, |API_s4u_Semaphore|_,
51 |API_s4u_Mutex|_, and |API_s4u_ConditionVariable|_.
52
53 Each actor is located on a simulated |API_s4u_Host|_. Each host is located
54 in a |API_s4u_NetZone|_, that knows the networking path between one
55 resource to another. Each NetZone is included in another one, forming
56 a tree of NetZones which root zone contains the whole platform. The
57 actors can also be located on a |API_s4U_VirtualMachine|_ that may
58 restrict the activities it contains to a limited amount of cores.
59 Virtual machines can also be migrated between hosts.
60
61 The :ref:`simgrid::s4u::this_actor <API_s4u_this_actor>` namespace
62 provides many helper functions to simplify the code of actors.
63
64 .. rst-class:: compact-list
65
66    - **Simulation Elements**
67
68       - :ref:`class Actor <API_s4u_Actor>`: Active entities executing your application.
69       - :ref:`class Engine <API_s4u_Engine>`: Simulation engine (singleton).
70       - :ref:`class Mailbox <API_s4u_Mailbox>`: Communication rendezvous, with which actors meet each other.
71
72    - **Resources**
73
74       - :ref:`class Disk <API_s4u_Disk>`: Resource on which actors can write and read data.
75       - :ref:`class Host <API_s4u_Host>`: Actor location, providing computational power.
76       - :ref:`class Link <API_s4u_Link>`: Interconnecting hosts.
77       - :ref:`class NetZone <API_s4u_NetZone>`: Sub-region of the platform, containing resources (Hosts, Links, etc).
78       - :ref:`class VirtualMachine <API_s4u_VirtualMachine>`: Execution containers that can be moved between Hosts.
79
80    - **Activities** (:ref:`class Activity <API_s4u_Activity>`): The things that actors can do on resources.
81
82       - :ref:`class Comm <API_s4u_Comm>`: Communication activity, started on Mailboxes and consuming links.
83       - :ref:`class Exec <API_s4u_Exec>`: Computation activity, started on Host and consuming CPU resources.
84       - :ref:`class Io <API_s4u_Io>`: I/O activity, started on and consuming disks.
85
86    - **Synchronization Objects**: Classical IPC that actors can use
87
88       - :ref:`class Barrier <API_s4u_Barrier>`
89       - :ref:`class ConditionVariable <API_s4u_ConditionVariable>`
90       - :ref:`class Mutex <API_s4u_Mutex>`
91       - :ref:`class Semaphore <API_s4u_Semaphore>`
92
93 .. |API_s4u_Actors| replace:: **Actors**
94 .. _API_s4u_Actors: #api-s4u-actor
95
96 .. |API_s4u_Activities| replace:: **Activities**
97 .. _API_s4u_Activities: #api-s4u-activity
98
99 .. |API_s4u_Hosts| replace:: **Hosts**
100 .. _API_s4u_Hosts: #api-s4u-host
101
102 .. |API_s4u_Links| replace:: **Links**
103 .. _API_s4u_Links: #api-s4u-link
104
105 .. |API_s4u_Disks| replace:: **Disks**
106 .. _API_s4u_Disks: #api-s4u-disk
107
108 .. |API_s4u_VirtualMachine| replace:: **VirtualMachines**
109
110 .. |API_s4u_Host| replace:: **Host**
111
112 .. |API_s4u_Mailbox| replace:: **Mailbox**
113
114 .. |API_s4u_Mailboxes| replace:: **Mailboxes**
115 .. _API_s4u_Mailboxes: #s4u-mailbox
116
117 .. |API_s4u_NetZone| replace:: **NetZone**
118
119 .. |API_s4u_Barrier| replace:: **Barrier**
120
121 .. |API_s4u_Semaphore| replace:: **Semaphore**
122
123 .. |API_s4u_ConditionVariable| replace:: **ConditionVariable**
124
125 .. |API_s4u_Mutex| replace:: **Mutex**
126
127 .. _s4u_Activities:
128
129 Activities
130 **********
131
132 Activities represent the actions that consume a resource, such as a
133 :ref:`Comm <API_s4u_Comm>` that consumes the *transmitting power* of
134 :ref:`Link <API_s4u_Link>` resources, or an :ref:`Exec <API_s4u_Exec>`
135 that consumes the *computing power* of :ref:`Host <API_s4u_Host>` resources.
136 See also the :ref:`full API <API_s4u_Activity>` below.
137
138 =======================
139 Asynchronous Activities
140 =======================
141
142 Every activity can be either **blocking** or **asynchronous**. For
143 example, :cpp:func:`s4u::Mailbox::put() <simgrid::s4u::Mailbox::put>`
144 and :cpp:func:`s4u::Mailbox::get() <simgrid::s4u::Mailbox::get>`
145 create blocking communications: the actor is blocked until the
146 completion of that communication. Asynchronous communications do not
147 block the actor during their execution but progress on their own.
148
149 Once your asynchronous activity is started, you can test for its
150 completion using :cpp:func:`s4u::Activity::test() <simgrid::s4u::Activity::test>`.
151 This function returns ``true`` if the activity is completed already.
152 You can also use :cpp:func:`s4u::Activity::wait() <simgrid::s4u::Activity::wait>`
153 to block until the completion of the activity. To wait for at most a given amount of time,
154 use  :cpp:func:`s4u::Activity::wait_for() <simgrid::s4u::Activity::wait_for>`.
155 Finally, to wait at most until a specified time limit, use
156 :cpp:func:`s4u::Activity::wait_until() <simgrid::s4u::Activity::wait_until>`.
157
158 Every kind of activity can be asynchronous.
159 :ref:`s4u::CommPtr <API_s4u_Comm>` are created with :cpp:func:`s4u::Mailbox::put_async() <simgrid::s4u::Mailbox::put_async>` and
160 :cpp:func:`s4u::Mailbox::get_async() <simgrid::s4u::Mailbox::get_async>`;
161 :ref:`s4u::IoPtr <API_s4u_Io>` are created with :cpp:func:`s4u::Disk::read_async() <simgrid::s4u::Disk::read_async>` and
162 :cpp:func:`s4u::Disk::write_async() <simgrid::s4u::Disk::write_async>`; and
163 :ref:`s4u::ExecPtr <API_s4u_Exec>` are created with
164 :cpp:func:`s4u::Host::exec_async() <simgrid::s4u::Host::exec_async>`.
165 In the future, it will become possible to have asynchronous IPC such as asynchronous mutex lock requests.
166
167 The following example shows how to have several concurrent
168 communications ongoing.  First, you have to declare a vector in which
169 we will store the ongoing communications. It is also useful to have a
170 vector of mailboxes.
171
172 .. literalinclude:: ../../examples/cpp/comm-waitall/s4u-comm-waitall.cpp
173    :language: c++
174    :start-after: init-begin
175    :end-before: init-end
176    :dedent: 2
177
178 Then, you start all the communications that should occur concurrently with
179 :cpp:func:`s4u::Mailbox::put_async() <simgrid::s4u::Mailbox::put_async>`.
180 Finally, the actor waits for the completion of all of them at once
181 with :cpp:func:`s4u::Comm::wait_all() <simgrid::s4u::Comm::wait_all>`.
182
183 .. literalinclude:: ../../examples/cpp/comm-waitall/s4u-comm-waitall.cpp
184    :language: c++
185    :start-after: put-begin
186    :end-before: put-end
187    :dedent: 2
188
189 =====================
190 Activities Life cycle
191 =====================
192
193 Sometimes, you want to change the setting of an activity before it even starts.
194
195 .. todo:: write this section
196
197 .. _s4u_mailbox:
198
199 Mailboxes
200 *********
201
202 Please also refer to the :ref:`API reference for s4u::Mailbox
203 <API_s4u_Mailbox>`.
204
205 ===================
206 What are Mailboxes?
207 ===================
208
209 |API_s4u_Mailboxes|_ are rendezvous points for network communications,
210 similar to URLs on which you could post and retrieve data. Actually,
211 the mailboxes are not involved in the communication once it starts,
212 but only to find the contact with which you want to communicate.
213
214 They are similar to many common things: The phone number, which allows
215 the caller to find the receiver. The Twitter hashtag, which helps
216 senders and receivers to find each other. In TCP, the pair
217 ``{host name, host port}`` to which you can connect to find your peer.
218 In HTTP, URLs through which the clients can connect to the servers.
219 In ZeroMQ, the queues are used to match senders and receivers.
220
221 One big difference with most of these systems is that no actor is the
222 exclusive owner of a mailbox, neither in sending nor in receiving.
223 Many actors can send into and/or receive from the same mailbox.  TCP
224 socket ports for example are shared on the sender side but exclusive
225 on the receiver side (only one process can receive from a given socket
226 at a given point of time).
227
228 A big difference with TCP sockets or MPI communications is that
229 communications do not start right away after a
230 :cpp:func:`Mailbox::put() <simgrid::s4u::Mailbox::put>`, but wait
231 for the corresponding :cpp:func:`Mailbox::get() <simgrid::s4u::Mailbox::get>`.
232 You can change this by :ref:`declaring a receiving actor <s4u_receiving_actor>`.
233
234 A big difference with Twitter hashtags is that SimGrid does not
235 offer easy support to broadcast a given message to many
236 receivers. So that would be like a Twitter tag where each message
237 is consumed by the first receiver.
238
239 A big difference with the ZeroMQ queues is that you cannot filter
240 on the data you want to get from the mailbox. To model such settings
241 in SimGrid, you'd have one mailbox per potential topic, and subscribe
242 to each topic individually with a
243 :cpp:func:`get_async() <simgrid::s4u::Mailbox::get_async>` on each mailbox.
244 Then, use :cpp:func:`Comm::wait_any() <simgrid::s4u::Comm::wait_any>`
245 to get the first message on any of the mailboxes you are subscribed to.
246
247 The mailboxes are not located on the network, and you can access
248 them without any latency. The network delays are only related to the
249 location of the sender and receiver once the match between them is
250 done on the mailbox. This is just like the phone number that you
251 can use locally, and the geographical distance only comes into play
252 once you start the communication by dialing this number.
253
254 =====================
255 How to use Mailboxes?
256 =====================
257
258 You can retrieve any existing mailbox from its name (which is a
259 unique string, just like a Twitter tag). This results in a
260 versatile tool that can be used to build many different
261 situations.
262
263 To model classical socket communications, use "hostname:port" as
264 mailbox names, and make sure that only one actor reads into a given
265 mailbox. This does not make it easy to build a perfectly realistic
266 model of the TCP sockets, but in most cases, this system is too
267 cumbersome for your simulations anyway. You probably want something
268 simpler, that turns out to be easy to build with the mailboxes.
269
270 Many SimGrid examples use a sort of yellow page system where the
271 mailbox names are the name of the service (such as "worker",
272 "master", or "reducer"). That way, you don't have to know where your
273 peer is located to contact it. You don't even need its name. Its
274 function is enough for that. This also gives you some sort of load
275 balancing for free if more than one actor pulls from the mailbox:
276 the first actor that can deal with the request will handle it.
277
278 =========================================
279 How are put() and get() requests matched?
280 =========================================
281
282 The matching algorithm simple: first come, first serve. When a new
283 send arrives, it matches the oldest enqueued receive. If no receive is
284 currently enqueued, then the incoming send is enqueued. As you can
285 see, the mailbox cannot contain both send and receive requests: all
286 enqueued requests must be of the same sort.
287
288 .. _s4u_receiving_actor:
289
290 ===========================
291 Declaring a Receiving Actor
292 ===========================
293
294 The last twist is that by default in the simulator, the data starts
295 to be exchanged only when both the sender and the receiver are
296 announced (it waits until both :cpp:func:`put() <simgrid::s4u::Mailbox::put()>`
297 and :cpp:func:`get() <simgrid::s4u::Mailbox::get()>` are posted).
298 In TCP, since you establish connections beforehand, the data starts to
299 flow as soon as the sender posts it, even if the receiver did not post
300 its :cpp:func:`put() <simgrid::s4u::Mailbox::put()>` yet.
301
302 To model this in SimGrid, you can declare a specific receiver to a
303 given mailbox (with the function
304 :cpp:func:`set_receiver() <simgrid::s4u::Mailbox::set_receiver()>`).
305 That way, any :cpp:func:`put() <simgrid::s4u::Mailbox::put()>`
306 posted to that mailbox will start as soon as possible, and the data
307 will already be there on the receiver host when the receiver actor
308 posts its :cpp:func:`get() <simgrid::s4u::Mailbox::get()>`
309
310 Note that being permanent receivers of a mailbox prevents actors to be
311 garbage-collected. If your simulation creates many short-lived actors
312 that are marked as permanent receiver, you should call
313 ``mailbox->set_receiver(nullptr)`` by the end of the actors so that their
314 memory gets properly reclaimed. This call should be at the end of the
315 actor's function, not in an on_exit callback.
316
317 ===============================
318 Communicating without Mailboxes
319 ===============================
320
321 Sometimes you don't want to simulate communications between actors as
322 allowed by mailboxes, but you want to create a direct communication
323 between two arbitrary hosts. This can arise when you write a
324 high-level model of a centralized scheduler, or when you model direct
325 communications such as one-sided communications in MPI or remote
326 memory direct access in PGAS.
327
328 For that, :cpp:func:`Comm::sendto() <simgrid::s4u::Comm::sendto()>`
329 simulates a direct communication between the two specified hosts. No
330 mailbox is used, and there is no rendezvous between actors. You can
331 freely mix such direct communications and rendezvous-based
332 communications. Alternatively, :cpp:func:`Comm::sendto_init()
333 <simgrid::s4u::Comm::sendto_init()>` and
334 :cpp:func:`Comm::sendto_async() <simgrid::s4u::Comm::sendto_async()>`
335 create asynchronous direct communications.
336
337 .. _s4u_raii:
338
339 Memory Management
340 *****************
341
342 For sake of simplicity, we use `RAII
343 <https://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization>`_
344 for many classes in S4U. This is an idiom where resources are automatically
345 managed through the context. Provided that you never manipulate
346 objects of type Foo directly but always FooPtr references (which are
347 defined as `boost::intrusive_ptr
348 <http://www.boost.org/doc/libs/1_61_0/libs/smart_ptr/intrusive_ptr.html>`_
349 <Foo>), you will never have to explicitly release the resource that
350 you use nor to free the memory of unused objects.
351 Here is a little example:
352
353 .. code-block:: cpp
354
355    void myFunc()
356    {
357      simgrid::s4u::MutexPtr mutex = simgrid::s4u::Mutex::create(); // Too bad we cannot use `new`
358
359      mutex->lock();   // use the mutex as a simple reference
360      //  bla bla
361      mutex->unlock();
362
363    } // The mutex gets automatically freed because the only existing reference gets out of scope
364
365 Note that Mailboxes, Hosts, and Links are not handled through smart
366 pointers (yet?). This means that it is currently impossible to destroy a
367 mailbox or a link. You can still destroy a host (but probably
368 shouldn't), using :cpp:func:`simgrid::s4u::Host::destroy`.
369
370 API Reference
371 *************
372
373 .. _API_s4u_simulation_object:
374
375 ==================
376 Simulation objects
377 ==================
378
379 .. _API_s4u_Actor:
380
381 ==============
382 ⁣  class Actor
383 ==============
384
385 .. tabs::
386
387    .. group-tab:: C++
388
389       .. doxygenclass:: simgrid::s4u::Actor
390
391       .. doxygentypedef:: aid_t
392
393
394    .. group-tab:: Python
395
396       .. autoclass:: simgrid.Actor
397
398 Basic management
399 ----------------
400
401 .. tabs::
402
403    .. group-tab:: C++
404
405       .. code:: C++
406
407          #include <simgrid/s4u/Actor.hpp>
408
409       .. doxygentypedef:: ActorPtr
410
411    .. group-tab:: Python
412
413       .. code:: Python
414
415          from simgrid import Actor
416
417    .. group-tab:: C
418
419       .. code:: C
420
421          #include <simgrid/actor.h>
422
423       .. doxygentypedef:: sg_actor_t
424       .. doxygentypedef:: const_sg_actor_t
425       .. doxygenfunction:: sg_actor_ref
426       .. doxygenfunction:: sg_actor_unref
427
428
429 Creating actors
430 ---------------
431
432 See also :ref:`the relevant example <s4u_ex_actors_create>`.
433
434 .. tabs::
435
436    .. group-tab:: C++
437
438       .. doxygenfunction:: simgrid::s4u::Actor::create(const std::string &name, s4u::Host *host, const std::function< void()> &code)
439       .. doxygenfunction:: simgrid::s4u::Actor::create(const std::string &name, s4u::Host *host, F code)
440       .. doxygenfunction:: simgrid::s4u::Actor::create(const std::string &name, s4u::Host *host, F code, Args... args)
441       .. doxygenfunction:: simgrid::s4u::Actor::create(const std::string &name, s4u::Host *host, const std::string &function, std::vector< std::string > args)
442
443       .. doxygenfunction:: simgrid::s4u::Actor::init(const std::string &name, s4u::Host *host)
444       .. doxygenfunction:: simgrid::s4u::Actor::start(const std::function< void()> &code)
445       .. doxygenfunction:: simgrid::s4u::Actor::set_stacksize
446
447    .. group-tab:: Python
448
449       .. automethod:: simgrid.Actor.create
450
451    .. group-tab:: C
452
453       .. doxygenfunction:: sg_actor_create(const char *name, sg_host_t host, xbt_main_func_t code, int argc, char *const *argv)
454       .. doxygenfunction:: sg_actor_init(const char *name, sg_host_t host)
455       .. doxygenfunction:: sg_actor_start(sg_actor_t actor, xbt_main_func_t code, int argc, char *const *argv)
456       .. doxygenfunction:: sg_actor_set_stacksize
457
458       .. doxygenfunction:: sg_actor_attach(const char *name, void *data, sg_host_t host, xbt_dict_t properties)
459       .. doxygenfunction:: sg_actor_detach()
460
461 Retrieving actors
462 -----------------
463
464 .. tabs::
465
466    .. group-tab:: C++
467
468       .. doxygenfunction:: simgrid::s4u::Actor::by_pid(aid_t pid)
469       .. doxygenfunction:: simgrid::s4u::Actor::self()
470
471    .. group-tab:: Python
472
473       .. automethod:: simgrid.Actor.by_pid
474       .. automethod:: simgrid.Actor.self
475
476    .. group-tab:: C
477
478       .. doxygenfunction:: sg_actor_by_pid(aid_t pid)
479       .. doxygenfunction:: sg_actor_self()
480       .. doxygenfunction:: sg_actor_list()
481
482 Querying info
483 -------------
484
485 .. tabs::
486
487    .. group-tab:: C++
488
489       .. doxygenfunction:: simgrid::s4u::Actor::get_cname
490       .. doxygenfunction:: simgrid::s4u::Actor::get_name
491       .. doxygenfunction:: simgrid::s4u::Actor::get_pid
492       .. doxygenfunction:: simgrid::s4u::Actor::get_ppid
493       .. doxygenfunction:: simgrid::s4u::Actor::get_properties() const
494       .. doxygenfunction:: simgrid::s4u::Actor::get_property(const std::string &key) const
495       .. doxygenfunction:: simgrid::s4u::Actor::set_property(const std::string &key, const std::string &value)
496
497       .. doxygenfunction:: simgrid::s4u::Actor::get_host
498       .. doxygenfunction:: simgrid::s4u::Actor::set_host
499
500       .. doxygenfunction:: simgrid::s4u::Actor::get_refcount
501       .. doxygenfunction:: simgrid::s4u::Actor::get_impl
502
503    .. group-tab:: Python
504
505       .. autoattribute:: simgrid.Actor.name
506       .. autoattribute:: simgrid.Actor.host
507       .. autoattribute:: simgrid.Actor.pid
508       .. autoattribute:: simgrid.Actor.ppid
509
510    .. group-tab:: C
511
512       .. doxygenfunction:: sg_actor_get_name(const_sg_actor_t actor)
513       .. doxygenfunction:: sg_actor_get_pid(const_sg_actor_t actor)
514       .. doxygenfunction:: sg_actor_get_ppid(const_sg_actor_t actor)
515       .. doxygenfunction:: sg_actor_get_properties(const_sg_actor_t actor)
516       .. doxygenfunction:: sg_actor_get_property_value(const_sg_actor_t actor, const char *name)
517
518       .. doxygenfunction:: sg_actor_get_host(const_sg_actor_t actor)
519       .. doxygenfunction:: sg_actor_set_host(sg_actor_t actor, sg_host_t host)
520
521       .. doxygenfunction:: sg_actor_get_data(const_sg_actor_t actor)
522       .. doxygenfunction:: sg_actor_set_data(sg_actor_t actor, void *userdata)
523
524 Suspending and resuming actors
525 ------------------------------
526
527 .. tabs::
528
529    .. group-tab:: C++
530
531       .. doxygenfunction:: simgrid::s4u::Actor::suspend()
532       .. doxygenfunction:: simgrid::s4u::Actor::resume()
533       .. doxygenfunction:: simgrid::s4u::Actor::is_suspended
534
535    .. group-tab:: Python
536
537       .. automethod:: simgrid.Actor.resume
538       .. automethod:: simgrid.Actor.suspend
539       .. automethod:: simgrid.Actor.is_suspended
540
541    .. group-tab:: C
542
543       .. doxygenfunction:: sg_actor_suspend(sg_actor_t actor)
544       .. doxygenfunction:: sg_actor_resume(sg_actor_t actor)
545       .. doxygenfunction:: sg_actor_is_suspended(const_sg_actor_t actor)
546
547 Specifying when actors should terminate
548 ---------------------------------------
549
550 .. tabs::
551
552    .. group-tab:: C++
553
554       .. doxygenfunction:: simgrid::s4u::Actor::kill()
555       .. doxygenfunction:: simgrid::s4u::Actor::kill_all()
556       .. doxygenfunction:: simgrid::s4u::Actor::set_kill_time(double time)
557       .. doxygenfunction:: simgrid::s4u::Actor::get_kill_time
558
559       .. doxygenfunction:: simgrid::s4u::Actor::restart()
560       .. doxygenfunction:: simgrid::s4u::Actor::daemonize()
561       .. doxygenfunction:: simgrid::s4u::Actor::is_daemon
562
563    .. group-tab:: Python
564
565       .. automethod:: simgrid.Actor.kill
566       .. automethod:: simgrid.Actor.kill_all
567
568       .. automethod:: simgrid.Actor.daemonize
569       .. automethod:: simgrid.Actor.is_daemon
570
571    .. group-tab:: C
572
573       .. doxygenfunction:: sg_actor_kill(sg_actor_t actor)
574       .. doxygenfunction:: sg_actor_kill_all()
575       .. doxygenfunction:: sg_actor_set_kill_time(sg_actor_t actor, double kill_time)
576
577       .. doxygenfunction:: sg_actor_restart(sg_actor_t actor)
578       .. doxygenfunction:: sg_actor_daemonize(sg_actor_t actor)
579       .. doxygenfunction:: sg_actor_is_daemon
580
581 .. _API_s4u_Actor_end:
582
583 Reacting to the end of actors
584 -----------------------------
585
586 .. tabs::
587
588    .. group-tab:: C++
589
590       .. doxygenfunction:: simgrid::s4u::Actor::on_exit
591       .. doxygenfunction:: simgrid::s4u::Actor::join() const
592       .. doxygenfunction:: simgrid::s4u::Actor::join(double timeout) const
593       .. doxygenfunction:: simgrid::s4u::Actor::set_auto_restart(bool autorestart)
594       .. doxygenfunction:: simgrid::s4u::Actor::get_restart_count
595
596    .. group-tab:: Python
597
598       .. automethod:: simgrid.Actor.join
599
600    .. group-tab:: C
601
602       .. doxygenfunction:: sg_actor_on_exit
603       .. doxygenfunction:: sg_actor_join(const_sg_actor_t actor, double timeout)
604       .. doxygenfunction:: sg_actor_set_auto_restart(sg_actor_t actor, int auto_restart)
605
606 Signals
607 -------
608
609 .. tabs::
610
611    .. group-tab:: C++
612
613       .. doxygenfunction:: simgrid::s4u::Actor::on_creation_cb
614       .. doxygenfunction:: simgrid::s4u::Actor::on_suspend_cb
615       .. doxygenfunction:: simgrid::s4u::Actor::on_this_suspend_cb
616       .. doxygenfunction:: simgrid::s4u::Actor::on_host_change_cb
617       .. doxygenfunction:: simgrid::s4u::Actor::on_this_host_change_cb
618       .. doxygenfunction:: simgrid::s4u::Actor::on_resume_cb
619       .. doxygenfunction:: simgrid::s4u::Actor::on_this_resume_cb
620       .. doxygenfunction:: simgrid::s4u::Actor::on_sleep_cb
621       .. doxygenfunction:: simgrid::s4u::Actor::on_this_sleep_cb
622       .. doxygenfunction:: simgrid::s4u::Actor::on_wake_up_cb
623       .. doxygenfunction:: simgrid::s4u::Actor::on_this_wake_up_cb
624       .. doxygenfunction:: simgrid::s4u::Actor::on_termination_cb
625       .. doxygenfunction:: simgrid::s4u::Actor::on_this_termination_cb
626       .. doxygenfunction:: simgrid::s4u::Actor::on_destruction_cb
627       .. doxygenfunction:: simgrid::s4u::Actor::on_this_destruction_cb
628
629 .. _API_s4u_this_actor:
630
631 ====================
632 ⁣  The current actor
633 ====================
634
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.
638
639 Querying info
640 -------------
641
642 .. tabs::
643
644    .. group-tab:: C++
645
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()
651
652       .. doxygenfunction:: simgrid::s4u::this_actor::get_host()
653       .. doxygenfunction:: simgrid::s4u::this_actor::set_host(Host *new_host)
654
655    .. group-tab:: Python
656
657       .. autofunction:: simgrid.this_actor.get_host
658       .. autofunction:: simgrid.this_actor.set_host
659
660       .. autofunction:: simgrid.this_actor.get_pid
661       .. autofunction:: simgrid.this_actor.get_ppid
662
663    .. group-tab:: C
664
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()
672
673 Suspending and resuming
674 -----------------------
675
676 .. tabs::
677
678    .. group-tab:: C++
679
680       .. doxygenfunction:: simgrid::s4u::this_actor::suspend()
681       .. doxygenfunction:: simgrid::s4u::this_actor::yield()
682
683    .. group-tab:: Python
684
685       .. autofunction:: simgrid.this_actor.suspend
686       .. autofunction:: simgrid.this_actor.yield_
687
688    .. group-tab:: C
689
690       .. doxygenfunction:: sg_actor_yield()
691
692 Logging messages
693 ----------------
694
695 .. tabs::
696
697    .. group-tab:: C++
698
699       Please refer to :ref:`the relevant documentation <logging_prog>`.
700
701    .. group-tab:: Python
702
703        .. autofunction:: simgrid.this_actor.debug
704        .. autofunction:: simgrid.this_actor.info
705        .. autofunction:: simgrid.this_actor.warning
706        .. autofunction:: simgrid.this_actor.error
707
708 Sleeping
709 --------
710
711 .. tabs::
712
713    .. group-tab:: C++
714
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)
719
720    .. group-tab:: Python
721
722       .. autofunction:: simgrid.this_actor.sleep_for
723       .. autofunction:: simgrid.this_actor.sleep_until
724
725    .. group-tab:: C
726
727       .. doxygenfunction:: sg_actor_sleep_for(double duration)
728
729 Simulating executions
730 ---------------------
731
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.
735
736 .. tabs::
737
738    .. group-tab:: C++
739
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
747
748    .. group-tab:: Python
749
750       .. autofunction:: simgrid.this_actor.exec_async
751       .. autofunction:: simgrid.this_actor.exec_init
752       .. autofunction:: simgrid.this_actor.execute
753
754    .. group-tab:: C
755
756       .. doxygenfunction:: sg_actor_execute(double flops)
757       .. doxygenfunction:: sg_actor_execute_with_priority(double flops, double priority)
758       .. doxygenfunction:: sg_actor_exec_init(double computation_amount)
759       .. doxygenfunction:: sg_actor_exec_async(double computation_amount)
760       .. doxygenfunction:: sg_actor_parallel_exec_init(int host_nb, const sg_host_t* host_list, double* flops_amount, double* bytes_amount);
761
762 Exiting
763 -------
764
765 .. tabs::
766
767    .. group-tab:: C++
768
769       .. doxygenfunction:: simgrid::s4u::this_actor::exit()
770       .. doxygenfunction:: simgrid::s4u::this_actor::on_exit(const std::function< void(bool)> &fun)
771
772    .. group-tab:: Python
773
774       .. autofunction:: simgrid.this_actor.exit
775       .. autofunction:: simgrid.this_actor.on_exit
776
777    .. group-tab:: c
778
779       See also :cpp:func:`sg_actor_on_exit`.
780
781       .. doxygenfunction:: sg_actor_exit
782
783 .. _API_s4u_Engine:
784
785 ====================
786 ⁣  Simulation Engine
787 ====================
788
789 .. tabs::
790
791    .. group-tab:: C++
792
793       .. doxygenclass:: simgrid::s4u::Engine
794
795    .. group-tab:: Python
796
797       .. autoclass:: simgrid.Engine
798
799 Engin initialization
800 --------------------
801
802 .. tabs::
803
804    .. group-tab:: C++
805
806       .. doxygenfunction:: simgrid::s4u::Engine::Engine(int *argc, char **argv)
807       .. doxygenfunction:: simgrid::s4u::Engine::is_initialized()
808       .. doxygenfunction:: simgrid::s4u::Engine::shutdown()
809       .. doxygenfunction:: simgrid::s4u::Engine::get_instance()
810
811    .. group-tab:: Python
812
813        .. automethod:: simgrid.Engine.__init__
814        .. autoattribute:: simgrid.Engine.instance
815
816    .. group-tab:: C
817
818       .. doxygenfunction:: simgrid_init
819
820 Simulation setup
821 ----------------
822
823 .. tabs::
824
825    .. group-tab:: C++
826
827       .. doxygenfunction:: simgrid::s4u::Engine::set_config(const std::string &str)
828       .. doxygenfunction:: simgrid::s4u::Engine::set_config(const std::string &name, bool value)
829       .. doxygenfunction:: simgrid::s4u::Engine::set_config(const std::string &name, double value)
830       .. doxygenfunction:: simgrid::s4u::Engine::set_config(const std::string &name, int value)
831       .. doxygenfunction:: simgrid::s4u::Engine::set_config(const std::string &name, const std::string &value)
832
833       .. doxygenfunction:: simgrid::s4u::Engine::load_deployment
834       .. doxygenfunction:: simgrid::s4u::Engine::load_platform
835       .. doxygenfunction:: simgrid::s4u::Engine::flatify_platform
836       .. doxygenfunction:: simgrid::s4u::Engine::register_actor(const std::string &name)
837       .. doxygenfunction:: simgrid::s4u::Engine::register_actor(const std::string &name, F code)
838       .. doxygenfunction:: simgrid::s4u::Engine::register_default(const std::function< void(int, char **)> &code)
839       .. doxygenfunction:: simgrid::s4u::Engine::register_default(const kernel::actor::ActorCodeFactory &factory)
840
841       .. doxygenfunction:: simgrid::s4u::Engine::register_function(const std::string &name, const std::function< void(int, char **)> &code)
842       .. doxygenfunction:: simgrid::s4u::Engine::register_function(const std::string &name, const std::function< void(std::vector< std::string >)> &code)
843       .. doxygenfunction:: simgrid::s4u::Engine::register_function(const std::string &name, const kernel::actor::ActorCodeFactory &factory)
844
845    .. group-tab:: Python
846
847        .. automethod:: simgrid.Engine.load_deployment
848        .. automethod:: simgrid.Engine.load_platform
849        .. automethod:: simgrid.Engine.register_actor
850
851    .. group-tab:: C
852
853       .. doxygenfunction:: simgrid_load_deployment
854       .. doxygenfunction:: simgrid_load_platform
855       .. doxygenfunction:: simgrid_register_default
856       .. doxygenfunction:: simgrid_register_function
857
858
859 Run the simulation
860 ------------------
861
862 .. tabs::
863
864    .. group-tab:: C++
865
866       .. doxygenfunction:: simgrid::s4u::Engine::get_clock()
867       .. doxygenfunction:: simgrid::s4u::Engine::run
868       .. doxygenfunction:: simgrid::s4u::Engine::run_until
869
870    .. group-tab:: Python
871
872       .. autoattribute:: simgrid.Engine.clock
873       .. automethod:: simgrid.Engine.run
874       .. automethod:: simgrid.Engine.run_until
875
876    .. group-tab:: C
877
878       .. doxygenfunction:: simgrid_get_clock
879       .. doxygenfunction:: simgrid_run
880       .. doxygenfunction:: simgrid_run_until
881
882 Retrieving actors
883 -----------------
884
885 .. tabs::
886
887    .. group-tab:: C++
888
889       .. doxygenfunction:: simgrid::s4u::Engine::get_actor_count
890       .. doxygenfunction:: simgrid::s4u::Engine::get_all_actors
891       .. doxygenfunction:: simgrid::s4u::Engine::get_filtered_actors
892
893    .. group-tab:: C
894
895       .. doxygenfunction:: sg_actor_count()
896
897 Retrieving hosts
898 ----------------
899
900 .. tabs::
901
902    .. group-tab:: C++
903
904       .. doxygenfunction:: simgrid::s4u::Engine::get_all_hosts
905       .. doxygenfunction:: simgrid::s4u::Engine::get_host_count
906       .. doxygenfunction:: simgrid::s4u::Engine::get_filtered_hosts
907       .. doxygenfunction:: simgrid::s4u::Engine::host_by_name
908       .. doxygenfunction:: simgrid::s4u::Engine::host_by_name_or_null
909
910    .. group-tab:: Python
911
912       .. autoattribute:: simgrid.Engine.all_hosts
913       .. automethod:: simgrid.Engine.host_by_name
914
915    .. group-tab:: C
916
917       See also :cpp:func:`sg_host_list` and :cpp:func:`sg_host_count`.
918
919 Retrieving links
920 ----------------
921
922 .. tabs::
923
924    .. group-tab:: C++
925
926       .. doxygenfunction:: simgrid::s4u::Engine::get_all_links
927       .. doxygenfunction:: simgrid::s4u::Engine::get_link_count
928       .. doxygenfunction:: simgrid::s4u::Engine::get_filtered_links
929       .. doxygenfunction:: simgrid::s4u::Engine::link_by_name
930       .. doxygenfunction:: simgrid::s4u::Engine::link_by_name_or_null
931
932    .. group-tab:: Python
933
934       .. autoattribute:: simgrid.Engine.all_links
935
936 Interacting with the routing
937 ----------------------------
938
939 .. tabs::
940
941    .. group-tab:: C++
942
943       .. doxygenfunction:: simgrid::s4u::Engine::get_all_netpoints
944       .. doxygenfunction:: simgrid::s4u::Engine::get_filtered_netzones
945       .. doxygenfunction:: simgrid::s4u::Engine::get_netzone_root
946       .. doxygenfunction:: simgrid::s4u::Engine::netpoint_by_name_or_null
947       .. doxygenfunction:: simgrid::s4u::Engine::netzone_by_name_or_null
948
949    .. group-tab:: Python
950
951       .. autoattribute:: simgrid.Engine.all_netpoints
952       .. autoattribute:: simgrid.Engine.netzone_root
953       .. automethod:: simgrid.Engine.netpoint_by_name
954       .. automethod:: simgrid.Engine.netzone_by_name
955
956 Signals
957 -------
958
959 .. tabs::
960
961    .. group-tab:: C++
962
963       .. doxygenfunction:: simgrid::s4u::Engine::on_deadlock_cb
964       .. doxygenfunction:: simgrid::s4u::Engine::on_platform_created_cb
965       .. doxygenfunction:: simgrid::s4u::Engine::on_platform_creation_cb
966       .. doxygenfunction:: simgrid::s4u::Engine::on_simulation_start_cb
967       .. doxygenfunction:: simgrid::s4u::Engine::on_simulation_end_cb
968       .. doxygenfunction:: simgrid::s4u::Engine::on_time_advance_cb
969
970 .. _API_s4u_Mailbox:
971
972 ================
973 ⁣  class Mailbox
974 ================
975
976 .. tabs::
977
978    .. group-tab:: C++
979
980       .. doxygenclass:: simgrid::s4u::Mailbox
981
982    .. group-tab:: Python
983
984       .. autoclass:: simgrid.Mailbox
985
986 Please also refer to the :ref:`full doc on s4u::Mailbox <s4u_mailbox>`.
987
988 Basic management
989 ----------------
990
991 .. tabs::
992
993    .. group-tab:: C++
994
995       .. code-block:: C++
996
997          #include <simgrid/s4u/Mailbox.hpp>
998
999       Note that there is no MailboxPtr type and that you cannot use the RAII
1000       idiom on mailboxes because they are internal objects to the simulation
1001       engine. Once created, there is no way to destroy a mailbox before the end
1002       of the simulation.
1003
1004       .. doxygenfunction:: simgrid::s4u::Mailbox::by_name(const std::string &name)
1005
1006    .. group-tab:: Python
1007
1008       .. code-block:: C++
1009
1010          #include <simgrid/mailbox.h>
1011
1012       .. automethod:: simgrid.Mailbox.by_name
1013
1014    .. group-tab:: C
1015
1016       .. code-block:: C
1017
1018          #include <simgrid/s4u/mailbox.h>
1019
1020       .. doxygentypedef:: sg_mailbox_t
1021       .. doxygentypedef:: const_sg_mailbox_t
1022
1023       .. doxygenfunction:: sg_mailbox_by_name(const char *alias)
1024
1025 Querying info
1026 -------------
1027
1028 .. tabs::
1029
1030    .. group-tab:: C++
1031
1032       .. doxygenfunction:: simgrid::s4u::Mailbox::get_cname
1033       .. doxygenfunction:: simgrid::s4u::Mailbox::get_name
1034
1035    .. group-tab:: Python
1036
1037       .. autoattribute:: simgrid.Mailbox.name
1038
1039 Sending data
1040 ------------
1041
1042 .. tabs::
1043
1044    .. group-tab:: C++
1045
1046       .. doxygenfunction:: simgrid::s4u::Mailbox::put(void *payload, uint64_t simulated_size_in_bytes)
1047       .. doxygenfunction:: simgrid::s4u::Mailbox::put(void *payload, uint64_t simulated_size_in_bytes, double timeout)
1048       .. doxygenfunction:: simgrid::s4u::Mailbox::put_async(void *data, uint64_t simulated_size_in_bytes)
1049       .. doxygenfunction:: simgrid::s4u::Mailbox::put_init()
1050       .. doxygenfunction:: simgrid::s4u::Mailbox::put_init(void *data, uint64_t simulated_size_in_bytes)
1051
1052    .. group-tab:: Python
1053
1054       .. automethod:: simgrid.Mailbox.put
1055       .. automethod:: simgrid.Mailbox.put_async
1056       .. automethod:: simgrid.Mailbox.put_init
1057
1058    .. group-tab:: C
1059
1060       .. doxygenfunction:: sg_mailbox_put(sg_mailbox_t mailbox, void *payload, long simulated_size_in_bytes)
1061       .. doxygenfunction:: sg_mailbox_put_init(sg_mailbox_t mailbox, void *payload, long simulated_size_in_bytes)
1062       .. doxygenfunction:: sg_mailbox_put_async(sg_mailbox_t mailbox, void *payload, long simulated_size_in_bytes)
1063
1064
1065 Receiving data
1066 --------------
1067
1068 .. tabs::
1069
1070    .. group-tab:: C++
1071
1072       .. doxygenfunction:: simgrid::s4u::Mailbox::empty
1073       .. doxygenfunction:: simgrid::s4u::Mailbox::front
1074       .. doxygenfunction:: simgrid::s4u::Mailbox::get()
1075       .. doxygenfunction:: simgrid::s4u::Mailbox::get(double timeout)
1076       .. doxygenfunction:: simgrid::s4u::Mailbox::get_async(T **data)
1077       .. doxygenfunction:: simgrid::s4u::Mailbox::get_init()
1078       .. doxygenfunction:: simgrid::s4u::Mailbox::iprobe(int type, const std::function<bool(void *, void *, kernel::activity::CommImpl *)>& match_fun, void *data)
1079       .. doxygenfunction:: simgrid::s4u::Mailbox::listen
1080       .. doxygenfunction:: simgrid::s4u::Mailbox::ready
1081
1082    .. group-tab:: Python
1083
1084        .. automethod:: simgrid.Mailbox.get
1085        .. automethod:: simgrid.Mailbox.get_async
1086        .. autoattribute:: simgrid.Mailbox.ready
1087
1088    .. group-tab:: C
1089
1090       .. doxygenfunction:: sg_mailbox_get(sg_mailbox_t mailbox)
1091       .. doxygenfunction:: sg_mailbox_get_async(sg_mailbox_t mailbox, void **data)
1092       .. doxygenfunction:: sg_mailbox_get_name(const_sg_mailbox_t mailbox)
1093       .. doxygenfunction:: sg_mailbox_listen(const char *alias)
1094
1095 Receiving actor
1096 ---------------
1097
1098 See :ref:`s4u_receiving_actor`.
1099
1100 .. tabs::
1101
1102    .. group-tab:: C++
1103
1104       .. doxygenfunction:: simgrid::s4u::Mailbox::get_receiver
1105       .. doxygenfunction:: simgrid::s4u::Mailbox::set_receiver(ActorPtr actor)
1106
1107    .. group-tab:: C
1108
1109       .. doxygenfunction:: sg_mailbox_set_receiver(const char *alias)
1110
1111 .. _API_s4u_Resource:
1112
1113 =========
1114 Resources
1115 =========
1116
1117 .. _API_s4u_Disk:
1118
1119 =============
1120 ⁣  class Disk
1121 =============
1122
1123 .. tabs::
1124
1125    .. group-tab:: C++
1126
1127       .. doxygenclass:: simgrid::s4u::Disk
1128
1129    .. group-tab:: Python
1130
1131       .. autoclass:: simgrid.Disk
1132
1133    .. group-tab:: C
1134
1135       .. doxygentypedef:: sg_disk_t
1136       .. doxygentypedef:: const_sg_disk_t
1137
1138 Basic management
1139 ----------------
1140
1141 .. tabs::
1142
1143    .. group-tab:: C++
1144
1145       .. code-block:: C++
1146
1147          #include <simgrid/s4u/Disk.hpp>
1148
1149       Note that there is no DiskPtr type and that you cannot use the RAII
1150       idiom on disks because SimGrid does not allow (yet) to create nor
1151       destroy resources once the simulation is started.
1152
1153       .. doxygenfunction:: simgrid::s4u::Disk::seal()
1154
1155    .. group-tab:: Python
1156
1157       .. code:: Python
1158
1159          from simgrid import Disk
1160
1161       .. automethod:: simgrid.Disk.seal
1162
1163
1164 Querying info
1165 -------------
1166
1167 .. tabs::
1168
1169    .. group-tab:: C++
1170
1171       .. doxygenfunction:: simgrid::s4u::Disk::get_cname() const
1172       .. doxygenfunction:: simgrid::s4u::Disk::get_host() const
1173       .. doxygenfunction:: simgrid::s4u::Disk::get_name() const
1174       .. doxygenfunction:: simgrid::s4u::Disk::get_properties() const
1175       .. doxygenfunction:: simgrid::s4u::Disk::get_property(const std::string &key) const
1176       .. doxygenfunction:: simgrid::s4u::Disk::get_read_bandwidth() const
1177       .. doxygenfunction:: simgrid::s4u::Disk::get_write_bandwidth() const
1178       .. doxygenfunction:: simgrid::s4u::Disk::set_property(const std::string &, const std::string &value)
1179       .. doxygenfunction:: simgrid::s4u::Disk::set_sharing_policy
1180
1181    .. group-tab:: Python
1182
1183       .. autoattribute:: simgrid.Disk.name
1184       .. automethod:: simgrid.Disk.set_sharing_policy
1185
1186 I/O operations
1187 --------------
1188
1189 .. tabs::
1190
1191    .. group-tab:: C++
1192
1193       .. doxygenfunction:: simgrid::s4u::Disk::io_init(sg_size_t size, s4u::Io::OpType type) const
1194       .. doxygenfunction:: simgrid::s4u::Disk::read(sg_size_t size) const
1195       .. doxygenfunction:: simgrid::s4u::Disk::read_async(sg_size_t size) const
1196       .. doxygenfunction:: simgrid::s4u::Disk::write(sg_size_t size) const
1197       .. doxygenfunction:: simgrid::s4u::Disk::write_async(sg_size_t size) const
1198
1199    .. group-tab:: Python
1200
1201       .. automethod:: simgrid.Disk.read
1202       .. automethod:: simgrid.Disk.read_async
1203       .. automethod:: simgrid.Disk.write
1204       .. automethod:: simgrid.Disk.write_async
1205
1206 Signals
1207 -------
1208
1209 .. tabs::
1210
1211    .. group-tab:: C++
1212
1213       .. doxygenfunction:: simgrid::s4u::Disk::on_creation_cb
1214       .. doxygenfunction:: simgrid::s4u::Disk::on_destruction_cb
1215       .. doxygenfunction:: simgrid::s4u::Disk::on_state_change_cb
1216
1217
1218 .. _API_s4u_Host:
1219
1220 =============
1221 ⁣  class Host
1222 =============
1223
1224 .. tabs::
1225
1226    .. group-tab:: C++
1227
1228       .. doxygenclass:: simgrid::s4u::Host
1229
1230    .. group-tab:: Python
1231
1232       .. autoclass:: simgrid.Host
1233
1234 Basic management
1235 ----------------
1236
1237 .. tabs::
1238
1239    .. group-tab:: C++
1240
1241       .. code-block:: C++
1242
1243          #include <simgrid/s4u/Host.hpp>
1244
1245       Note that there is no HostPtr type, and that you cannot use the RAII
1246       idiom on hosts because SimGrid does not allow (yet) to create nor
1247       destroy resources once the simulation is started.
1248
1249       .. doxygenfunction:: simgrid::s4u::Host::destroy()
1250       .. doxygenfunction:: simgrid::s4u::Host::seal()
1251
1252    .. group-tab:: Python
1253
1254       .. code:: Python
1255
1256          from simgrid import Host
1257
1258       .. automethod:: simgrid.Host.seal
1259
1260    .. group-tab:: C
1261
1262       .. code:: C
1263
1264          #include <simgrid/host.h>
1265
1266       .. doxygentypedef:: sg_host_t
1267       .. cpp:type:: const s4u_Host* const_sg_host_t
1268
1269          Pointer to a constant host object.
1270
1271 Retrieving hosts
1272 ----------------
1273
1274 .. tabs::
1275
1276    .. group-tab:: C++
1277
1278       See also :cpp:func:`simgrid::s4u::Engine::get_all_hosts`.
1279
1280       .. doxygenfunction:: simgrid::s4u::Host::by_name(const std::string &name)
1281       .. doxygenfunction:: simgrid::s4u::Host::by_name_or_null(const std::string &name)
1282       .. doxygenfunction:: simgrid::s4u::Host::current()
1283
1284    .. group-tab:: Python
1285
1286       See also :py:attr:`simgrid.Engine.all_hosts`.
1287
1288       .. automethod:: simgrid.Host.by_name
1289       .. automethod:: simgrid.Host.current
1290
1291    .. group-tab:: C
1292
1293       .. doxygenfunction:: sg_host_by_name(const char *name)
1294       .. doxygenfunction:: sg_host_count()
1295       .. doxygenfunction:: sg_host_list()
1296
1297 Modifying characteristics
1298 -------------------------
1299
1300 .. tabs::
1301
1302    .. group-tab:: C++
1303
1304       .. doxygenfunction:: simgrid::s4u::Host::set_core_count(int core_count)
1305       .. doxygenfunction:: simgrid::s4u::Host::set_coordinates(const std::string& coords)
1306       .. doxygenfunction:: simgrid::s4u::Host::set_sharing_policy
1307
1308    .. group-tab:: Python
1309
1310       .. autoattribute:: simgrid.Host.core_count
1311          :noindex:
1312       .. automethod:: simgrid.Host.set_coordinates
1313       .. automethod:: simgrid.Host.set_sharing_policy
1314
1315 Querying info
1316 -------------
1317
1318 .. tabs::
1319
1320    .. group-tab:: C++
1321
1322       .. doxygenfunction:: simgrid::s4u::Host::get_cname() const
1323       .. doxygenfunction:: simgrid::s4u::Host::get_core_count() const
1324       .. doxygenfunction:: simgrid::s4u::Host::get_name() const
1325       .. doxygenfunction:: simgrid::s4u::Host::get_available_speed() const
1326       .. doxygenfunction:: simgrid::s4u::Host::get_load() const
1327       .. doxygenfunction:: simgrid::s4u::Host::get_speed() const
1328
1329    .. group-tab:: Python
1330
1331       .. autoattribute:: simgrid.Host.name
1332       .. autoattribute:: simgrid.Host.core_count
1333       .. autoattribute:: simgrid.Host.load
1334       .. autoattribute:: simgrid.Host.speed
1335       .. autoattribute:: simgrid.Host.available_speed
1336
1337    .. group-tab:: C
1338
1339       .. doxygenfunction:: sg_host_core_count(const_sg_host_t host)
1340       .. doxygenfunction:: sg_host_get_name(const_sg_host_t host)
1341       .. doxygenfunction:: sg_host_get_load(const_sg_host_t host)
1342       .. doxygenfunction:: sg_host_get_speed(const_sg_host_t host)
1343
1344 User data and properties
1345 ------------------------
1346
1347 .. tabs::
1348
1349    .. group-tab:: C++
1350
1351       .. doxygenfunction:: simgrid::s4u::Host::get_properties() const
1352       .. doxygenfunction:: simgrid::s4u::Host::get_property(const std::string &key) const
1353       .. doxygenfunction:: simgrid::s4u::Host::set_properties(const std::unordered_map< std::string, std::string > &properties)
1354       .. doxygenfunction:: simgrid::s4u::Host::set_property(const std::string &key, const std::string &value)
1355
1356    .. group-tab:: C
1357
1358       .. doxygenfunction:: sg_host_set_property_value(sg_host_t host, const char *name, const char *value)
1359       .. doxygenfunction:: sg_host_get_properties(const_sg_host_t host)
1360       .. doxygenfunction:: sg_host_get_property_value(const_sg_host_t host, const char *name)
1361       .. doxygenfunction:: sg_host_extension_create(void(*deleter)(void *))
1362       .. doxygenfunction:: sg_host_extension_get(const_sg_host_t host, size_t rank)
1363
1364 Retrieving components
1365 ---------------------
1366
1367 .. tabs::
1368
1369    .. group-tab:: C++
1370
1371       .. doxygenfunction:: simgrid::s4u::Host::add_disk(const Disk *disk)
1372       .. doxygenfunction:: simgrid::s4u::Host::get_actor_count() const
1373       .. doxygenfunction:: simgrid::s4u::Host::get_all_actors() const
1374       .. doxygenfunction:: simgrid::s4u::Host::get_disks() const
1375       .. doxygenfunction:: simgrid::s4u::Host::remove_disk(const std::string &disk_name)
1376
1377    .. group-tab:: Python
1378
1379       .. automethod:: simgrid.Host.get_disks
1380
1381    .. group-tab:: C
1382
1383       .. doxygenfunction:: sg_host_get_actor_list(const_sg_host_t host, xbt_dynar_t whereto)
1384
1385 On/Off
1386 ------
1387
1388 .. tabs::
1389
1390    .. group-tab:: C++
1391
1392       .. doxygenfunction:: simgrid::s4u::Host::is_on() const
1393       .. doxygenfunction:: simgrid::s4u::Host::turn_off()
1394       .. doxygenfunction:: simgrid::s4u::Host::turn_on()
1395
1396    .. group-tab:: C
1397
1398       .. doxygenfunction:: sg_host_is_on(const_sg_host_t host)
1399       .. doxygenfunction:: sg_host_turn_off(sg_host_t host)
1400       .. doxygenfunction:: sg_host_turn_on(sg_host_t host)
1401
1402 .. _API_s4u_Host_dvfs:
1403
1404 DVFS
1405 ----
1406
1407 See also the :ref:`relevant examples <s4u_ex_dvfs>`.
1408
1409 .. tabs::
1410
1411    .. group-tab:: C++
1412
1413       .. doxygenfunction:: simgrid::s4u::Host::get_pstate() const
1414       .. doxygenfunction:: simgrid::s4u::Host::get_pstate_count() const
1415       .. doxygenfunction:: simgrid::s4u::Host::get_pstate_speed(unsigned long pstate_index) const
1416       .. doxygenfunction:: simgrid::s4u::Host::set_pstate(unsigned long pstate_index)
1417
1418    .. group-tab:: Python
1419
1420       .. autoattribute:: simgrid.Host.pstate
1421       .. autoattribute:: simgrid.Host.pstate_count
1422       .. automethod:: simgrid.Host.pstate_speed
1423
1424    .. group-tab:: C
1425
1426       .. doxygenfunction:: sg_host_get_available_speed(const_sg_host_t host)
1427       .. doxygenfunction:: sg_host_get_nb_pstates(const_sg_host_t host)
1428       .. doxygenfunction:: sg_host_get_pstate(const_sg_host_t host)
1429       .. doxygenfunction:: sg_host_get_pstate_speed(const_sg_host_t host, unsigned long pstate_index)
1430       .. doxygenfunction:: sg_host_set_pstate(sg_host_t host, unsigned long pstate)
1431
1432 Dynamic profiles
1433 ----------------
1434
1435 .. tabs::
1436
1437    .. group-tab:: C++
1438
1439       .. doxygenfunction:: simgrid::s4u::Host::set_speed_profile(kernel::profile::Profile *p)
1440       .. doxygenfunction:: simgrid::s4u::Host::set_state_profile(kernel::profile::Profile *p)
1441
1442    .. group-tab:: Python
1443
1444       .. automethod:: simgrid.Host.set_speed_profile
1445       .. automethod:: simgrid.Host.set_state_profile
1446
1447 Execution
1448 ---------
1449
1450 .. tabs::
1451
1452    .. group-tab:: C++
1453
1454       .. doxygenfunction:: simgrid::s4u::Host::exec_async
1455       .. doxygenfunction:: simgrid::s4u::Host::execute(double flops) const
1456       .. doxygenfunction:: simgrid::s4u::Host::execute(double flops, double priority) const
1457
1458 Platform and routing
1459 --------------------
1460
1461 You can also start direct communications between two arbitrary hosts
1462 using :cpp:func:`Comm::sendto() <simgrid::s4u::Comm::sendto()>`.
1463
1464 .. tabs::
1465
1466    .. group-tab:: C++
1467
1468       .. doxygenfunction:: simgrid::s4u::Host::get_englobing_zone() const
1469       .. doxygenfunction:: simgrid::s4u::Host::get_netpoint() const
1470       .. doxygenfunction:: simgrid::s4u::Host::route_to(const Host *dest, std::vector< Link * > &links, double *latency) const
1471       .. doxygenfunction:: simgrid::s4u::Host::route_to(const Host *dest, std::vector< kernel::resource::StandardLinkImpl * > &links, double *latency) const
1472       .. doxygenfunction:: simgrid::s4u::Host::create_disk(const std::string& name, double read_bandwidth, double write_bandwidth)
1473       .. doxygenfunction:: simgrid::s4u::Host::create_disk(const std::string& name, const std::string& read_bandwidth, const std::string& write_bandwidth)
1474
1475    .. group-tab:: Python
1476
1477       .. autoattribute:: simgrid.Host.netpoint
1478       .. automethod:: simgrid.Host.create_disk
1479
1480       .. automethod:: simgrid.Host.route_to
1481
1482    .. group-tab:: C
1483
1484       .. doxygenfunction:: sg_host_get_route(const_sg_host_t from, const_sg_host_t to, xbt_dynar_t links)
1485       .. doxygenfunction:: sg_host_get_route_bandwidth(const_sg_host_t from, const_sg_host_t to)
1486       .. doxygenfunction:: sg_host_get_route_latency(const_sg_host_t from, const_sg_host_t to)
1487       .. doxygenfunction:: sg_host_sendto(sg_host_t from, sg_host_t to, double byte_amount)
1488
1489 Signals
1490 -------
1491
1492 .. tabs::
1493
1494    .. group-tab:: C++
1495
1496       .. doxygenfunction:: simgrid::s4u::Host::on_creation_cb
1497       .. doxygenfunction:: simgrid::s4u::Host::on_destruction_cb
1498       .. doxygenfunction:: simgrid::s4u::Host::on_speed_change_cb
1499       .. doxygenfunction:: simgrid::s4u::Host::on_state_change_cb
1500
1501 .. _API_s4u_Link:
1502
1503 =============
1504 ⁣  class Link
1505 =============
1506
1507 .. tabs::
1508
1509    .. group-tab:: C++
1510
1511       .. doxygenclass:: simgrid::s4u::Link
1512       .. doxygenclass:: simgrid::s4u::SplitDuplexLink
1513       .. doxygenclass:: simgrid::s4u::LinkInRoute
1514
1515
1516    .. group-tab:: Python
1517
1518       .. autoclass:: simgrid.Link
1519
1520 Basic management
1521 ----------------
1522
1523 .. tabs::
1524
1525    .. group-tab:: C++
1526
1527       .. code-block:: C++
1528
1529          #include <simgrid/s4u/Link.hpp>
1530
1531       Note that there is no LinkPtr type and that you cannot use the RAII
1532       idiom on hosts because SimGrid does not allow (yet) to create nor
1533       destroy resources once the simulation is started.
1534
1535       .. doxygenfunction:: simgrid::s4u::Link::seal()
1536
1537    .. group-tab:: Python
1538
1539       .. code:: Python
1540
1541          from simgrid import Link
1542
1543       .. automethod:: simgrid.Link.seal
1544
1545    .. group-tab:: C
1546
1547       .. code:: C
1548
1549          #include <simgrid/link.h>
1550
1551       .. doxygentypedef:: sg_link_t
1552       .. cpp:type:: const s4u_Link* const_sg_link_t
1553
1554          Pointer to a constant link object.
1555
1556 Retrieving links
1557 ----------------
1558
1559 .. tabs::
1560
1561    .. group-tab:: C++
1562
1563       See also :cpp:func:`simgrid::s4u::Engine::get_all_links`.
1564
1565       .. doxygenfunction:: simgrid::s4u::Link::by_name(const std::string &name)
1566       .. doxygenfunction:: simgrid::s4u::Link::by_name_or_null(const std::string &name)
1567
1568    .. group-tab:: Python
1569
1570       See also :py:attr:`simgrid.Engine.all_links`.
1571
1572       .. automethod:: simgrid.Link.by_name
1573       .. autoattribute:: simgrid.Link.name
1574
1575    .. group-tab:: C
1576
1577       .. doxygenfunction:: sg_link_by_name(const char *name)
1578       .. doxygenfunction:: sg_link_count()
1579       .. doxygenfunction:: sg_link_list()
1580
1581 Querying info
1582 --------------
1583
1584 .. tabs::
1585
1586    .. group-tab:: C++
1587
1588       .. doxygenfunction:: simgrid::s4u::Link::get_bandwidth() const
1589       .. doxygenfunction:: simgrid::s4u::Link::get_cname() const
1590       .. doxygenfunction:: simgrid::s4u::Link::get_latency() const
1591       .. doxygenfunction:: simgrid::s4u::Link::get_name() const
1592       .. doxygenfunction:: simgrid::s4u::Link::get_sharing_policy() const
1593       .. doxygenfunction:: simgrid::s4u::Link::get_concurrency_limit() const
1594       .. doxygenfunction:: simgrid::s4u::Link::get_usage() const
1595       .. doxygenfunction:: simgrid::s4u::Link::is_used() const
1596
1597    .. group-tab:: Python
1598
1599       .. autoattribute:: simgrid.Link.bandwidth
1600       .. autoattribute:: simgrid.Link.latency
1601
1602    .. group-tab:: C
1603
1604       .. doxygenfunction:: sg_link_get_bandwidth(const_sg_link_t link)
1605       .. doxygenfunction:: sg_link_get_latency(const_sg_link_t link)
1606       .. doxygenfunction:: sg_link_get_name(const_sg_link_t link)
1607       .. doxygenfunction:: sg_link_is_shared(const_sg_link_t link)
1608
1609 Modifying characteristics
1610 -------------------------
1611
1612 .. tabs::
1613
1614    .. group-tab:: C++
1615
1616       .. doxygenfunction:: simgrid::s4u::Link::set_bandwidth(double value)
1617       .. doxygenfunction:: simgrid::s4u::Link::set_latency(double value)
1618       .. doxygenfunction:: simgrid::s4u::Link::set_latency(const std::string& value)
1619       .. doxygenfunction:: simgrid::s4u::Link::set_concurrency_limit(int limit)
1620       .. doxygenfunction:: simgrid::s4u::Link::set_sharing_policy
1621
1622    .. group-tab:: Python
1623
1624       .. automethod:: simgrid.Link.set_bandwidth
1625       .. automethod:: simgrid.Link.set_latency
1626       .. automethod:: simgrid.Link.set_concurrency_limit
1627       .. automethod:: simgrid.Link.set_sharing_policy
1628
1629    .. group-tab:: C
1630
1631       .. doxygenfunction:: sg_link_set_bandwidth(sg_link_t link, double value)
1632       .. doxygenfunction:: sg_link_set_latency(sg_link_t link, double value)
1633
1634 User data and properties
1635 ------------------------
1636
1637 .. tabs::
1638
1639    .. group-tab:: C++
1640
1641       .. doxygenfunction:: simgrid::s4u::Link::get_property(const std::string &key) const
1642       .. doxygenfunction:: simgrid::s4u::Link::set_property(const std::string &key, const std::string &value)
1643
1644    .. group-tab:: C
1645
1646       .. doxygenfunction:: sg_link_get_data(const_sg_link_t link)
1647       .. doxygenfunction:: sg_link_set_data(sg_link_t link, void *data)
1648
1649 On/Off
1650 ------
1651
1652 .. tabs::
1653
1654    .. group-tab:: C++
1655
1656       See also :cpp:func:`simgrid::s4u::Link::set_state_profile`.
1657
1658       .. doxygenfunction:: simgrid::s4u::Link::is_on() const
1659       .. doxygenfunction:: simgrid::s4u::Link::turn_off()
1660       .. doxygenfunction:: simgrid::s4u::Link::turn_on()
1661
1662    .. group-tab:: Python
1663
1664       See also :py:func:`simgrid.Link.set_state_profile`.
1665
1666       .. automethod:: simgrid.Link.is_on
1667       .. automethod:: simgrid.Link.turn_off
1668       .. automethod:: simgrid.Link.turn_on
1669
1670 Dynamic profiles
1671 ----------------
1672
1673 See :ref:`howto_churn` for more details.
1674
1675 .. tabs::
1676
1677    .. group-tab:: C++
1678
1679       .. doxygenfunction:: simgrid::s4u::Link::set_bandwidth_profile(kernel::profile::Profile *profile)
1680       .. doxygenfunction:: simgrid::s4u::Link::set_latency_profile(kernel::profile::Profile *profile)
1681       .. doxygenfunction:: simgrid::s4u::Link::set_state_profile(kernel::profile::Profile *profile)
1682
1683    .. group-tab:: Python
1684
1685       .. automethod:: simgrid.Link.set_bandwidth_profile
1686       .. automethod:: simgrid.Link.set_latency_profile
1687       .. automethod:: simgrid.Link.set_state_profile
1688
1689 WIFI links
1690 ----------
1691
1692 .. tabs::
1693
1694    .. group-tab:: C++
1695
1696       .. doxygenfunction:: simgrid::s4u::Link::set_host_wifi_rate
1697
1698    .. group-tab:: Python
1699
1700       .. automethod:: simgrid.Link.set_host_wifi_rate
1701
1702 Signals
1703 -------
1704
1705 .. tabs::
1706
1707    .. group-tab:: C++
1708
1709       .. doxygenfunction:: simgrid::s4u::Link::on_bandwidth_change_cb
1710       .. doxygenfunction:: simgrid::s4u::Link::on_communication_state_change_cb
1711       .. doxygenfunction:: simgrid::s4u::Link::on_creation_cb
1712       .. doxygenfunction:: simgrid::s4u::Link::on_destruction_cb
1713       .. doxygenfunction:: simgrid::s4u::Link::on_state_change_cb
1714
1715 .. _API_s4u_NetZone:
1716
1717 ================
1718 ⁣  class NetZone
1719 ================
1720
1721 .. tabs::
1722
1723    .. group-tab:: C++
1724
1725       .. doxygenclass:: simgrid::s4u::NetZone
1726
1727    .. group-tab:: Python
1728
1729       .. autoclass:: simgrid.NetZone
1730
1731 Basic management
1732 ----------------
1733
1734 .. tabs::
1735
1736    .. group-tab:: C++
1737
1738       .. code-block:: C++
1739
1740          #include <simgrid/s4u/NetZone.hpp>
1741
1742       Note that there is no NetZonePtr type and that you cannot use the RAII
1743       idiom on network zones because SimGrid does not allow (yet) to create nor
1744       destroy resources once the simulation is started.
1745
1746       .. doxygenfunction:: simgrid::s4u::NetZone::seal
1747
1748    .. group-tab:: Python
1749
1750       .. code:: Python
1751
1752          from simgrid import NetZone
1753
1754       .. automethod:: simgrid.NetZone.seal
1755
1756    .. group-tab:: C
1757
1758       .. code:: C
1759
1760          #include <simgrid/zone.h>
1761
1762       .. doxygentypedef:: sg_netzone_t
1763       .. cpp:type:: const s4u_NetZone* const_sg_netzone_t
1764
1765          Pointer to a constant network zone object.
1766
1767 Retrieving zones
1768 ----------------
1769
1770 .. tabs::
1771
1772    .. group-tab:: C++
1773
1774       See :cpp:func:`simgrid::s4u::Engine::get_netzone_root`,
1775       :cpp:func:`simgrid::s4u::Engine::netzone_by_name_or_null` and
1776       :cpp:func:`simgrid::s4u::Engine::get_filtered_netzones`.
1777
1778    .. group-tab:: C
1779
1780       .. doxygenfunction:: sg_zone_get_by_name(const char *name)
1781       .. doxygenfunction:: sg_zone_get_root()
1782
1783 Querying info
1784 --------------
1785
1786 .. tabs::
1787
1788    .. group-tab:: C++
1789
1790       .. doxygenfunction:: simgrid::s4u::NetZone::get_cname() const
1791       .. doxygenfunction:: simgrid::s4u::NetZone::get_name() const
1792       .. doxygenfunction:: simgrid::s4u::NetZone::get_netpoint()
1793
1794    .. group-tab:: Python
1795
1796       .. autoattribute:: simgrid.NetZone.name
1797       .. autoattribute:: simgrid.NetZone.netpoint
1798
1799    .. group-tab:: C
1800
1801       .. doxygenfunction:: sg_zone_get_name(const_sg_netzone_t zone)
1802
1803 User data and properties
1804 ------------------------
1805
1806 .. tabs::
1807
1808    .. group-tab:: C++
1809
1810       .. doxygenfunction:: simgrid::s4u::NetZone::get_properties() const
1811       .. doxygenfunction:: simgrid::s4u::NetZone::get_property(const std::string &key) const
1812       .. doxygenfunction:: simgrid::s4u::NetZone::set_property(const std::string &key, const std::string &value)
1813
1814    .. group-tab:: Python
1815
1816       .. automethod:: simgrid.NetZone.set_property
1817
1818    .. group-tab:: C
1819
1820       .. doxygenfunction:: sg_zone_get_property_value(const_sg_netzone_t as, const char *name)
1821       .. doxygenfunction:: sg_zone_set_property_value(sg_netzone_t netzone, const char *name, const char *value)
1822
1823 Retrieving components
1824 ---------------------
1825
1826 .. tabs::
1827
1828    .. group-tab:: C++
1829
1830       .. doxygenfunction:: simgrid::s4u::NetZone::get_all_hosts() const
1831       .. doxygenfunction:: simgrid::s4u::NetZone::get_host_count() const
1832
1833    .. group-tab:: C
1834
1835       .. doxygenfunction:: sg_zone_get_hosts(const_sg_netzone_t zone, xbt_dynar_t whereto)
1836
1837 Routing data
1838 ------------
1839
1840 .. tabs::
1841
1842    .. group-tab:: C++
1843
1844       .. doxygenfunction:: simgrid::s4u::NetZone::add_component(kernel::routing::NetPoint *elm)
1845       .. doxygenfunction:: simgrid::s4u::NetZone::add_route
1846       .. doxygenfunction:: simgrid::s4u::NetZone::add_bypass_route
1847       .. doxygenfunction:: simgrid::s4u::NetZone::get_children() const
1848       .. doxygenfunction:: simgrid::s4u::NetZone::get_parent() const
1849       .. doxygenfunction:: simgrid::s4u::NetZone::set_parent(const NetZone* parent)
1850
1851    .. group-tab:: Python
1852
1853       .. automethod:: simgrid.NetZone.add_route
1854       .. automethod:: simgrid.NetZone.set_parent
1855
1856    .. group-tab:: C
1857
1858       .. doxygenfunction:: sg_zone_get_sons(const_sg_netzone_t zone, xbt_dict_t whereto)
1859
1860 Signals
1861 -------
1862
1863 .. tabs::
1864
1865   .. group-tab:: C++
1866
1867      .. doxygenfunction:: simgrid::s4u::NetZone::on_creation_cb
1868      .. doxygenfunction:: simgrid::s4u::NetZone::on_seal_cb
1869
1870 Creating resources
1871 ------------------
1872
1873 Zones
1874 ^^^^^
1875 .. tabs::
1876
1877   .. group-tab:: C++
1878
1879      .. doxygenfunction:: simgrid::s4u::create_full_zone
1880      .. doxygenfunction:: simgrid::s4u::create_empty_zone
1881      .. doxygenfunction:: simgrid::s4u::create_star_zone
1882      .. doxygenfunction:: simgrid::s4u::create_dijkstra_zone
1883      .. doxygenfunction:: simgrid::s4u::create_floyd_zone
1884      .. doxygenfunction:: simgrid::s4u::create_vivaldi_zone
1885      .. doxygenfunction:: simgrid::s4u::create_wifi_zone
1886      .. doxygenfunction:: simgrid::s4u::create_torus_zone
1887      .. doxygenfunction:: simgrid::s4u::create_fatTree_zone
1888      .. doxygenfunction:: simgrid::s4u::create_dragonfly_zone
1889
1890   .. group-tab:: Python
1891
1892      .. automethod:: simgrid.NetZone.create_full_zone
1893      .. automethod:: simgrid.NetZone.create_empty_zone
1894      .. automethod:: simgrid.NetZone.create_star_zone
1895      .. automethod:: simgrid.NetZone.create_dijkstra_zone
1896      .. automethod:: simgrid.NetZone.create_floyd_zone
1897      .. automethod:: simgrid.NetZone.create_vivaldi_zone
1898      .. automethod:: simgrid.NetZone.create_wifi_zone
1899      .. automethod:: simgrid.NetZone.create_torus_zone
1900      .. automethod:: simgrid.NetZone.create_fatTree_zone
1901      .. automethod:: simgrid.NetZone.create_dragonfly_zone
1902
1903 Hosts
1904 ^^^^^
1905
1906 .. tabs::
1907
1908   .. group-tab:: C++
1909
1910      .. doxygenfunction:: simgrid::s4u::NetZone::create_host(const std::string& name, const std::vector<double>& speed_per_pstate)
1911      .. doxygenfunction:: simgrid::s4u::NetZone::create_host(const std::string& name, double speed)
1912      .. doxygenfunction:: simgrid::s4u::NetZone::create_host(const std::string& name, const std::vector<std::string>& speed_per_pstate)
1913      .. doxygenfunction:: simgrid::s4u::NetZone::create_host(const std::string& name, const std::string& speed)
1914
1915   .. group-tab:: Python
1916
1917      .. automethod:: simgrid.NetZone.create_host
1918
1919 Links
1920 ^^^^^
1921
1922 .. tabs::
1923
1924   .. group-tab:: C++
1925
1926      .. doxygenfunction:: simgrid::s4u::NetZone::create_link(const std::string& name, const std::vector<double>& bandwidths)
1927      .. doxygenfunction:: simgrid::s4u::NetZone::create_link(const std::string& name, double bandwidth)
1928      .. doxygenfunction:: simgrid::s4u::NetZone::create_link(const std::string& name, const std::vector<std::string>& bandwidthds)
1929      .. doxygenfunction:: simgrid::s4u::NetZone::create_link(const std::string& name, const std::string& bandwidth)
1930      .. doxygenfunction:: simgrid::s4u::NetZone::create_split_duplex_link(const std::string& name, const std::string& bandwidth)
1931      .. doxygenfunction:: simgrid::s4u::NetZone::create_split_duplex_link(const std::string& name, double bandwidth)
1932
1933   .. group-tab:: Python
1934
1935      .. automethod:: simgrid.NetZone.create_link
1936      .. automethod:: simgrid.NetZone.create_split_duplex_link
1937
1938 Router
1939 ^^^^^^
1940
1941 .. tabs::
1942
1943   .. group-tab:: C++
1944
1945      .. doxygenfunction:: simgrid::s4u::NetZone::create_router(const std::string& name)
1946
1947   .. group-tab:: Python
1948
1949      .. automethod:: simgrid.NetZone.create_router
1950
1951 .. _API_s4u_VirtualMachine:
1952
1953 =======================
1954 ⁣  class VirtualMachine
1955 =======================
1956
1957
1958 .. doxygenclass:: simgrid::s4u::VirtualMachine
1959
1960 Basic management
1961 ----------------
1962 .. tabs::
1963
1964    .. group-tab:: C++
1965
1966       .. code-block:: C++
1967
1968          #include <simgrid/s4u/VirtualMachine.hpp>
1969
1970       Note that there is no VirtualMachinePtr type, and that you cannot use the RAII
1971       idiom on virtual machines. There is no good reason for that and should change in the future.
1972
1973    .. group-tab:: C
1974
1975       .. code:: C
1976
1977          #include <simgrid/vm.h>
1978
1979       .. doxygentypedef:: sg_vm_t
1980       .. cpp:type:: const s4u_VirtualMachine* const_sg_vm_t
1981
1982          Pointer to a constant virtual machine object.
1983
1984 Creating VMs
1985 ------------
1986
1987 .. tabs::
1988
1989    .. group-tab:: C++
1990
1991       .. doxygenfunction:: simgrid::s4u::Host::create_vm(const std::string &name, int core_amount)
1992       .. doxygenfunction:: simgrid::s4u::Host::create_vm(const std::string &name, int core_amount, size_t ramsize)
1993       .. doxygenfunction:: simgrid::s4u::VirtualMachine::destroy
1994
1995    .. group-tab:: C
1996
1997       .. doxygenfunction:: sg_vm_create_core
1998       .. doxygenfunction:: sg_vm_create_multicore
1999       .. doxygenfunction:: sg_vm_destroy
2000
2001 Querying info
2002 --------------
2003
2004 .. tabs::
2005
2006    .. group-tab:: C++
2007
2008       .. doxygenfunction:: simgrid::s4u::VirtualMachine::get_pm() const
2009       .. doxygenfunction:: simgrid::s4u::VirtualMachine::get_ramsize() const
2010       .. doxygenfunction:: simgrid::s4u::VirtualMachine::get_state() const
2011
2012       .. doxygenfunction:: simgrid::s4u::VirtualMachine::set_bound(double bound)
2013       .. doxygenfunction:: simgrid::s4u::VirtualMachine::set_pm(Host *pm)
2014       .. doxygenfunction:: simgrid::s4u::VirtualMachine::set_ramsize(size_t ramsize)
2015
2016    .. group-tab:: C
2017
2018       .. doxygenfunction:: sg_vm_get_ramsize(const_sg_vm_t vm)
2019       .. doxygenfunction:: sg_vm_set_bound(sg_vm_t vm, double bound)
2020       .. doxygenfunction:: sg_vm_set_ramsize(sg_vm_t vm, size_t size)
2021
2022       .. doxygenfunction:: sg_vm_get_name
2023       .. doxygenfunction:: sg_vm_get_pm
2024       .. doxygenfunction:: sg_vm_is_created
2025       .. doxygenfunction:: sg_vm_is_running
2026       .. doxygenfunction:: sg_vm_is_suspended
2027
2028 Life cycle
2029 ----------
2030
2031 .. tabs::
2032
2033    .. group-tab:: C++
2034
2035       .. doxygenfunction:: simgrid::s4u::VirtualMachine::resume()
2036       .. doxygenfunction:: simgrid::s4u::VirtualMachine::shutdown()
2037       .. doxygenfunction:: simgrid::s4u::VirtualMachine::start()
2038       .. doxygenfunction:: simgrid::s4u::VirtualMachine::suspend()
2039
2040    .. group-tab:: C
2041
2042       .. doxygenfunction:: sg_vm_start
2043       .. doxygenfunction:: sg_vm_suspend
2044       .. doxygenfunction:: sg_vm_resume
2045       .. doxygenfunction:: sg_vm_shutdown
2046
2047 Signals
2048 -------
2049
2050 .. tabs::
2051
2052    .. group-tab:: C++
2053
2054       .. doxygenfunction:: simgrid::s4u::VirtualMachine::on_creation_cb
2055       .. doxygenfunction:: simgrid::s4u::VirtualMachine::on_destruction_cb
2056       .. doxygenfunction:: simgrid::s4u::VirtualMachine::on_migration_end_cb
2057       .. doxygenfunction:: simgrid::s4u::VirtualMachine::on_migration_start_cb
2058       .. doxygenfunction:: simgrid::s4u::VirtualMachine::on_resume_cb
2059       .. doxygenfunction:: simgrid::s4u::VirtualMachine::on_shutdown_cb
2060       .. doxygenfunction:: simgrid::s4u::VirtualMachine::on_start_cb
2061       .. doxygenfunction:: simgrid::s4u::VirtualMachine::on_started_cb
2062       .. doxygenfunction:: simgrid::s4u::VirtualMachine::on_suspend_cb
2063
2064 .. _API_s4u_Activity:
2065
2066 ==========
2067 Activities
2068 ==========
2069
2070 ==============
2071 class Activity
2072 ==============
2073
2074 .. doxygenclass:: simgrid::s4u::Activity
2075
2076 **Known subclasses:**
2077 :ref:`Communications <API_s4u_Comm>` (started on Mailboxes and consuming links),
2078 :ref:`Executions <API_s4u_Exec>` (started on Host and consuming CPU resources)
2079 :ref:`I/O <API_s4u_Io>` (started on and consuming disks).
2080 See also the :ref:`section on activities <s4u_Activities>` above.
2081
2082 Basic management
2083 ----------------
2084
2085 .. tabs::
2086
2087    .. group-tab:: C++
2088
2089       .. code-block:: C++
2090
2091          #include <simgrid/s4u/Activity.hpp>
2092
2093       .. doxygentypedef:: ActivityPtr
2094
2095 Querying info
2096 -------------
2097
2098 .. tabs::
2099
2100    .. group-tab:: C++
2101
2102       .. doxygenfunction:: simgrid::s4u::Activity::get_cname
2103       .. doxygenfunction:: simgrid::s4u::Activity::get_name
2104       .. doxygenfunction:: simgrid::s4u::Activity::get_remaining() const
2105       .. doxygenfunction:: simgrid::s4u::Activity::get_state() const
2106       .. doxygenfunction:: simgrid::s4u::Activity::set_remaining(double remains)
2107       .. doxygenfunction:: simgrid::s4u::Activity::set_state(Activity::State state)
2108
2109
2110 Activities life cycle
2111 ---------------------
2112
2113 .. tabs::
2114
2115    .. group-tab:: C++
2116
2117       .. doxygenfunction:: simgrid::s4u::Activity::start
2118       .. doxygenfunction:: simgrid::s4u::Activity::cancel
2119       .. doxygenfunction:: simgrid::s4u::Activity::test
2120       .. doxygenfunction:: simgrid::s4u::Activity::wait
2121       .. doxygenfunction:: simgrid::s4u::Activity::wait_for
2122       .. doxygenfunction:: simgrid::s4u::Activity::wait_until(double time_limit)
2123       .. doxygenfunction:: simgrid::s4u::Activity::vetoable_start()
2124
2125 Suspending and resuming an activity
2126 -----------------------------------
2127
2128 .. tabs::
2129
2130    .. group-tab:: C++
2131
2132       .. doxygenfunction:: simgrid::s4u::Activity::suspend
2133       .. doxygenfunction:: simgrid::s4u::Activity::resume
2134       .. doxygenfunction:: simgrid::s4u::Activity::is_suspended
2135
2136 Signals
2137 -------
2138
2139 .. tabs::
2140
2141    .. group-tab:: C++
2142
2143       .. doxygenfunction:: simgrid::s4u::Activity::on_completion_cb
2144       .. doxygenfunction:: simgrid::s4u::Activity::on_suspended_cb
2145       .. doxygenfunction:: simgrid::s4u::Activity::on_resumed_cb
2146
2147 .. _API_s4u_Comm:
2148
2149 =============
2150 ⁣  class Comm
2151 =============
2152
2153 .. tabs::
2154
2155    .. group-tab:: C++
2156
2157       .. doxygenclass:: simgrid::s4u::Comm
2158
2159    .. group-tab:: Python
2160
2161       .. autoclass:: simgrid.Comm
2162
2163 Basic management
2164 ----------------
2165
2166 .. tabs::
2167
2168    .. group-tab:: C++
2169
2170       .. code-block:: C++
2171
2172          #include <simgrid/s4u/Comm.hpp>
2173
2174       .. doxygentypedef:: CommPtr
2175
2176    .. group-tab:: Python
2177
2178       .. code:: Python
2179
2180          from simgrid import Comm
2181
2182    .. group-tab:: c
2183
2184       .. code:: c
2185
2186          #include <simgrid/comm.h>
2187
2188       .. doxygentypedef:: sg_comm_t
2189
2190 Querying info
2191 -------------
2192
2193 .. tabs::
2194
2195    .. group-tab:: C++
2196
2197       .. doxygenfunction:: simgrid::s4u::Comm::get_dst_data_size() const
2198       .. doxygenfunction:: simgrid::s4u::Comm::get_mailbox() const
2199       .. doxygenfunction:: simgrid::s4u::Comm::get_sender() const
2200       .. doxygenfunction:: simgrid::s4u::Comm::set_dst_data(void **buff)
2201       .. doxygenfunction:: simgrid::s4u::Comm::set_dst_data(void **buff, size_t size)
2202       .. doxygenfunction:: simgrid::s4u::Comm::detach()
2203       .. doxygenfunction:: simgrid::s4u::Comm::detach(const std::function<void(void*)>& clean_function)
2204       .. doxygenfunction:: simgrid::s4u::Comm::set_payload_size(uint64_t bytes)
2205       .. doxygenfunction:: simgrid::s4u::Comm::set_rate(double rate)
2206       .. doxygenfunction:: simgrid::s4u::Comm::set_src_data(void *buff)
2207       .. doxygenfunction:: simgrid::s4u::Comm::set_src_data(void *buff, size_t size)
2208       .. doxygenfunction:: simgrid::s4u::Comm::set_src_data_size(size_t size)
2209
2210    .. group-tab:: Python
2211
2212       .. autoattribute:: simgrid.Comm.dst_data_size
2213       .. autoattribute:: simgrid.Comm.mailbox
2214       .. autoattribute:: simgrid.Comm.sender
2215       .. autoattribute:: simgrid.Comm.state_str
2216       .. automethod:: simgrid.Comm.detach
2217       .. automethod:: simgrid.Comm.set_payload_size
2218       .. automethod:: simgrid.Comm.set_rate
2219
2220 Direct host-to-host communication
2221 ---------------------------------
2222
2223 Most communications are created using :ref:`s4u_mailbox`, but you can
2224 also start direct communications as shown below. See also the
2225 :ref:`relevant examples <s4u_ex_comm_host2host>`.
2226
2227 .. tabs::
2228
2229    .. group-tab:: C++
2230
2231       .. doxygenfunction:: simgrid::s4u::Comm::sendto
2232       .. doxygenfunction:: simgrid::s4u::Comm::sendto_init()
2233       .. doxygenfunction:: simgrid::s4u::Comm::sendto_init(Host *from, Host *to)
2234       .. doxygenfunction:: simgrid::s4u::Comm::sendto_async
2235
2236    .. group-tab:: Python
2237
2238       .. automethod:: simgrid.Comm.sendto
2239       .. automethod:: simgrid.Comm.sendto_init
2240       .. automethod:: simgrid.Comm.sendto_async
2241
2242 Life cycle
2243 ----------
2244
2245 .. tabs::
2246
2247    .. group-tab:: C++
2248
2249       .. doxygenfunction:: simgrid::s4u::Comm::cancel
2250       .. doxygenfunction:: simgrid::s4u::Comm::start
2251       .. doxygenfunction:: simgrid::s4u::Comm::test
2252       .. doxygenfunction:: simgrid::s4u::Comm::test_any(const std::vector< CommPtr >& comms)
2253       .. doxygenfunction:: simgrid::s4u::Comm::wait
2254       .. doxygenfunction:: simgrid::s4u::Comm::wait_all(const std::vector< CommPtr >& comms)
2255       .. doxygenfunction:: simgrid::s4u::Comm::wait_all_for(const std::vector< CommPtr >& comms, double timeout)
2256       .. doxygenfunction:: simgrid::s4u::Comm::wait_any(const std::vector< CommPtr >& comms)
2257       .. doxygenfunction:: simgrid::s4u::Comm::wait_any_for(const std::vector< CommPtr >& comms, double timeout)
2258       .. doxygenfunction:: simgrid::s4u::Comm::wait_for
2259       .. doxygenfunction:: simgrid::s4u::Comm::wait_until
2260
2261    .. group-tab:: Python
2262
2263       .. automethod:: simgrid.Comm.cancel
2264       .. automethod:: simgrid.Comm.start
2265       .. automethod:: simgrid.Comm.test
2266       .. automethod:: simgrid.Comm.test_any
2267       .. automethod:: simgrid.Comm.wait
2268       .. automethod:: simgrid.Comm.wait_for
2269       .. automethod:: simgrid.Comm.wait_all
2270       .. automethod:: simgrid.Comm.wait_all_for
2271       .. automethod:: simgrid.Comm.wait_any
2272       .. automethod:: simgrid.Comm.wait_any_for
2273       .. automethod:: simgrid.Comm.wait_until
2274
2275    .. group-tab:: C
2276
2277       .. doxygenfunction:: sg_comm_test
2278       .. doxygenfunction:: sg_comm_wait
2279       .. doxygenfunction:: sg_comm_wait_all
2280       .. doxygenfunction:: sg_comm_wait_any
2281
2282 Suspending and resuming a communication
2283 ---------------------------------------
2284
2285 .. tabs::
2286
2287    .. group-tab:: C++
2288
2289       .. doxygenfunction:: simgrid::s4u::Comm::suspend
2290       .. doxygenfunction:: simgrid::s4u::Comm::resume
2291       .. doxygenfunction:: simgrid::s4u::Comm::is_suspended
2292
2293    .. group-tab:: Python
2294
2295       .. automethod:: simgrid.Comm.suspend
2296       .. automethod:: simgrid.Comm.resume
2297       .. autoattribute:: simgrid.Comm.is_suspended
2298
2299 Signals
2300 -------
2301
2302 .. tabs::
2303
2304    .. group-tab:: C++
2305
2306       .. doxygenfunction:: simgrid::s4u::Comm::on_start_cb
2307       .. doxygenfunction:: simgrid::s4u::Comm::on_completion_cb
2308       .. doxygenfunction:: simgrid::s4u::Comm::on_recv_cb
2309       .. doxygenfunction:: simgrid::s4u::Comm::on_send_cb
2310
2311 .. _API_s4u_Exec:
2312
2313 =============
2314 ⁣  class Exec
2315 =============
2316
2317 .. tabs::
2318
2319    .. group-tab:: C++
2320
2321       .. doxygenclass:: simgrid::s4u::Exec
2322
2323    .. group-tab:: Python
2324
2325       .. autoclass:: simgrid.Exec
2326
2327 Basic management
2328 ----------------
2329
2330 .. tabs::
2331
2332    .. group-tab:: C++
2333
2334       .. code-block:: C++
2335
2336          #include <simgrid/s4u/Exec.hpp>
2337
2338       .. doxygentypedef:: ExecPtr
2339
2340    .. group-tab:: Python
2341
2342       .. code:: Python
2343
2344          from simgrid import Exec
2345
2346    .. group-tab:: C
2347
2348       .. code-block:: C
2349
2350          #include <simgrid/exec.h>
2351
2352       .. doxygentypedef:: sg_exec_t
2353       .. doxygentypedef:: const_sg_exec_t
2354
2355 Querying info
2356 -------------
2357
2358 .. tabs::
2359
2360    .. group-tab:: C++
2361
2362       .. doxygenfunction:: simgrid::s4u::Exec::get_cost() const
2363       .. doxygenfunction:: simgrid::s4u::Exec::get_finish_time() const
2364       .. doxygenfunction:: simgrid::s4u::Exec::get_host() const
2365       .. doxygenfunction:: simgrid::s4u::Exec::get_host_number() const
2366       .. doxygenfunction:: simgrid::s4u::Exec::get_remaining
2367       .. doxygenfunction:: simgrid::s4u::Exec::get_remaining_ratio
2368       .. doxygenfunction:: simgrid::s4u::Exec::get_start_time() const
2369       .. doxygenfunction:: simgrid::s4u::Exec::set_bound(double bound)
2370       .. doxygenfunction:: simgrid::s4u::Exec::set_host
2371       .. doxygenfunction:: simgrid::s4u::Exec::set_priority(double priority)
2372
2373    .. group-tab:: Python
2374
2375       .. autoattribute:: simgrid.Exec.host
2376       .. autoattribute:: simgrid.Exec.remaining
2377       .. autoattribute:: simgrid.Exec.remaining_ratio
2378
2379    .. group-tab:: C
2380
2381       .. doxygenfunction:: sg_exec_set_bound(sg_exec_t exec, double bound)
2382       .. doxygenfunction:: sg_exec_get_name(const_sg_exec_t exec)
2383       .. doxygenfunction:: sg_exec_set_name(sg_exec_t exec, const char* name)
2384       .. doxygenfunction:: sg_exec_set_host(sg_exec_t exec, sg_host_t new_host)
2385       .. doxygenfunction:: sg_exec_get_remaining(const_sg_exec_t exec)
2386       .. doxygenfunction:: sg_exec_get_remaining_ratio(const_sg_exec_t exec)
2387
2388 Life cycle
2389 ----------
2390
2391 .. tabs::
2392
2393    .. group-tab:: C++
2394
2395       .. doxygenfunction:: simgrid::s4u::Exec::cancel
2396       .. doxygenfunction:: simgrid::s4u::Exec::start
2397       .. doxygenfunction:: simgrid::s4u::Exec::test
2398       .. doxygenfunction:: simgrid::s4u::Exec::wait
2399       .. doxygenfunction:: simgrid::s4u::Exec::wait_any(const std::vector< ExecPtr >& execs)
2400       .. doxygenfunction:: simgrid::s4u::Exec::wait_any_for(const std::vector< ExecPtr >& execs, double timeout)
2401       .. doxygenfunction:: simgrid::s4u::Exec::wait_for
2402
2403    .. group-tab:: Python
2404
2405        .. automethod:: simgrid.Exec.cancel
2406        .. automethod:: simgrid.Exec.start
2407        .. automethod:: simgrid.Exec.test
2408        .. automethod:: simgrid.Exec.wait
2409
2410    .. group-tab:: C
2411
2412        .. doxygenfunction:: sg_exec_start(sg_exec_t exec)
2413        .. doxygenfunction:: sg_exec_cancel(sg_exec_t exec);
2414        .. doxygenfunction:: sg_exec_test(sg_exec_t exec);
2415        .. doxygenfunction:: sg_exec_wait(sg_exec_t exec);
2416        .. doxygenfunction:: sg_exec_wait_for(sg_exec_t exec, double timeout);
2417        .. doxygenfunction:: sg_exec_wait_any_for(sg_exec_t* execs, size_t count, double timeout);
2418        .. doxygenfunction:: sg_exec_wait_any(sg_exec_t* execs, size_t count);
2419
2420 Suspending and resuming an execution
2421 ------------------------------------
2422
2423 .. tabs::
2424
2425    .. group-tab:: C++
2426
2427       .. doxygenfunction:: simgrid::s4u::Exec::suspend
2428       .. doxygenfunction:: simgrid::s4u::Exec::resume
2429       .. doxygenfunction:: simgrid::s4u::Exec::is_suspended
2430
2431    .. group-tab:: Python
2432
2433       .. automethod:: simgrid.Exec.suspend
2434       .. automethod:: simgrid.Exec.resume
2435       .. autoattribute:: simgrid.Exec.is_suspended
2436
2437 Signals
2438 -------
2439
2440 .. tabs::
2441
2442    .. group-tab:: C++
2443
2444       .. doxygenfunction:: simgrid::s4u::Exec::on_start_cb
2445       .. doxygenfunction:: simgrid::s4u::Exec::on_completion_cb
2446
2447 .. _API_s4u_Io:
2448
2449 ===========
2450 ⁣  class Io
2451 ===========
2452
2453 .. tabs::
2454
2455    .. group-tab:: C++
2456
2457       .. doxygenclass:: simgrid::s4u::Io
2458
2459    .. group-tab:: Python
2460
2461       .. autoclass:: simgrid.Io
2462
2463 Basic management
2464 ----------------
2465
2466 .. tabs::
2467
2468    .. group-tab:: C++
2469
2470       .. code-block:: C++
2471
2472          #include <simgrid/s4u/Io.hpp>
2473
2474       .. doxygentypedef:: IoPtr
2475
2476 Querying info
2477 -------------
2478
2479 .. tabs::
2480
2481    .. group-tab:: C++
2482
2483       .. doxygenfunction:: simgrid::s4u::Io::get_performed_ioops() const
2484       .. doxygenfunction:: simgrid::s4u::Io::get_remaining
2485
2486 Life cycle
2487 ----------
2488
2489 .. tabs::
2490
2491    .. group-tab:: C++
2492
2493       .. doxygenfunction:: simgrid::s4u::Io::cancel
2494       .. doxygenfunction:: simgrid::s4u::Io::start
2495       .. doxygenfunction:: simgrid::s4u::Io::test
2496       .. doxygenfunction:: simgrid::s4u::Io::wait
2497       .. doxygenfunction:: simgrid::s4u::Io::wait_for
2498       .. doxygenfunction:: simgrid::s4u::Io::wait_any(const std::vector<IoPtr> &ios)
2499       .. doxygenfunction:: simgrid::s4u::Io::wait_any_for(const std::vector<IoPtr> &ios, double timeout)
2500
2501    .. group-tab:: Python
2502
2503       .. automethod:: simgrid.Io.test
2504       .. automethod:: simgrid.Io.wait
2505       .. automethod:: simgrid.Io.wait_any_for
2506       .. automethod:: simgrid.Io.wait_any
2507
2508 Signals
2509 -------
2510
2511 .. tabs::
2512
2513    .. group-tab:: C++
2514
2515       .. doxygenfunction:: simgrid::s4u::Io::on_start_cb
2516       .. doxygenfunction:: simgrid::s4u::Io::on_completion_cb
2517
2518 .. _API_s4u_Synchronizations:
2519
2520 =======================
2521 Synchronization Objects
2522 =======================
2523
2524 .. _API_s4u_Mutex:
2525
2526 ==============
2527 ⁣  Mutex
2528 ==============
2529
2530 .. tabs::
2531
2532    .. group-tab:: C++
2533
2534       .. doxygenclass:: simgrid::s4u::Mutex
2535
2536    .. group-tab:: Python
2537
2538       .. autoclass:: simgrid.Mutex
2539
2540 Basic management
2541 ----------------
2542
2543    .. tabs::
2544
2545       .. group-tab:: C++
2546
2547          .. code-block:: C++
2548
2549             #include <simgrid/s4u/Mutex.hpp>
2550
2551          .. doxygentypedef:: MutexPtr
2552
2553          .. doxygenfunction:: simgrid::s4u::Mutex::create()
2554
2555       .. group-tab:: Python
2556
2557          .. code-block:: Python
2558
2559             from simgrid import Mutex
2560             mutex = Mutex()
2561
2562             # Use a context manager to acquire and automatically release the mutex
2563             # when leaving the scope.
2564             with mutex:
2565                 # Access shared resource ...
2566                 pass
2567
2568          .. automethod:: simgrid.Mutex.__init__
2569
2570       .. group-tab:: C
2571
2572          .. code-block:: C
2573
2574             #include <simgrid/mutex.h>
2575
2576          .. doxygentypedef:: sg_mutex_t
2577          .. cpp:type:: const s4u_Mutex* const_sg_mutex_t
2578
2579             Pointer to a constant mutex object.
2580
2581          .. doxygenfunction:: sg_mutex_init()
2582          .. doxygenfunction:: sg_mutex_destroy(const_sg_mutex_t mutex)
2583
2584 Locking
2585 -------
2586
2587    .. tabs::
2588
2589       .. group-tab:: C++
2590
2591          .. doxygenfunction:: simgrid::s4u::Mutex::lock()
2592          .. doxygenfunction:: simgrid::s4u::Mutex::try_lock()
2593          .. doxygenfunction:: simgrid::s4u::Mutex::unlock()
2594
2595       .. group-tab:: Python
2596
2597          .. automethod:: simgrid.Mutex.lock
2598          .. automethod:: simgrid.Mutex.try_lock
2599          .. automethod:: simgrid.Mutex.unlock
2600
2601       .. group-tab:: C
2602
2603          .. doxygenfunction:: sg_mutex_lock(sg_mutex_t mutex)
2604          .. doxygenfunction:: sg_mutex_try_lock(sg_mutex_t mutex)
2605          .. doxygenfunction:: sg_mutex_unlock(sg_mutex_t mutex)
2606
2607 .. _API_s4u_Barrier:
2608
2609 ================
2610 ⁣  Barrier
2611 ================
2612
2613 .. tabs::
2614
2615    .. group-tab:: C++
2616
2617       .. doxygenclass:: simgrid::s4u::Barrier
2618
2619    .. group-tab:: Python
2620
2621       .. autoclass:: simgrid.Barrier
2622
2623 .. tabs::
2624
2625    .. group-tab:: C++
2626
2627       .. code-block:: C++
2628
2629          #include <simgrid/s4u/Barrier.hpp>
2630
2631       .. doxygentypedef:: BarrierPtr
2632
2633       .. doxygenfunction:: simgrid::s4u::Barrier::create(unsigned int expected_actors)
2634       .. doxygenfunction:: simgrid::s4u::Barrier::wait()
2635
2636    .. group-tab:: Python
2637
2638       .. code-block:: Python
2639
2640          from simgrid import Barrier
2641          barrier = Barrier(2)
2642
2643       .. automethod:: simgrid.Barrier.__init__
2644       .. automethod:: simgrid.Barrier.wait
2645
2646    .. group-tab:: C
2647
2648       .. code-block:: C
2649
2650          #include <simgrid/barrier.hpp>
2651
2652       .. doxygentypedef:: sg_bar_t
2653
2654       .. doxygenfunction:: sg_barrier_init(unsigned int count)
2655       .. doxygenfunction:: sg_barrier_destroy(sg_bar_t bar)
2656       .. doxygenfunction:: sg_barrier_wait(sg_bar_t bar)
2657
2658
2659 .. _API_s4u_ConditionVariable:
2660
2661 ==========================
2662 ⁣  Condition variable
2663 ==========================
2664
2665 .. doxygenclass:: simgrid::s4u::ConditionVariable
2666
2667 Basic management
2668 ----------------
2669
2670    .. tabs::
2671
2672       .. group-tab:: C++
2673
2674          .. code-block:: C++
2675
2676             #include <simgrid/s4u/ConditionVariable.hpp>
2677
2678          .. doxygentypedef:: ConditionVariablePtr
2679
2680          .. doxygenfunction:: simgrid::s4u::ConditionVariable::create()
2681
2682       .. group-tab:: C
2683
2684          .. code-block:: C
2685
2686             #include <simgrid/cond.h>
2687
2688          .. doxygentypedef:: sg_cond_t
2689          .. doxygentypedef:: const_sg_cond_t
2690          .. doxygenfunction:: sg_cond_init
2691          .. doxygenfunction:: sg_cond_destroy
2692
2693 Waiting and notifying
2694 ---------------------
2695
2696    .. tabs::
2697
2698       .. group-tab:: C++
2699
2700          .. doxygenfunction:: simgrid::s4u::ConditionVariable::notify_all()
2701          .. doxygenfunction:: simgrid::s4u::ConditionVariable::notify_one()
2702          .. doxygenfunction:: simgrid::s4u::ConditionVariable::wait(s4u::MutexPtr lock)
2703          .. doxygenfunction:: simgrid::s4u::ConditionVariable::wait(const std::unique_lock< s4u::Mutex > &lock)
2704          .. doxygenfunction:: simgrid::s4u::ConditionVariable::wait(const std::unique_lock< Mutex > &lock, P pred)
2705          .. doxygenfunction:: simgrid::s4u::ConditionVariable::wait_for(const std::unique_lock< s4u::Mutex > &lock, double duration)
2706          .. doxygenfunction:: simgrid::s4u::ConditionVariable::wait_for(const std::unique_lock< s4u::Mutex > &lock, double duration, P pred)
2707          .. doxygenfunction:: simgrid::s4u::ConditionVariable::wait_for(const std::unique_lock< s4u::Mutex > &lock, std::chrono::duration< Rep, Period > duration)
2708          .. doxygenfunction:: simgrid::s4u::ConditionVariable::wait_for(const std::unique_lock< s4u::Mutex > &lock, std::chrono::duration< Rep, Period > duration, P pred)
2709          .. doxygenfunction:: simgrid::s4u::ConditionVariable::wait_until(const std::unique_lock< s4u::Mutex > &lock, const SimulationTimePoint< Duration > &timeout_time)
2710          .. doxygenfunction:: simgrid::s4u::ConditionVariable::wait_until(const std::unique_lock< s4u::Mutex > &lock, const SimulationTimePoint< Duration > &timeout_time, P pred)
2711          .. doxygenfunction:: simgrid::s4u::ConditionVariable::wait_until(const std::unique_lock< s4u::Mutex > &lock, double timeout_time)
2712          .. doxygenfunction:: simgrid::s4u::ConditionVariable::wait_until(const std::unique_lock< s4u::Mutex > &lock, double timeout_time, P pred)
2713
2714       .. group-tab:: C
2715
2716          .. doxygenfunction:: sg_cond_notify_all
2717          .. doxygenfunction:: sg_cond_notify_one
2718          .. doxygenfunction:: sg_cond_wait
2719          .. doxygenfunction:: sg_cond_wait_for
2720
2721 .. _API_s4u_Semaphore:
2722
2723 ==================
2724 ⁣  Semaphore
2725 ==================
2726
2727 .. tabs::
2728
2729    .. group-tab:: C++
2730
2731       .. doxygenclass:: simgrid::s4u::Semaphore
2732
2733    .. group-tab:: Python
2734
2735       .. autoclass:: simgrid.Semaphore
2736
2737 Basic management
2738 ----------------
2739
2740    .. tabs::
2741
2742       .. group-tab:: C++
2743
2744          .. code-block:: C++
2745
2746             #include <simgrid/s4u/Semaphore.hpp>
2747
2748          .. doxygentypedef:: SemaphorePtr
2749          .. doxygenfunction:: simgrid::s4u::Semaphore::create(unsigned int initial_capacity)
2750
2751       .. group-tab:: Python
2752
2753          .. code-block:: Python
2754
2755             from simgrid import Semaphore
2756             semaphore = Semaphore(1)
2757             # Automatically acquire the semaphore, and release it after leaving the scope.
2758             with semaphore:
2759                 # Do something with the shared resource
2760                 pass
2761
2762          .. automethod:: simgrid.Semaphore.__init__
2763
2764       .. group-tab:: C
2765
2766          .. code-block:: C
2767
2768             #include <simgrid/semaphore.h>
2769
2770          .. doxygentypedef:: sg_sem_t
2771          .. cpp:type:: const s4u_Semaphore* const_sg_sem_t
2772
2773             Pointer to a constant semaphore object.
2774
2775          .. doxygenfunction:: sg_sem_init(int initial_value)
2776          .. doxygenfunction:: sg_sem_destroy(const_sg_sem_t sem)
2777
2778 Locking
2779 -------
2780
2781    .. tabs::
2782
2783       .. group-tab:: C++
2784
2785          .. doxygenfunction:: simgrid::s4u::Semaphore::acquire()
2786          .. doxygenfunction:: simgrid::s4u::Semaphore::acquire_timeout(double timeout)
2787          .. doxygenfunction:: simgrid::s4u::Semaphore::get_capacity() const
2788          .. doxygenfunction:: simgrid::s4u::Semaphore::release()
2789          .. doxygenfunction:: simgrid::s4u::Semaphore::would_block() const
2790
2791       .. group-tab:: Python
2792
2793          .. automethod:: simgrid.Semaphore.acquire
2794          .. automethod:: simgrid.Semaphore.acquire_timeout
2795          .. autoattribute:: simgrid.Semaphore.capacity
2796          .. automethod:: simgrid.Semaphore.release
2797          .. autoattribute:: simgrid.Semaphore.would_block
2798
2799       .. group-tab:: C
2800
2801          .. doxygenfunction:: sg_sem_acquire(sg_sem_t sem)
2802          .. doxygenfunction:: sg_sem_acquire_timeout(sg_sem_t sem, double timeout)
2803          .. doxygenfunction:: sg_sem_get_capacity(const_sg_sem_t sem)
2804          .. doxygenfunction:: sg_sem_release(sg_sem_t sem)
2805          .. doxygenfunction:: sg_sem_would_block(const_sg_sem_t sem)
2806
2807 ===============
2808 Error reporting
2809 ===============
2810
2811 .. tabs::
2812
2813    .. group-tab:: C++
2814
2815       .. doxygenclass:: simgrid::Exception
2816
2817       The following exceptions denote a problem in the simulated platform, and it is often useful to catch them.
2818
2819       .. doxygenclass:: simgrid::CancelException
2820       .. doxygenclass:: simgrid::HostFailureException
2821       .. doxygenclass:: simgrid::NetworkFailureException
2822       .. doxygenclass:: simgrid::StorageFailureException
2823       .. doxygenclass:: simgrid::TimeoutException
2824       .. doxygenclass:: simgrid::VmFailureException
2825
2826       The following errors denote a problem in the SimGrid tool itself. Most of the time, you should let these
2827       exception go, so that the simulation stops. But you may want to catch them, for example when you launch
2828       simgrid from a python notebook and want to handle the problem accordingly.
2829
2830       .. doxygenclass:: simgrid::AssertionError
2831       .. doxygenclass:: simgrid::ParseError
2832       .. doxygenclass:: simgrid::TracingError
2833
2834    .. group-tab:: Python
2835
2836       The following exceptions denote a problem in the simulated platform, and it is often useful to catch them.
2837
2838       .. autoclass:: simgrid.CancelException
2839       .. autoclass:: simgrid.HostFailureException
2840       .. autoclass:: simgrid.NetworkFailureException
2841       .. autoclass:: simgrid.StorageFailureException
2842       .. autoclass:: simgrid.TimeoutException
2843       .. autoclass:: simgrid.VmFailureException
2844
2845       The following errors denote a problem in the SimGrid tool itself. Most of the time, you should let these
2846       exception go, so that the simulation stops. But you may want to catch them, for example when you launch
2847       simgrid from a python notebook and want to handle the problem accordingly.
2848
2849       .. autoclass:: simgrid.AssertionError
2850
2851    .. group-tab:: C
2852
2853       .. doxygenenum:: sg_error_t
2854
2855
2856 .. |hr| raw:: html
2857
2858    <hr />