Logo AND Algorithmique Numérique Distribuée

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