Logo AND Algorithmique Numérique Distribuée

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