Logo AND Algorithmique Numérique Distribuée

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