Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add remaining Comm bindings and examples
[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       .. doxygenfunction:: simgrid::s4u::this_actor::thread_execute
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 .. tabs::
789
790    .. group-tab:: C++
791
792       .. doxygenclass:: simgrid::s4u::Engine
793
794    .. group-tab:: Python
795    
796       .. autoclass:: simgrid.Engine
797
798 Engin initialization
799 --------------------
800
801 .. tabs::
802
803    .. group-tab:: C++
804
805       .. doxygenfunction:: simgrid::s4u::Engine::Engine(int *argc, char **argv)
806       .. doxygenfunction:: simgrid::s4u::Engine::is_initialized()
807       .. doxygenfunction:: simgrid::s4u::Engine::shutdown()
808       .. doxygenfunction:: simgrid::s4u::Engine::get_instance()
809
810    .. group-tab:: Python
811
812        .. automethod:: simgrid.Engine.__init__
813        .. autoattribute:: simgrid.Engine.instance
814
815    .. group-tab:: C
816
817       .. doxygenfunction:: simgrid_init
818
819 Simulation setup
820 ----------------
821
822 .. tabs::
823
824    .. group-tab:: C++
825
826       .. doxygenfunction:: simgrid::s4u::Engine::set_config(const std::string &str)
827       .. doxygenfunction:: simgrid::s4u::Engine::set_config(const std::string &name, bool value)
828       .. doxygenfunction:: simgrid::s4u::Engine::set_config(const std::string &name, double value)
829       .. doxygenfunction:: simgrid::s4u::Engine::set_config(const std::string &name, int value)
830       .. doxygenfunction:: simgrid::s4u::Engine::set_config(const std::string &name, const std::string &value)
831
832       .. doxygenfunction:: simgrid::s4u::Engine::load_deployment
833       .. doxygenfunction:: simgrid::s4u::Engine::load_platform
834       .. doxygenfunction:: simgrid::s4u::Engine::register_actor(const std::string &name)
835       .. doxygenfunction:: simgrid::s4u::Engine::register_actor(const std::string &name, F code)
836       .. doxygenfunction:: simgrid::s4u::Engine::register_default(const std::function< void(int, char **)> &code)
837       .. doxygenfunction:: simgrid::s4u::Engine::register_default(const kernel::actor::ActorCodeFactory &factory)
838
839       .. doxygenfunction:: simgrid::s4u::Engine::register_function(const std::string &name, const std::function< void(int, char **)> &code)
840       .. doxygenfunction:: simgrid::s4u::Engine::register_function(const std::string &name, const std::function< void(std::vector< std::string >)> &code)
841       .. doxygenfunction:: simgrid::s4u::Engine::register_function(const std::string &name, const kernel::actor::ActorCodeFactory &factory)
842
843    .. group-tab:: Python
844
845        .. automethod:: simgrid.Engine.load_deployment
846        .. automethod:: simgrid.Engine.load_platform
847        .. automethod:: simgrid.Engine.register_actor
848
849    .. group-tab:: C
850
851       .. doxygenfunction:: simgrid_load_deployment
852       .. doxygenfunction:: simgrid_load_platform
853       .. doxygenfunction:: simgrid_register_default
854       .. doxygenfunction:: simgrid_register_function
855
856
857 Run the simulation
858 ------------------
859
860 .. tabs::
861
862    .. group-tab:: C++
863
864       .. doxygenfunction:: simgrid::s4u::Engine::get_clock()
865       .. doxygenfunction:: simgrid::s4u::Engine::run
866       .. doxygenfunction:: simgrid::s4u::Engine::run_until
867
868    .. group-tab:: Python
869
870       .. autoattribute:: simgrid.Engine.clock
871       .. automethod:: simgrid.Engine.run
872       .. automethod:: simgrid.Engine.run_until
873
874    .. group-tab:: C
875
876       .. doxygenfunction:: simgrid_get_clock
877       .. doxygenfunction:: simgrid_run
878       .. doxygenfunction:: simgrid_run_until
879
880 Retrieving actors
881 -----------------
882
883 .. tabs::
884
885    .. group-tab:: C++
886
887       .. doxygenfunction:: simgrid::s4u::Engine::get_actor_count
888       .. doxygenfunction:: simgrid::s4u::Engine::get_all_actors
889       .. doxygenfunction:: simgrid::s4u::Engine::get_filtered_actors
890
891    .. group-tab:: C
892
893       .. doxygenfunction:: sg_actor_count()
894
895 Retrieving hosts
896 ----------------
897
898 .. tabs::
899
900    .. group-tab:: C++
901
902       .. doxygenfunction:: simgrid::s4u::Engine::get_all_hosts
903       .. doxygenfunction:: simgrid::s4u::Engine::get_host_count
904       .. doxygenfunction:: simgrid::s4u::Engine::get_filtered_hosts
905       .. doxygenfunction:: simgrid::s4u::Engine::host_by_name
906       .. doxygenfunction:: simgrid::s4u::Engine::host_by_name_or_null
907
908    .. group-tab:: Python
909
910       .. autoattribute:: simgrid.Engine.all_hosts
911       .. automethod:: simgrid::s4u::Engine::host_by_name
912
913    .. group-tab:: C
914
915       See also :cpp:func:`sg_host_list` and :cpp:func:`sg_host_count`.
916
917 Retrieving links
918 ----------------
919
920 .. tabs::
921
922    .. group-tab:: C++
923
924       .. doxygenfunction:: simgrid::s4u::Engine::get_all_links
925       .. doxygenfunction:: simgrid::s4u::Engine::get_link_count
926       .. doxygenfunction:: simgrid::s4u::Engine::get_filtered_links
927       .. doxygenfunction:: simgrid::s4u::Engine::link_by_name
928       .. doxygenfunction:: simgrid::s4u::Engine::link_by_name_or_null
929
930    .. group-tab:: Python
931
932       .. autoattribute:: simgrid.Engine.all_links
933
934 Interacting with the routing
935 ----------------------------
936
937 .. tabs::
938
939    .. group-tab:: C++
940
941       .. doxygenfunction:: simgrid::s4u::Engine::get_all_netpoints
942       .. doxygenfunction:: simgrid::s4u::Engine::get_filtered_netzones
943       .. doxygenfunction:: simgrid::s4u::Engine::get_netzone_root
944       .. doxygenfunction:: simgrid::s4u::Engine::netpoint_by_name_or_null
945       .. doxygenfunction:: simgrid::s4u::Engine::netzone_by_name_or_null
946
947    .. group-tab:: Python
948
949       .. autoattribute:: simgrid.Engine.all_netpoints
950       .. autoattribute:: simgrid.Engine.netzone_root
951       .. automethod:: simgrid.Engine.netpoint_by_name
952       .. automethod:: simgrid.Engine.netzone_by_name
953
954 Signals
955 -------
956
957 .. tabs::
958
959    .. group-tab:: C++
960
961       .. doxygenfunction:: simgrid::s4u::Engine::on_deadlock_cb
962       .. doxygenfunction:: simgrid::s4u::Engine::on_platform_created_cb
963       .. doxygenfunction:: simgrid::s4u::Engine::on_platform_creation_cb
964       .. doxygenfunction:: simgrid::s4u::Engine::on_simulation_start_cb
965       .. doxygenfunction:: simgrid::s4u::Engine::on_simulation_end_cb
966       .. doxygenfunction:: simgrid::s4u::Engine::on_time_advance_cb
967
968 .. _API_s4u_Mailbox:
969
970 ================
971 ⁣  class Mailbox
972 ================
973
974 .. tabs::
975
976    .. group-tab:: C++
977
978       .. doxygenclass:: simgrid::s4u::Mailbox
979
980    .. group-tab:: Python
981    
982       .. autoclass:: simgrid.Mailbox
983
984 Please also refer to the :ref:`full doc on s4u::Mailbox <s4u_mailbox>`.
985
986 Basic management
987 ----------------
988
989 .. tabs::
990
991    .. group-tab:: C++
992
993       .. code-block:: C++
994
995          #include <simgrid/s4u/Mailbox.hpp>
996
997       Note that there is no MailboxPtr type and that you cannot use the RAII
998       idiom on mailboxes because they are internal objects to the simulation
999       engine. Once created, there is no way to destroy a mailbox before the end
1000       of the simulation.
1001
1002       .. doxygenfunction:: simgrid::s4u::Mailbox::by_name(const std::string &name)
1003
1004    .. group-tab:: Python
1005
1006       .. code-block:: C++
1007
1008          #include <simgrid/mailbox.h>
1009
1010       .. automethod:: simgrid.Mailbox.by_name
1011
1012    .. group-tab:: C
1013
1014       .. code-block:: C
1015
1016          #include <simgrid/s4u/mailbox.h>
1017
1018       .. doxygentypedef:: sg_mailbox_t
1019       .. doxygentypedef:: const_sg_mailbox_t
1020
1021       .. doxygenfunction:: sg_mailbox_by_name(const char *alias)
1022
1023 Querying info
1024 -------------
1025
1026 .. tabs::
1027
1028    .. group-tab:: C++
1029
1030       .. doxygenfunction:: simgrid::s4u::Mailbox::get_cname
1031       .. doxygenfunction:: simgrid::s4u::Mailbox::get_name
1032
1033    .. group-tab:: Python
1034
1035       .. autoattribute:: simgrid.Mailbox.name
1036
1037 Sending data
1038 ------------
1039
1040 .. tabs::
1041
1042    .. group-tab:: C++
1043
1044       .. doxygenfunction:: simgrid::s4u::Mailbox::put(void *payload, uint64_t simulated_size_in_bytes)
1045       .. doxygenfunction:: simgrid::s4u::Mailbox::put(void *payload, uint64_t simulated_size_in_bytes, double timeout)
1046       .. doxygenfunction:: simgrid::s4u::Mailbox::put_async(void *data, uint64_t simulated_size_in_bytes)
1047       .. doxygenfunction:: simgrid::s4u::Mailbox::put_init()
1048       .. doxygenfunction:: simgrid::s4u::Mailbox::put_init(void *data, uint64_t simulated_size_in_bytes)
1049
1050    .. group-tab:: Python
1051
1052       .. automethod:: simgrid.Mailbox.put
1053       .. automethod:: simgrid.Mailbox.put_async
1054       .. automethod:: simgrid.Mailbox.put_init
1055
1056    .. group-tab:: C
1057
1058       .. doxygenfunction:: sg_mailbox_put(sg_mailbox_t mailbox, void *payload, long simulated_size_in_bytes)
1059       .. doxygenfunction:: sg_mailbox_put_init(sg_mailbox_t mailbox, void *payload, long simulated_size_in_bytes)
1060       .. doxygenfunction:: sg_mailbox_put_async(sg_mailbox_t mailbox, void *payload, long simulated_size_in_bytes)
1061
1062
1063 Receiving data
1064 --------------
1065
1066 .. tabs::
1067
1068    .. group-tab:: C++
1069
1070       .. doxygenfunction:: simgrid::s4u::Mailbox::empty
1071       .. doxygenfunction:: simgrid::s4u::Mailbox::front
1072       .. doxygenfunction:: simgrid::s4u::Mailbox::get()
1073       .. doxygenfunction:: simgrid::s4u::Mailbox::get(double timeout)
1074       .. doxygenfunction:: simgrid::s4u::Mailbox::get_async(T **data)
1075       .. doxygenfunction:: simgrid::s4u::Mailbox::get_init()
1076       .. doxygenfunction:: simgrid::s4u::Mailbox::iprobe(int type, const std::function<bool(void *, void *, kernel::activity::CommImpl *)>& match_fun, void *data)
1077       .. doxygenfunction:: simgrid::s4u::Mailbox::listen
1078       .. doxygenfunction:: simgrid::s4u::Mailbox::ready
1079
1080    .. group-tab:: Python
1081
1082        .. automethod:: simgrid.Mailbox.get
1083        .. automethod:: simgrid.Mailbox.get_async
1084        .. autoattribute:: simgrid.Mailbox.ready
1085
1086    .. group-tab:: C
1087
1088       .. doxygenfunction:: sg_mailbox_get(sg_mailbox_t mailbox)
1089       .. doxygenfunction:: sg_mailbox_get_async(sg_mailbox_t mailbox, void **data)
1090       .. doxygenfunction:: sg_mailbox_get_name(const_sg_mailbox_t mailbox)
1091       .. doxygenfunction:: sg_mailbox_listen(const char *alias)
1092
1093 Receiving actor
1094 ---------------
1095
1096 See :ref:`s4u_receiving_actor`.
1097
1098 .. tabs::
1099
1100    .. group-tab:: C++
1101
1102       .. doxygenfunction:: simgrid::s4u::Mailbox::get_receiver
1103       .. doxygenfunction:: simgrid::s4u::Mailbox::set_receiver(ActorPtr actor)
1104
1105    .. group-tab:: C
1106
1107       .. doxygenfunction:: sg_mailbox_set_receiver(const char *alias)
1108
1109 .. _API_s4u_Resource:
1110
1111 =========
1112 Resources
1113 =========
1114
1115 .. _API_s4u_Disk:
1116
1117 =============
1118 ⁣  class Disk
1119 =============
1120
1121 .. tabs::
1122
1123    .. group-tab:: C++
1124
1125       .. doxygenclass:: simgrid::s4u::Disk
1126
1127    .. group-tab:: Python
1128    
1129       .. autoclass:: simgrid.Disk
1130
1131    .. group-tab:: C
1132
1133       .. doxygentypedef:: sg_disk_t
1134       .. doxygentypedef:: const_sg_disk_t
1135
1136 Basic management
1137 ----------------
1138
1139 .. tabs::
1140
1141    .. group-tab:: C++
1142
1143       .. code-block:: C++
1144
1145          #include <simgrid/s4u/Disk.hpp>
1146
1147       Note that there is no DiskPtr type and that you cannot use the RAII
1148       idiom on disks because SimGrid does not allow (yet) to create nor
1149       destroy resources once the simulation is started.
1150
1151       .. doxygenfunction:: simgrid::s4u::Disk::seal()
1152
1153    .. group-tab:: Python
1154
1155       .. code:: Python
1156
1157          from simgrid import Disk
1158
1159       .. automethod:: simgrid.Disk.seal
1160
1161
1162 Querying info
1163 -------------
1164
1165 .. tabs::
1166
1167    .. group-tab:: C++
1168
1169       .. doxygenfunction:: simgrid::s4u::Disk::get_cname() const
1170       .. doxygenfunction:: simgrid::s4u::Disk::get_host() const
1171       .. doxygenfunction:: simgrid::s4u::Disk::get_name() const
1172       .. doxygenfunction:: simgrid::s4u::Disk::get_properties() const
1173       .. doxygenfunction:: simgrid::s4u::Disk::get_property(const std::string &key) const
1174       .. doxygenfunction:: simgrid::s4u::Disk::get_read_bandwidth() const
1175       .. doxygenfunction:: simgrid::s4u::Disk::get_write_bandwidth() const
1176       .. doxygenfunction:: simgrid::s4u::Disk::set_property(const std::string &, const std::string &value)
1177       .. doxygenfunction:: simgrid::s4u::Disk::set_sharing_policy(Operation op, SharingPolicy policy, const s4u::NonLinearResourceCb& cb = {})
1178
1179    .. group-tab:: Python
1180
1181       .. autoattribute:: simgrid.Disk.name
1182       .. automethod:: simgrid.Disk.set_sharing_policy
1183
1184 I/O operations
1185 --------------
1186
1187 .. tabs::
1188
1189    .. group-tab:: C++
1190
1191       .. doxygenfunction:: simgrid::s4u::Disk::io_init(sg_size_t size, s4u::Io::OpType type) const
1192       .. doxygenfunction:: simgrid::s4u::Disk::read(sg_size_t size) const
1193       .. doxygenfunction:: simgrid::s4u::Disk::read_async(sg_size_t size) const
1194       .. doxygenfunction:: simgrid::s4u::Disk::write(sg_size_t size) const
1195       .. doxygenfunction:: simgrid::s4u::Disk::write_async(sg_size_t size) const
1196
1197    .. group-tab:: Python
1198
1199       .. automethod:: simgrid.Disk.read
1200       .. automethod:: simgrid.Disk.read_async
1201       .. automethod:: simgrid.Disk.write
1202       .. automethod:: simgrid.Disk.write_async
1203
1204 Signals
1205 -------
1206
1207 .. tabs::
1208
1209    .. group-tab:: C++
1210
1211       .. doxygenfunction:: simgrid::s4u::Disk::on_creation_cb
1212       .. doxygenfunction:: simgrid::s4u::Disk::on_destruction_cb
1213       .. doxygenfunction:: simgrid::s4u::Disk::on_state_change_cb
1214
1215
1216 .. _API_s4u_Host:
1217
1218 =============
1219 ⁣  class Host
1220 =============
1221
1222 .. tabs::
1223
1224    .. group-tab:: C++
1225
1226       .. doxygenclass:: simgrid::s4u::Host
1227
1228    .. group-tab:: Python
1229    
1230       .. autoclass:: simgrid.Host
1231
1232 Basic management
1233 ----------------
1234
1235 .. tabs::
1236
1237    .. group-tab:: C++
1238
1239       .. code-block:: C++
1240
1241          #include <simgrid/s4u/Host.hpp>
1242
1243       Note that there is no HostPtr type, and that you cannot use the RAII
1244       idiom on hosts because SimGrid does not allow (yet) to create nor
1245       destroy resources once the simulation is started.
1246
1247       .. doxygenfunction:: simgrid::s4u::Host::destroy()
1248       .. doxygenfunction:: simgrid::s4u::Host::seal()
1249
1250    .. group-tab:: Python
1251
1252       .. code:: Python
1253
1254          from simgrid import Host
1255
1256       .. automethod:: simgrid.Host.seal
1257
1258    .. group-tab:: C
1259
1260       .. code:: C
1261
1262          #include <simgrid/host.h>
1263
1264       .. doxygentypedef:: sg_host_t
1265       .. cpp:type:: const s4u_Host* const_sg_host_t
1266
1267          Pointer to a constant host object.
1268
1269 Retrieving hosts
1270 ----------------
1271
1272 .. tabs::
1273
1274    .. group-tab:: C++
1275
1276       See also :cpp:func:`simgrid::s4u::Engine::get_all_hosts`.
1277
1278       .. doxygenfunction:: simgrid::s4u::Host::by_name(const std::string &name)
1279       .. doxygenfunction:: simgrid::s4u::Host::by_name_or_null(const std::string &name)
1280       .. doxygenfunction:: simgrid::s4u::Host::current()
1281
1282    .. group-tab:: Python
1283
1284       See also :py:attr:`simgrid.Engine.all_hosts`.
1285
1286       .. automethod:: simgrid.Host.by_name
1287       .. automethod:: simgrid.Host.current
1288
1289    .. group-tab:: C
1290
1291       .. doxygenfunction:: sg_host_by_name(const char *name)
1292       .. doxygenfunction:: sg_host_count()
1293       .. doxygenfunction:: sg_host_list()
1294
1295 Modifying characteristics
1296 -------------------------
1297
1298 .. tabs::
1299
1300    .. group-tab:: C++
1301
1302       .. doxygenfunction:: simgrid::s4u::Host::set_core_count(int core_count)
1303       .. doxygenfunction:: simgrid::s4u::Host::set_coordinates(const std::string& coords)
1304       .. doxygenfunction:: simgrid::s4u::Host::set_sharing_policy(SharingPolicy policy, const s4u::NonLinearResourceCb& cb = {})
1305
1306    .. group-tab:: Python
1307
1308       .. autoattribute:: simgrid.Host.core_count
1309       .. automethod:: simgrid.Host.set_coordinates
1310       .. automethod:: simgrid.Host.set_sharing_policy
1311
1312 Querying info
1313 -------------
1314
1315 .. tabs::
1316
1317    .. group-tab:: C++
1318
1319       .. doxygenfunction:: simgrid::s4u::Host::get_cname() const
1320       .. doxygenfunction:: simgrid::s4u::Host::get_core_count() const
1321       .. doxygenfunction:: simgrid::s4u::Host::get_name() const
1322       .. doxygenfunction:: simgrid::s4u::Host::get_available_speed() const
1323       .. doxygenfunction:: simgrid::s4u::Host::get_load() const
1324       .. doxygenfunction:: simgrid::s4u::Host::get_speed() const
1325
1326    .. group-tab:: Python
1327
1328       .. autoattribute:: simgrid.Host.name
1329       .. autoattribute:: simgrid.Host.core_count
1330       .. autoattribute:: simgrid.Host.load
1331       .. autoattribute:: simgrid.Host.pstate
1332       .. autoattribute:: simgrid.Host.speed
1333       .. autoattribute:: simgrid.Host.available_speed
1334
1335    .. group-tab:: C
1336
1337       .. doxygenfunction:: sg_host_core_count(const_sg_host_t host)
1338       .. doxygenfunction:: sg_host_get_name(const_sg_host_t host)
1339       .. doxygenfunction:: sg_host_get_load(const_sg_host_t host)
1340       .. doxygenfunction:: sg_host_get_speed(const_sg_host_t host)
1341
1342 User data and properties
1343 ------------------------
1344
1345 .. tabs::
1346
1347    .. group-tab:: C++
1348
1349       .. doxygenfunction:: simgrid::s4u::Host::get_properties() const
1350       .. doxygenfunction:: simgrid::s4u::Host::get_property(const std::string &key) const
1351       .. doxygenfunction:: simgrid::s4u::Host::set_properties(const std::unordered_map< std::string, std::string > &properties)
1352       .. doxygenfunction:: simgrid::s4u::Host::set_property(const std::string &key, const std::string &value)
1353
1354    .. group-tab:: C
1355
1356       .. doxygenfunction:: sg_host_set_property_value(sg_host_t host, const char *name, const char *value)
1357       .. doxygenfunction:: sg_host_get_properties(const_sg_host_t host)
1358       .. doxygenfunction:: sg_host_get_property_value(const_sg_host_t host, const char *name)
1359       .. doxygenfunction:: sg_host_extension_create(void(*deleter)(void *))
1360       .. doxygenfunction:: sg_host_extension_get(const_sg_host_t host, size_t rank)
1361
1362 Retrieving components
1363 ---------------------
1364
1365 .. tabs::
1366
1367    .. group-tab:: C++
1368
1369       .. doxygenfunction:: simgrid::s4u::Host::add_disk(const Disk *disk)
1370       .. doxygenfunction:: simgrid::s4u::Host::get_actor_count() const
1371       .. doxygenfunction:: simgrid::s4u::Host::get_all_actors() const
1372       .. doxygenfunction:: simgrid::s4u::Host::get_disks() const
1373       .. doxygenfunction:: simgrid::s4u::Host::remove_disk(const std::string &disk_name)
1374
1375    .. group-tab:: Python
1376
1377       .. automethod:: simgrid.Host.get_disks
1378
1379    .. group-tab:: C
1380
1381       .. doxygenfunction:: sg_host_get_actor_list(const_sg_host_t host, xbt_dynar_t whereto)
1382
1383 On/Off
1384 ------
1385
1386 .. tabs::
1387
1388    .. group-tab:: C++
1389
1390       .. doxygenfunction:: simgrid::s4u::Host::is_on() const
1391       .. doxygenfunction:: simgrid::s4u::Host::turn_off()
1392       .. doxygenfunction:: simgrid::s4u::Host::turn_on()
1393
1394    .. group-tab:: C
1395
1396       .. doxygenfunction:: sg_host_is_on(const_sg_host_t host)
1397       .. doxygenfunction:: sg_host_turn_off(sg_host_t host)
1398       .. doxygenfunction:: sg_host_turn_on(sg_host_t host)
1399
1400 DVFS
1401 ----
1402
1403 .. tabs::
1404
1405    .. group-tab:: C++
1406
1407       .. doxygenfunction:: simgrid::s4u::Host::get_pstate() const
1408       .. doxygenfunction:: simgrid::s4u::Host::get_pstate_count() const
1409       .. doxygenfunction:: simgrid::s4u::Host::get_pstate_speed(unsigned long pstate_index) const
1410       .. doxygenfunction:: simgrid::s4u::Host::set_pstate(unsigned long pstate_index)
1411
1412    .. group-tab:: Python
1413
1414       .. autoattribute:: simgrid.Host.pstate_count
1415       .. automethod:: simgrid.Host.pstate_speed
1416
1417    .. group-tab:: C
1418
1419       .. doxygenfunction:: sg_host_get_available_speed(const_sg_host_t host)
1420       .. doxygenfunction:: sg_host_get_nb_pstates(const_sg_host_t host)
1421       .. doxygenfunction:: sg_host_get_pstate(const_sg_host_t host)
1422       .. doxygenfunction:: sg_host_get_pstate_speed(const_sg_host_t host, unsigned long pstate_index)
1423       .. doxygenfunction:: sg_host_set_pstate(sg_host_t host, unsigned long pstate)
1424
1425 Dynamic profiles
1426 ----------------
1427
1428 .. tabs::
1429
1430    .. group-tab:: C++
1431
1432       .. doxygenfunction:: simgrid::s4u::Host::set_speed_profile(kernel::profile::Profile *p)
1433       .. doxygenfunction:: simgrid::s4u::Host::set_state_profile(kernel::profile::Profile *p)
1434
1435    .. group-tab:: Python
1436
1437       .. automethod:: simgrid.Host.set_speed_profile
1438       .. automethod:: simgrid.Host.set_state_profile
1439
1440 Execution
1441 ---------
1442
1443 .. tabs::
1444
1445    .. group-tab:: C++
1446
1447       .. doxygenfunction:: simgrid::s4u::Host::exec_async
1448       .. doxygenfunction:: simgrid::s4u::Host::execute(double flops) const
1449       .. doxygenfunction:: simgrid::s4u::Host::execute(double flops, double priority) const
1450
1451 Platform and routing
1452 --------------------
1453
1454 You can also start direct communications between two arbitrary hosts
1455 using :cpp:func:`Comm::sendto() <simgrid::s4u::Comm::sendto()>`.
1456
1457 .. tabs::
1458
1459    .. group-tab:: C++
1460
1461       .. doxygenfunction:: simgrid::s4u::Host::get_englobing_zone() const
1462       .. doxygenfunction:: simgrid::s4u::Host::get_netpoint() const
1463       .. doxygenfunction:: simgrid::s4u::Host::route_to(const Host *dest, std::vector< Link * > &links, double *latency) const
1464       .. doxygenfunction:: simgrid::s4u::Host::route_to(const Host *dest, std::vector< kernel::resource::StandardLinkImpl * > &links, double *latency) const
1465       .. doxygenfunction:: simgrid::s4u::Host::create_disk(const std::string& name, double read_bandwidth, double write_bandwidth)
1466       .. doxygenfunction:: simgrid::s4u::Host::create_disk(const std::string& name, const std::string& read_bandwidth, const std::string& write_bandwidth)
1467
1468    .. group-tab:: Python
1469
1470       .. autoattribute:: simgrid.Host.netpoint
1471       .. automethod:: simgrid.Host.create_disk
1472          
1473       .. automethod:: simgrid.Host.route_to
1474
1475    .. group-tab:: C
1476
1477       .. doxygenfunction:: sg_host_get_route(const_sg_host_t from, const_sg_host_t to, xbt_dynar_t links)
1478       .. doxygenfunction:: sg_host_get_route_bandwidth(const_sg_host_t from, const_sg_host_t to)
1479       .. doxygenfunction:: sg_host_get_route_latency(const_sg_host_t from, const_sg_host_t to)
1480       .. doxygenfunction:: sg_host_sendto(sg_host_t from, sg_host_t to, double byte_amount)
1481
1482 Signals
1483 -------
1484
1485 .. tabs::
1486
1487    .. group-tab:: C++
1488
1489       .. doxygenfunction:: simgrid::s4u::Host::on_creation_cb
1490       .. doxygenfunction:: simgrid::s4u::Host::on_destruction_cb
1491       .. doxygenfunction:: simgrid::s4u::Host::on_speed_change_cb
1492       .. doxygenfunction:: simgrid::s4u::Host::on_state_change_cb
1493
1494 .. _API_s4u_Link:
1495
1496 =============
1497 ⁣  class Link
1498 =============
1499
1500 .. tabs::
1501
1502    .. group-tab:: C++
1503
1504       .. doxygenclass:: simgrid::s4u::Link
1505       .. doxygenclass:: simgrid::s4u::SplitDuplexLink
1506       .. doxygenclass:: simgrid::s4u::LinkInRoute
1507
1508
1509    .. group-tab:: Python
1510    
1511       .. autoclass:: simgrid.Link
1512
1513 Basic management
1514 ----------------
1515
1516 .. tabs::
1517
1518    .. group-tab:: C++
1519
1520       .. code-block:: C++
1521
1522          #include <simgrid/s4u/Link.hpp>
1523
1524       Note that there is no LinkPtr type and that you cannot use the RAII
1525       idiom on hosts because SimGrid does not allow (yet) to create nor
1526       destroy resources once the simulation is started.
1527
1528       .. doxygenfunction:: simgrid::s4u::Link::seal()
1529
1530    .. group-tab:: Python
1531
1532       .. code:: Python
1533
1534          from simgrid import Link
1535
1536       .. automethod:: simgrid.Link.seal
1537
1538    .. group-tab:: C
1539
1540       .. code:: C
1541
1542          #include <simgrid/link.h>
1543
1544       .. doxygentypedef:: sg_link_t
1545       .. cpp:type:: const s4u_Link* const_sg_link_t
1546
1547          Pointer to a constant link object.
1548
1549 Retrieving links
1550 ----------------
1551
1552 .. tabs::
1553
1554    .. group-tab:: C++
1555
1556       See also :cpp:func:`simgrid::s4u::Engine::get_all_links`.
1557
1558       .. doxygenfunction:: simgrid::s4u::Link::by_name(const std::string &name)
1559       .. doxygenfunction:: simgrid::s4u::Link::by_name_or_null(const std::string &name)
1560
1561    .. group-tab:: Python
1562
1563       See also :py:attr:`simgrid.Engine.all_links`.
1564
1565       .. automethod:: simgrid.Link.by_name
1566       .. autoattribute:: simgrid.Link.name
1567
1568    .. group-tab:: C
1569
1570       .. doxygenfunction:: sg_link_by_name(const char *name)
1571       .. doxygenfunction:: sg_link_count()
1572       .. doxygenfunction:: sg_link_list()
1573
1574 Querying info
1575 --------------
1576
1577 .. tabs::
1578
1579    .. group-tab:: C++
1580
1581       .. doxygenfunction:: simgrid::s4u::Link::get_bandwidth() const
1582       .. doxygenfunction:: simgrid::s4u::Link::get_cname() const
1583       .. doxygenfunction:: simgrid::s4u::Link::get_latency() const
1584       .. doxygenfunction:: simgrid::s4u::Link::get_name() const
1585       .. doxygenfunction:: simgrid::s4u::Link::get_sharing_policy() const
1586       .. doxygenfunction:: simgrid::s4u::Link::get_usage() const
1587       .. doxygenfunction:: simgrid::s4u::Link::is_used() const
1588
1589    .. group-tab:: Python
1590
1591       .. autoattribute:: simgrid.Link.bandwidth
1592       .. autoattribute:: simgrid.Link.latency
1593
1594    .. group-tab:: C
1595
1596       .. doxygenfunction:: sg_link_get_bandwidth(const_sg_link_t link)
1597       .. doxygenfunction:: sg_link_get_latency(const_sg_link_t link)
1598       .. doxygenfunction:: sg_link_get_name(const_sg_link_t link)
1599       .. doxygenfunction:: sg_link_is_shared(const_sg_link_t link)
1600
1601 Modifying characteristics
1602 -------------------------
1603
1604 .. tabs::
1605
1606    .. group-tab:: C++
1607
1608       .. doxygenfunction:: simgrid::s4u::Link::set_bandwidth(double value)
1609       .. doxygenfunction:: simgrid::s4u::Link::set_latency(double value)
1610       .. doxygenfunction:: simgrid::s4u::Link::set_latency(const std::string& value)
1611       .. doxygenfunction:: simgrid::s4u::Link::set_concurrency_limit(int limit)
1612       .. doxygenfunction:: simgrid::s4u::Link::set_sharing_policy(SharingPolicy policy, const NonLinearResourceCb& cb = {})
1613
1614    .. group-tab:: Python
1615
1616       .. automethod:: simgrid.Link.set_bandwidth
1617       .. automethod:: simgrid.Link.set_latency
1618       .. automethod:: simgrid.Link.set_concurrency_limit
1619       .. automethod:: simgrid.Link.set_sharing_policy
1620
1621    .. group-tab:: C
1622
1623       .. doxygenfunction:: sg_link_set_bandwidth(sg_link_t link, double value)
1624       .. doxygenfunction:: sg_link_set_latency(sg_link_t link, double value)
1625
1626 User data and properties
1627 ------------------------
1628
1629 .. tabs::
1630
1631    .. group-tab:: C++
1632
1633       .. doxygenfunction:: simgrid::s4u::Link::get_property(const std::string &key) const
1634       .. doxygenfunction:: simgrid::s4u::Link::set_property(const std::string &key, const std::string &value)
1635
1636    .. group-tab:: C
1637
1638       .. doxygenfunction:: sg_link_get_data(const_sg_link_t link)
1639       .. doxygenfunction:: sg_link_set_data(sg_link_t link, void *data)
1640
1641 On/Off
1642 ------
1643
1644 .. tabs::
1645
1646    .. group-tab:: C++
1647
1648       See also :cpp:func:`simgrid::s4u::Link::set_state_profile`.
1649
1650       .. doxygenfunction:: simgrid::s4u::Link::is_on() const
1651       .. doxygenfunction:: simgrid::s4u::Link::turn_off()
1652       .. doxygenfunction:: simgrid::s4u::Link::turn_on()
1653
1654    .. group-tab:: Python
1655
1656       See also :py:func:`simgrid.Link.set_state_profile`.
1657
1658       .. automethod:: simgrid.Link.is_on
1659       .. automethod:: simgrid.Link.turn_off
1660       .. automethod:: simgrid.Link.turn_on
1661
1662 Dynamic profiles
1663 ----------------
1664
1665 See :ref:`howto_churn` for more details.
1666
1667 .. tabs::
1668
1669    .. group-tab:: C++
1670
1671       .. doxygenfunction:: simgrid::s4u::Link::set_bandwidth_profile(kernel::profile::Profile *profile)
1672       .. doxygenfunction:: simgrid::s4u::Link::set_latency_profile(kernel::profile::Profile *profile)
1673       .. doxygenfunction:: simgrid::s4u::Link::set_state_profile(kernel::profile::Profile *profile)
1674
1675    .. group-tab:: Python
1676
1677       .. automethod:: simgrid.Link.set_bandwidth_profile
1678       .. automethod:: simgrid.Link.set_latency_profile
1679       .. automethod:: simgrid.Link.set_state_profile
1680
1681 WIFI links
1682 ----------
1683
1684 .. tabs::
1685
1686    .. group-tab:: C++
1687
1688       .. doxygenfunction:: simgrid::s4u::Link::set_host_wifi_rate
1689
1690    .. group-tab:: Python
1691
1692       .. automethod:: simgrid.Link.set_host_wifi_rate
1693
1694 Signals
1695 -------
1696
1697 .. tabs::
1698
1699    .. group-tab:: C++
1700
1701       .. doxygenfunction:: simgrid::s4u::Link::on_bandwidth_change_cb
1702       .. doxygenfunction:: simgrid::s4u::Link::on_communication_state_change_cb
1703       .. doxygenfunction:: simgrid::s4u::Link::on_creation_cb
1704       .. doxygenfunction:: simgrid::s4u::Link::on_destruction_cb
1705       .. doxygenfunction:: simgrid::s4u::Link::on_state_change_cb
1706
1707 .. _API_s4u_NetZone:
1708
1709 ================
1710 ⁣  class NetZone
1711 ================
1712
1713 .. tabs::
1714
1715    .. group-tab:: C++
1716
1717       .. doxygenclass:: simgrid::s4u::NetZone
1718
1719    .. group-tab:: Python
1720    
1721       .. autoclass:: simgrid.NetZone
1722
1723 Basic management
1724 ----------------
1725
1726 .. tabs::
1727
1728    .. group-tab:: C++
1729
1730       .. code-block:: C++
1731
1732          #include <simgrid/s4u/NetZone.hpp>
1733
1734       Note that there is no NetZonePtr type and that you cannot use the RAII
1735       idiom on network zones because SimGrid does not allow (yet) to create nor
1736       destroy resources once the simulation is started.
1737
1738       .. doxygenfunction:: simgrid::s4u::NetZone::seal
1739
1740    .. group-tab:: Python
1741
1742       .. code:: Python
1743
1744          from simgrid import NetZone
1745
1746       .. automethod:: simgrid.NetZone.seal
1747
1748    .. group-tab:: C
1749
1750       .. code:: C
1751
1752          #include <simgrid/zone.h>
1753
1754       .. doxygentypedef:: sg_netzone_t
1755       .. cpp:type:: const s4u_NetZone* const_sg_netzone_t
1756
1757          Pointer to a constant network zone object.
1758
1759 Retrieving zones
1760 ----------------
1761
1762 .. tabs::
1763
1764    .. group-tab:: C++
1765
1766       See :cpp:func:`simgrid::s4u::Engine::get_netzone_root`,
1767       :cpp:func:`simgrid::s4u::Engine::netzone_by_name_or_null` and
1768       :cpp:func:`simgrid::s4u::Engine::get_filtered_netzones`.
1769
1770    .. group-tab:: C
1771
1772       .. doxygenfunction:: sg_zone_get_by_name(const char *name)
1773       .. doxygenfunction:: sg_zone_get_root()
1774
1775 Querying info
1776 --------------
1777
1778 .. tabs::
1779
1780    .. group-tab:: C++
1781
1782       .. doxygenfunction:: simgrid::s4u::NetZone::get_cname() const
1783       .. doxygenfunction:: simgrid::s4u::NetZone::get_name() const
1784       .. doxygenfunction:: simgrid::s4u::NetZone::get_netpoint()
1785
1786    .. group-tab:: Python
1787
1788       .. autoattribute:: simgrid.NetZone.name
1789       .. autoattribute:: simgrid.NetZone.netpoint
1790
1791    .. group-tab:: C
1792
1793       .. doxygenfunction:: sg_zone_get_name(const_sg_netzone_t zone)
1794
1795 User data and properties
1796 ------------------------
1797
1798 .. tabs::
1799
1800    .. group-tab:: C++
1801
1802       .. doxygenfunction:: simgrid::s4u::NetZone::get_properties() const
1803       .. doxygenfunction:: simgrid::s4u::NetZone::get_property(const std::string &key) const
1804       .. doxygenfunction:: simgrid::s4u::NetZone::set_property(const std::string &key, const std::string &value)
1805
1806    .. group-tab:: Python
1807
1808       .. automethod:: simgrid.NetZone.set_property
1809
1810    .. group-tab:: C
1811
1812       .. doxygenfunction:: sg_zone_get_property_value(const_sg_netzone_t as, const char *name)
1813       .. doxygenfunction:: sg_zone_set_property_value(sg_netzone_t netzone, const char *name, const char *value)
1814
1815 Retrieving components
1816 ---------------------
1817
1818 .. tabs::
1819
1820    .. group-tab:: C++
1821
1822       .. doxygenfunction:: simgrid::s4u::NetZone::get_all_hosts() const
1823       .. doxygenfunction:: simgrid::s4u::NetZone::get_host_count() const
1824
1825    .. group-tab:: C
1826
1827       .. doxygenfunction:: sg_zone_get_hosts(const_sg_netzone_t zone, xbt_dynar_t whereto)
1828
1829 Routing data
1830 ------------
1831
1832 .. tabs::
1833
1834    .. group-tab:: C++
1835
1836       .. doxygenfunction:: simgrid::s4u::NetZone::add_component(kernel::routing::NetPoint *elm)
1837       .. doxygenfunction:: simgrid::s4u::NetZone::add_route
1838       .. doxygenfunction:: simgrid::s4u::NetZone::add_bypass_route
1839       .. doxygenfunction:: simgrid::s4u::NetZone::get_children() const
1840       .. doxygenfunction:: simgrid::s4u::NetZone::get_parent() const
1841       .. doxygenfunction:: simgrid::s4u::NetZone::set_parent(const NetZone* parent)
1842
1843    .. group-tab:: Python
1844
1845       .. automethod:: simgrid.NetZone.add_route
1846       .. automethod:: simgrid.NetZone.set_parent
1847
1848    .. group-tab:: C
1849
1850       .. doxygenfunction:: sg_zone_get_sons(const_sg_netzone_t zone, xbt_dict_t whereto)
1851
1852 Signals
1853 -------
1854
1855 .. tabs::
1856
1857   .. group-tab:: C++
1858
1859      .. doxygenfunction:: simgrid::s4u::NetZone::on_creation_cb
1860      .. doxygenfunction:: simgrid::s4u::NetZone::on_seal_cb
1861
1862 Creating resources
1863 ------------------
1864
1865 Zones
1866 ^^^^^
1867 .. tabs::
1868
1869   .. group-tab:: C++
1870
1871      .. doxygenfunction:: simgrid::s4u::create_full_zone(const std::string& name)
1872      .. doxygenfunction:: simgrid::s4u::create_empty_zone(const std::string& name)
1873      .. doxygenfunction:: simgrid::s4u::create_star_zone(const std::string& name)
1874      .. doxygenfunction:: simgrid::s4u::create_dijkstra_zone(const std::string& name, bool cache)
1875      .. doxygenfunction:: simgrid::s4u::create_floyd_zone(const std::string& name)
1876      .. doxygenfunction:: simgrid::s4u::create_vivaldi_zone(const std::string& name)
1877      .. doxygenfunction:: simgrid::s4u::create_wifi_zone(const std::string& name)
1878      .. doxygenfunction:: simgrid::s4u::create_torus_zone
1879      .. 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)
1880      .. 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)
1881
1882   .. group-tab:: Python
1883
1884      .. automethod:: simgrid.NetZone.create_full_zone
1885      .. automethod:: simgrid.NetZone.create_empty_zone
1886      .. automethod:: simgrid.NetZone.create_star_zone
1887      .. automethod:: simgrid.NetZone.create_dijkstra_zone
1888      .. automethod:: simgrid.NetZone.create_floyd_zone
1889      .. automethod:: simgrid.NetZone.create_vivaldi_zone
1890      .. automethod:: simgrid.NetZone.create_wifi_zone
1891      .. automethod:: simgrid.NetZone.create_torus_zone
1892      .. automethod:: simgrid.NetZone.create_fatTree_zone
1893      .. automethod:: simgrid.NetZone.create_dragonfly_zone
1894
1895 Hosts
1896 ^^^^^
1897
1898 .. tabs::
1899
1900   .. group-tab:: C++
1901
1902      .. doxygenfunction:: simgrid::s4u::NetZone::create_host(const std::string& name, const std::vector<double>& speed_per_pstate)
1903      .. doxygenfunction:: simgrid::s4u::NetZone::create_host(const std::string& name, double speed)
1904      .. doxygenfunction:: simgrid::s4u::NetZone::create_host(const std::string& name, const std::vector<std::string>& speed_per_pstate)
1905      .. doxygenfunction:: simgrid::s4u::NetZone::create_host(const std::string& name, const std::string& speed)
1906
1907   .. group-tab:: Python
1908
1909      .. automethod:: simgrid.NetZone.create_host
1910
1911 Links
1912 ^^^^^
1913
1914 .. tabs::
1915
1916   .. group-tab:: C++
1917
1918      .. doxygenfunction:: simgrid::s4u::NetZone::create_link(const std::string& name, const std::vector<double>& bandwidths)
1919      .. doxygenfunction:: simgrid::s4u::NetZone::create_link(const std::string& name, double bandwidth)
1920      .. doxygenfunction:: simgrid::s4u::NetZone::create_link(const std::string& name, const std::vector<std::string>& bandwidthds)
1921      .. doxygenfunction:: simgrid::s4u::NetZone::create_link(const std::string& name, const std::string& bandwidth)
1922      .. doxygenfunction:: simgrid::s4u::NetZone::create_split_duplex_link(const std::string& name, const std::string& bandwidth)
1923      .. doxygenfunction:: simgrid::s4u::NetZone::create_split_duplex_link(const std::string& name, double bandwidth)
1924
1925   .. group-tab:: Python
1926
1927      .. automethod:: simgrid.NetZone.create_link
1928      .. automethod:: simgrid.NetZone.create_split_duplex_link
1929
1930 Router
1931 ^^^^^^
1932
1933 .. tabs::
1934
1935   .. group-tab:: C++
1936
1937      .. doxygenfunction:: simgrid::s4u::NetZone::create_router(const std::string& name)
1938
1939   .. group-tab:: Python
1940
1941      .. automethod:: simgrid.NetZone.create_router
1942
1943 .. _API_s4u_VirtualMachine:
1944
1945 =======================
1946 ⁣  class VirtualMachine
1947 =======================
1948
1949
1950 .. doxygenclass:: simgrid::s4u::VirtualMachine
1951
1952 Basic management
1953 ----------------
1954 .. tabs::
1955
1956    .. group-tab:: C++
1957
1958       .. code-block:: C++
1959
1960          #include <simgrid/s4u/VirtualMachine.hpp>
1961
1962       Note that there is no VirtualMachinePtr type, and that you cannot use the RAII
1963       idiom on virtual machines. There is no good reason for that and should change in the future.
1964
1965    .. group-tab:: C
1966
1967       .. code:: C
1968
1969          #include <simgrid/vm.h>
1970
1971       .. doxygentypedef:: sg_vm_t
1972       .. cpp:type:: const s4u_VirtualMachine* const_sg_vm_t
1973
1974          Pointer to a constant virtual machine object.
1975
1976 Creating VMs
1977 ------------
1978
1979 .. tabs::
1980
1981    .. group-tab:: C++
1982
1983       .. doxygenfunction:: simgrid::s4u::Host::create_vm(const std::string &name, int core_amount)
1984       .. doxygenfunction:: simgrid::s4u::Host::create_vm(const std::string &name, int core_amount, size_t ramsize)
1985       .. doxygenfunction:: simgrid::s4u::VirtualMachine::destroy
1986
1987    .. group-tab:: C
1988
1989       .. doxygenfunction:: sg_vm_create_core
1990       .. doxygenfunction:: sg_vm_create_multicore
1991       .. doxygenfunction:: sg_vm_destroy
1992
1993 Querying info
1994 --------------
1995
1996 .. tabs::
1997
1998    .. group-tab:: C++
1999
2000       .. doxygenfunction:: simgrid::s4u::VirtualMachine::get_pm() const
2001       .. doxygenfunction:: simgrid::s4u::VirtualMachine::get_ramsize() const
2002       .. doxygenfunction:: simgrid::s4u::VirtualMachine::get_state() const
2003
2004       .. doxygenfunction:: simgrid::s4u::VirtualMachine::set_bound(double bound)
2005       .. doxygenfunction:: simgrid::s4u::VirtualMachine::set_pm(Host *pm)
2006       .. doxygenfunction:: simgrid::s4u::VirtualMachine::set_ramsize(size_t ramsize)
2007
2008    .. group-tab:: C
2009
2010       .. doxygenfunction:: sg_vm_get_ramsize(const_sg_vm_t vm)
2011       .. doxygenfunction:: sg_vm_set_bound(sg_vm_t vm, double bound)
2012       .. doxygenfunction:: sg_vm_set_ramsize(sg_vm_t vm, size_t size)
2013
2014       .. doxygenfunction:: sg_vm_get_name
2015       .. doxygenfunction:: sg_vm_get_pm
2016       .. doxygenfunction:: sg_vm_is_created
2017       .. doxygenfunction:: sg_vm_is_running
2018       .. doxygenfunction:: sg_vm_is_suspended
2019
2020 Life cycle
2021 ----------
2022
2023 .. tabs::
2024
2025    .. group-tab:: C++
2026
2027       .. doxygenfunction:: simgrid::s4u::VirtualMachine::resume()
2028       .. doxygenfunction:: simgrid::s4u::VirtualMachine::shutdown()
2029       .. doxygenfunction:: simgrid::s4u::VirtualMachine::start()
2030       .. doxygenfunction:: simgrid::s4u::VirtualMachine::suspend()
2031
2032    .. group-tab:: C
2033
2034       .. doxygenfunction:: sg_vm_start
2035       .. doxygenfunction:: sg_vm_suspend
2036       .. doxygenfunction:: sg_vm_resume
2037       .. doxygenfunction:: sg_vm_shutdown
2038
2039 Signals
2040 -------
2041
2042 .. tabs::
2043
2044    .. group-tab:: C++
2045
2046       .. doxygenfunction:: simgrid::s4u::VirtualMachine::on_creation_cb
2047       .. doxygenfunction:: simgrid::s4u::VirtualMachine::on_destruction_cb
2048       .. doxygenfunction:: simgrid::s4u::VirtualMachine::on_migration_end_cb
2049       .. doxygenfunction:: simgrid::s4u::VirtualMachine::on_migration_start_cb
2050       .. doxygenfunction:: simgrid::s4u::VirtualMachine::on_resume_cb
2051       .. doxygenfunction:: simgrid::s4u::VirtualMachine::on_shutdown_cb
2052       .. doxygenfunction:: simgrid::s4u::VirtualMachine::on_start_cb
2053       .. doxygenfunction:: simgrid::s4u::VirtualMachine::on_started_cb
2054       .. doxygenfunction:: simgrid::s4u::VirtualMachine::on_suspend_cb
2055
2056 .. _API_s4u_Activity:
2057
2058 ==========
2059 Activities
2060 ==========
2061
2062 ==============
2063 class Activity
2064 ==============
2065
2066 .. doxygenclass:: simgrid::s4u::Activity
2067
2068 **Known subclasses:**
2069 :ref:`Communications <API_s4u_Comm>` (started on Mailboxes and consuming links),
2070 :ref:`Executions <API_s4u_Exec>` (started on Host and consuming CPU resources)
2071 :ref:`I/O <API_s4u_Io>` (started on and consuming disks).
2072 See also the :ref:`section on activities <s4u_Activities>` above.
2073
2074 Basic management
2075 ----------------
2076
2077 .. tabs::
2078
2079    .. group-tab:: C++
2080
2081       .. code-block:: C++
2082
2083          #include <simgrid/s4u/Activity.hpp>
2084
2085       .. doxygentypedef:: ActivityPtr
2086
2087 Querying info
2088 -------------
2089
2090 .. tabs::
2091
2092    .. group-tab:: C++
2093
2094       .. doxygenfunction:: simgrid::s4u::Activity::get_cname
2095       .. doxygenfunction:: simgrid::s4u::Activity::get_name
2096       .. doxygenfunction:: simgrid::s4u::Activity::get_remaining() const
2097       .. doxygenfunction:: simgrid::s4u::Activity::get_state() const
2098       .. doxygenfunction:: simgrid::s4u::Activity::set_remaining(double remains)
2099       .. doxygenfunction:: simgrid::s4u::Activity::set_state(Activity::State state)
2100
2101
2102 Activities life cycle
2103 ---------------------
2104
2105 .. tabs::
2106
2107    .. group-tab:: C++
2108
2109       .. doxygenfunction:: simgrid::s4u::Activity::start
2110       .. doxygenfunction:: simgrid::s4u::Activity::cancel
2111       .. doxygenfunction:: simgrid::s4u::Activity::test
2112       .. doxygenfunction:: simgrid::s4u::Activity::wait
2113       .. doxygenfunction:: simgrid::s4u::Activity::wait_for
2114       .. doxygenfunction:: simgrid::s4u::Activity::wait_until(double time_limit)
2115       .. doxygenfunction:: simgrid::s4u::Activity::vetoable_start()
2116
2117 Suspending and resuming an activity
2118 -----------------------------------
2119
2120 .. tabs::
2121
2122    .. group-tab:: C++
2123
2124       .. doxygenfunction:: simgrid::s4u::Activity::suspend
2125       .. doxygenfunction:: simgrid::s4u::Activity::resume
2126       .. doxygenfunction:: simgrid::s4u::Activity::is_suspended
2127
2128 .. _API_s4u_Comm:
2129
2130 =============
2131 ⁣  class Comm
2132 =============
2133
2134 .. tabs::
2135
2136    .. group-tab:: C++
2137
2138       .. doxygenclass:: simgrid::s4u::Comm
2139
2140    .. group-tab:: Python
2141    
2142       .. autoclass:: simgrid.Comm
2143
2144 Basic management
2145 ----------------
2146
2147 .. tabs::
2148
2149    .. group-tab:: C++
2150
2151       .. code-block:: C++
2152
2153          #include <simgrid/s4u/Comm.hpp>
2154
2155       .. doxygentypedef:: CommPtr
2156
2157    .. group-tab:: Python
2158
2159       .. code:: Python
2160
2161          from simgrid import Comm
2162
2163    .. group-tab:: c
2164
2165       .. code:: c
2166
2167          #include <simgrid/comm.h>
2168
2169       .. doxygentypedef:: sg_comm_t
2170
2171 Querying info
2172 -------------
2173
2174 .. tabs::
2175
2176    .. group-tab:: C++
2177
2178       .. doxygenfunction:: simgrid::s4u::Comm::get_dst_data_size() const
2179       .. doxygenfunction:: simgrid::s4u::Comm::get_mailbox() const
2180       .. doxygenfunction:: simgrid::s4u::Comm::get_sender() const
2181       .. doxygenfunction:: simgrid::s4u::Comm::set_dst_data(void **buff)
2182       .. doxygenfunction:: simgrid::s4u::Comm::set_dst_data(void **buff, size_t size)
2183       .. doxygenfunction:: simgrid::s4u::Comm::detach()
2184       .. doxygenfunction:: simgrid::s4u::Comm::detach(const std::function<void(void*)>& clean_function)
2185       .. doxygenfunction:: simgrid::s4u::Comm::set_payload_size(uint64_t bytes)
2186       .. doxygenfunction:: simgrid::s4u::Comm::set_rate(double rate)
2187       .. doxygenfunction:: simgrid::s4u::Comm::set_src_data(void *buff)
2188       .. doxygenfunction:: simgrid::s4u::Comm::set_src_data(void *buff, size_t size)
2189       .. doxygenfunction:: simgrid::s4u::Comm::set_src_data_size(size_t size)
2190
2191    .. group-tab:: Python
2192
2193       .. autoattribute:: simgrid.Comm.dst_data_size
2194       .. autoattribute:: simgrid.Comm.mailbox
2195       .. autoattribute:: simgrid.Comm.sender
2196       .. autoattribute:: simgrid.Comm.state_str
2197       .. automethod:: simgrid.Comm.detach
2198       .. automethod:: simgrid.Comm.set_payload_size
2199       .. automethod:: simgrid.Comm.set_rate
2200       .. automethod:: simgrid.Comm.detach
2201
2202 Life cycle
2203 ----------
2204
2205 Most communications are created using :ref:`s4u_mailbox`, but you can
2206 also start direct communications as shown below.
2207
2208 .. tabs::
2209
2210    .. group-tab:: C++
2211
2212       .. doxygenfunction:: simgrid::s4u::Comm::sendto
2213       .. doxygenfunction:: simgrid::s4u::Comm::sendto_init()
2214       .. doxygenfunction:: simgrid::s4u::Comm::sendto_init(Host *from, Host *to)
2215       .. doxygenfunction:: simgrid::s4u::Comm::sendto_async
2216
2217       .. doxygenfunction:: simgrid::s4u::Comm::cancel
2218       .. doxygenfunction:: simgrid::s4u::Comm::start
2219       .. doxygenfunction:: simgrid::s4u::Comm::test
2220       .. doxygenfunction:: simgrid::s4u::Comm::test_any(const std::vector< CommPtr >& comms)
2221       .. doxygenfunction:: simgrid::s4u::Comm::wait
2222       .. doxygenfunction:: simgrid::s4u::Comm::wait_all(const std::vector< CommPtr >& comms)
2223       .. doxygenfunction:: simgrid::s4u::Comm::wait_all_for(const std::vector< CommPtr >& comms, double timeout)
2224       .. doxygenfunction:: simgrid::s4u::Comm::wait_any(const std::vector< CommPtr >& comms)
2225       .. doxygenfunction:: simgrid::s4u::Comm::wait_any_for(const std::vector< CommPtr >& comms, double timeout)
2226       .. doxygenfunction:: simgrid::s4u::Comm::wait_for
2227       .. doxygenfunction:: simgrid::s4u::Comm::wait_until
2228
2229    .. group-tab:: Python
2230
2231       .. automethod:: simgrid.Comm.sendto
2232       .. automethod:: simgrid.Comm.sendto_init
2233       .. automethod:: simgrid.Comm.sendto_async
2234
2235       .. automethod:: simgrid.Comm.cancel
2236       .. automethod:: simgrid.Comm.start
2237       .. automethod:: simgrid.Comm.test
2238       .. automethod:: simgrid.Comm.test_any
2239       .. automethod:: simgrid.Comm.wait
2240       .. automethod:: simgrid.Comm.wait_for
2241       .. automethod:: simgrid.Comm.wait_all
2242       .. automethod:: simgrid.Comm.wait_all_for
2243       .. automethod:: simgrid.Comm.wait_any
2244       .. automethod:: simgrid.Comm.wait_any_for
2245       .. automethod:: simgrid.Comm.wait_until
2246
2247    .. group-tab:: C
2248
2249       .. doxygenfunction:: sg_comm_test
2250       .. doxygenfunction:: sg_comm_wait
2251       .. doxygenfunction:: sg_comm_wait_all
2252       .. doxygenfunction:: sg_comm_wait_any
2253
2254 Signals
2255 -------
2256
2257 .. tabs::
2258
2259    .. group-tab:: C++
2260
2261       .. doxygenfunction:: simgrid::s4u::Comm::on_start_cb
2262       .. doxygenfunction:: simgrid::s4u::Comm::on_completion_cb
2263       .. doxygenfunction:: simgrid::s4u::Comm::on_recv_cb
2264       .. doxygenfunction:: simgrid::s4u::Comm::on_send_cb
2265
2266 .. _API_s4u_Exec:
2267
2268 =============
2269 ⁣  class Exec
2270 =============
2271
2272 .. tabs::
2273
2274    .. group-tab:: C++
2275
2276       .. doxygenclass:: simgrid::s4u::Exec
2277
2278    .. group-tab:: Python
2279    
2280       .. autoclass:: simgrid.Exec
2281
2282 Basic management
2283 ----------------
2284
2285 .. tabs::
2286
2287    .. group-tab:: C++
2288
2289       .. code-block:: C++
2290
2291          #include <simgrid/s4u/Exec.hpp>
2292
2293       .. doxygentypedef:: ExecPtr
2294
2295    .. group-tab:: Python
2296
2297       .. code:: Python
2298
2299          from simgrid import Exec
2300
2301    .. group-tab:: C
2302
2303       .. code-block:: C
2304
2305          #include <simgrid/exec.h>
2306
2307       .. doxygentypedef:: sg_exec_t
2308       .. doxygentypedef:: const_sg_exec_t
2309
2310 Querying info
2311 -------------
2312
2313 .. tabs::
2314
2315    .. group-tab:: C++
2316
2317       .. doxygenfunction:: simgrid::s4u::Exec::get_cost() const
2318       .. doxygenfunction:: simgrid::s4u::Exec::get_finish_time() const
2319       .. doxygenfunction:: simgrid::s4u::Exec::get_host() const
2320       .. doxygenfunction:: simgrid::s4u::Exec::get_host_number() const
2321       .. doxygenfunction:: simgrid::s4u::Exec::get_remaining
2322       .. doxygenfunction:: simgrid::s4u::Exec::get_remaining_ratio
2323       .. doxygenfunction:: simgrid::s4u::Exec::get_start_time() const
2324       .. doxygenfunction:: simgrid::s4u::Exec::set_bound(double bound)
2325       .. doxygenfunction:: simgrid::s4u::Exec::set_host
2326       .. doxygenfunction:: simgrid::s4u::Exec::set_priority(double priority)
2327
2328    .. group-tab:: Python
2329
2330       .. autoattribute:: simgrid.Exec.host
2331       .. autoattribute:: simgrid.Exec.remaining
2332       .. autoattribute:: simgrid.Exec.remaining_ratio
2333
2334    .. group-tab:: C
2335
2336       .. doxygenfunction:: sg_exec_set_bound(sg_exec_t exec, double bound)
2337       .. doxygenfunction:: sg_exec_get_name(const_sg_exec_t exec)
2338       .. doxygenfunction:: sg_exec_set_name(sg_exec_t exec, const char* name)
2339       .. doxygenfunction:: sg_exec_set_host(sg_exec_t exec, sg_host_t new_host)
2340       .. doxygenfunction:: sg_exec_get_remaining(const_sg_exec_t exec)
2341       .. doxygenfunction:: sg_exec_get_remaining_ratio(const_sg_exec_t exec)
2342
2343 Life cycle
2344 ----------
2345
2346 .. tabs::
2347
2348    .. group-tab:: C++
2349
2350       .. doxygenfunction:: simgrid::s4u::Exec::cancel
2351       .. doxygenfunction:: simgrid::s4u::Exec::start
2352       .. doxygenfunction:: simgrid::s4u::Exec::test
2353       .. doxygenfunction:: simgrid::s4u::Exec::wait
2354       .. doxygenfunction:: simgrid::s4u::Exec::wait_any(const std::vector< ExecPtr >& execs)
2355       .. doxygenfunction:: simgrid::s4u::Exec::wait_any_for(const std::vector< ExecPtr >& execs, double timeout)
2356       .. doxygenfunction:: simgrid::s4u::Exec::wait_for
2357
2358    .. group-tab:: Python
2359
2360        .. automethod:: simgrid.Exec.cancel
2361        .. automethod:: simgrid.Exec.start
2362        .. automethod:: simgrid.Exec.test
2363        .. automethod:: simgrid.Exec.wait
2364
2365    .. group-tab:: C
2366
2367        .. doxygenfunction:: sg_exec_start(sg_exec_t exec)
2368        .. doxygenfunction:: sg_exec_cancel(sg_exec_t exec);
2369        .. doxygenfunction:: sg_exec_test(sg_exec_t exec);
2370        .. doxygenfunction:: sg_exec_wait(sg_exec_t exec);
2371        .. doxygenfunction:: sg_exec_wait_for(sg_exec_t exec, double timeout);
2372        .. doxygenfunction:: sg_exec_wait_any_for(sg_exec_t* execs, size_t count, double timeout);
2373        .. doxygenfunction:: sg_exec_wait_any(sg_exec_t* execs, size_t count);
2374
2375 Signals
2376 -------
2377
2378 .. tabs::
2379
2380    .. group-tab:: C++
2381
2382       .. doxygenfunction:: simgrid::s4u::Exec::on_start_cb
2383       .. doxygenfunction:: simgrid::s4u::Exec::on_completion_cb
2384
2385 .. _API_s4u_Io:
2386
2387 ===========
2388 ⁣  class Io
2389 ===========
2390
2391 .. tabs::
2392
2393    .. group-tab:: C++
2394
2395       .. doxygenclass:: simgrid::s4u::Io
2396
2397    .. group-tab:: Python
2398    
2399       .. autoclass:: simgrid.Io
2400
2401 Basic management
2402 ----------------
2403
2404 .. tabs::
2405
2406    .. group-tab:: C++
2407
2408       .. code-block:: C++
2409
2410          #include <simgrid/s4u/Io.hpp>
2411
2412       .. doxygentypedef:: IoPtr
2413
2414 Querying info
2415 -------------
2416
2417 .. tabs::
2418
2419    .. group-tab:: C++
2420
2421       .. doxygenfunction:: simgrid::s4u::Io::get_performed_ioops() const
2422       .. doxygenfunction:: simgrid::s4u::Io::get_remaining
2423
2424 Life cycle
2425 ----------
2426
2427 .. tabs::
2428
2429    .. group-tab:: C++
2430
2431       .. doxygenfunction:: simgrid::s4u::Io::cancel
2432       .. doxygenfunction:: simgrid::s4u::Io::start
2433       .. doxygenfunction:: simgrid::s4u::Io::test
2434       .. doxygenfunction:: simgrid::s4u::Io::wait
2435       .. doxygenfunction:: simgrid::s4u::Io::wait_for
2436       .. doxygenfunction:: simgrid::s4u::Io::wait_any(const std::vector<IoPtr> &ios)
2437       .. doxygenfunction:: simgrid::s4u::Io::wait_any_for(const std::vector<IoPtr> &ios, double timeout)
2438
2439    .. group-tab:: Python
2440
2441       .. automethod:: simgrid.Io.test
2442       .. automethod:: simgrid.Io.wait
2443       .. automethod:: simgrid.Io.wait_any_for
2444       .. automethod:: simgrid.Io.wait_any
2445
2446 Signals
2447 -------
2448
2449 .. tabs::
2450
2451    .. group-tab:: C++
2452
2453       .. doxygenfunction:: simgrid::s4u::Io::on_start_cb
2454       .. doxygenfunction:: simgrid::s4u::Io::on_completion_cb
2455
2456 .. _API_s4u_Synchronizations:
2457
2458 =======================
2459 Synchronization Objects
2460 =======================
2461
2462 .. _API_s4u_Mutex:
2463
2464 ==============
2465 ⁣  Mutex
2466 ==============
2467
2468 .. tabs::
2469
2470    .. group-tab:: C++
2471
2472       .. doxygenclass:: simgrid::s4u::Mutex
2473
2474    .. group-tab:: Python
2475
2476       .. autoclass:: simgrid.Mutex
2477
2478 Basic management
2479 ----------------
2480
2481    .. tabs::
2482
2483       .. group-tab:: C++
2484
2485          .. code-block:: C++
2486
2487             #include <simgrid/s4u/Mutex.hpp>
2488
2489          .. doxygentypedef:: MutexPtr
2490
2491          .. doxygenfunction:: simgrid::s4u::Mutex::create()
2492
2493       .. group-tab:: Python
2494
2495          .. code-block:: Python
2496
2497             from simgrid import Mutex
2498             mutex = Mutex()
2499
2500             # Use a context manager to acquire and automatically release the mutex
2501             # when leaving the scope.
2502             with mutex:
2503                 # Access shared resource ...
2504                 pass
2505
2506          .. automethod:: simgrid.Mutex.__init__
2507
2508       .. group-tab:: C
2509
2510          .. code-block:: C
2511
2512             #include <simgrid/mutex.h>
2513
2514          .. doxygentypedef:: sg_mutex_t
2515          .. cpp:type:: const s4u_Mutex* const_sg_mutex_t
2516
2517             Pointer to a constant mutex object.
2518
2519          .. doxygenfunction:: sg_mutex_init()
2520          .. doxygenfunction:: sg_mutex_destroy(const_sg_mutex_t mutex)
2521
2522 Locking
2523 -------
2524
2525    .. tabs::
2526
2527       .. group-tab:: C++
2528
2529          .. doxygenfunction:: simgrid::s4u::Mutex::lock()
2530          .. doxygenfunction:: simgrid::s4u::Mutex::try_lock()
2531          .. doxygenfunction:: simgrid::s4u::Mutex::unlock()
2532
2533       .. group-tab:: Python
2534
2535          .. automethod:: simgrid.Mutex.lock
2536          .. automethod:: simgrid.Mutex.try_lock
2537          .. automethod:: simgrid.Mutex.unlock
2538
2539       .. group-tab:: C
2540
2541          .. doxygenfunction:: sg_mutex_lock(sg_mutex_t mutex)
2542          .. doxygenfunction:: sg_mutex_try_lock(sg_mutex_t mutex)
2543          .. doxygenfunction:: sg_mutex_unlock(sg_mutex_t mutex)
2544
2545 .. _API_s4u_Barrier:
2546
2547 ================
2548 ⁣  Barrier
2549 ================
2550
2551 .. tabs::
2552
2553    .. group-tab:: C++
2554
2555       .. doxygenclass:: simgrid::s4u::Barrier
2556
2557    .. group-tab:: Python
2558
2559       .. autoclass:: simgrid.Barrier
2560
2561 .. tabs::
2562
2563    .. group-tab:: C++
2564
2565       .. code-block:: C++
2566
2567          #include <simgrid/s4u/Barrier.hpp>
2568
2569       .. doxygentypedef:: BarrierPtr
2570
2571       .. doxygenfunction:: simgrid::s4u::Barrier::create(unsigned int expected_actors)
2572       .. doxygenfunction:: simgrid::s4u::Barrier::wait()
2573
2574    .. group-tab:: Python
2575
2576       .. code-block:: Python
2577
2578          from simgrid import Barrier
2579          barrier = Barrier(2)
2580
2581       .. automethod:: simgrid.Barrier.__init__
2582       .. automethod:: simgrid.Barrier.wait
2583
2584    .. group-tab:: C
2585
2586       .. code-block:: C
2587
2588          #include <simgrid/barrier.hpp>
2589
2590       .. doxygentypedef:: sg_bar_t
2591
2592       .. doxygenfunction:: sg_barrier_init(unsigned int count)
2593       .. doxygenfunction:: sg_barrier_destroy(sg_bar_t bar)
2594       .. doxygenfunction:: sg_barrier_wait(sg_bar_t bar)
2595
2596
2597 .. _API_s4u_ConditionVariable:
2598
2599 ==========================
2600 ⁣  Condition variable
2601 ==========================
2602
2603 .. doxygenclass:: simgrid::s4u::ConditionVariable
2604
2605 Basic management
2606 ----------------
2607
2608    .. tabs::
2609
2610       .. group-tab:: C++
2611
2612          .. code-block:: C++
2613
2614             #include <simgrid/s4u/ConditionVariable.hpp>
2615
2616          .. doxygentypedef:: ConditionVariablePtr
2617
2618          .. doxygenfunction:: simgrid::s4u::ConditionVariable::create()
2619
2620       .. group-tab:: C
2621
2622          .. code-block:: C
2623
2624             #include <simgrid/cond.h>
2625
2626          .. doxygentypedef:: sg_cond_t
2627          .. doxygentypedef:: const_sg_cond_t
2628          .. doxygenfunction:: sg_cond_init
2629          .. doxygenfunction:: sg_cond_destroy
2630
2631 Waiting and notifying
2632 ---------------------
2633
2634    .. tabs::
2635
2636       .. group-tab:: C++
2637
2638          .. doxygenfunction:: simgrid::s4u::ConditionVariable::notify_all()
2639          .. doxygenfunction:: simgrid::s4u::ConditionVariable::notify_one()
2640          .. doxygenfunction:: simgrid::s4u::ConditionVariable::wait(s4u::MutexPtr lock)
2641          .. doxygenfunction:: simgrid::s4u::ConditionVariable::wait(const std::unique_lock< s4u::Mutex > &lock)
2642          .. doxygenfunction:: simgrid::s4u::ConditionVariable::wait(const std::unique_lock< Mutex > &lock, P pred)
2643          .. doxygenfunction:: simgrid::s4u::ConditionVariable::wait_for(const std::unique_lock< s4u::Mutex > &lock, double duration)
2644          .. doxygenfunction:: simgrid::s4u::ConditionVariable::wait_for(const std::unique_lock< s4u::Mutex > &lock, double duration, P pred)
2645          .. doxygenfunction:: simgrid::s4u::ConditionVariable::wait_for(const std::unique_lock< s4u::Mutex > &lock, std::chrono::duration< Rep, Period > duration)
2646          .. doxygenfunction:: simgrid::s4u::ConditionVariable::wait_for(const std::unique_lock< s4u::Mutex > &lock, std::chrono::duration< Rep, Period > duration, P pred)
2647          .. doxygenfunction:: simgrid::s4u::ConditionVariable::wait_until(const std::unique_lock< s4u::Mutex > &lock, const SimulationTimePoint< Duration > &timeout_time)
2648          .. doxygenfunction:: simgrid::s4u::ConditionVariable::wait_until(const std::unique_lock< s4u::Mutex > &lock, const SimulationTimePoint< Duration > &timeout_time, P pred)
2649          .. doxygenfunction:: simgrid::s4u::ConditionVariable::wait_until(const std::unique_lock< s4u::Mutex > &lock, double timeout_time)
2650          .. doxygenfunction:: simgrid::s4u::ConditionVariable::wait_until(const std::unique_lock< s4u::Mutex > &lock, double timeout_time, P pred)
2651
2652       .. group-tab:: C
2653
2654          .. doxygenfunction:: sg_cond_notify_all
2655          .. doxygenfunction:: sg_cond_notify_one
2656          .. doxygenfunction:: sg_cond_wait
2657          .. doxygenfunction:: sg_cond_wait_for
2658
2659 .. _API_s4u_Semaphore:
2660
2661 ==================
2662 ⁣  Semaphore
2663 ==================
2664
2665 .. tabs::
2666
2667    .. group-tab:: C++
2668
2669       .. doxygenclass:: simgrid::s4u::Semaphore
2670
2671    .. group-tab:: Python
2672
2673       .. autoclass:: simgrid.Semaphore
2674
2675 Basic management
2676 ----------------
2677
2678    .. tabs::
2679
2680       .. group-tab:: C++
2681
2682          .. code-block:: C++
2683
2684             #include <simgrid/s4u/Semaphore.hpp>
2685
2686          .. doxygentypedef:: SemaphorePtr
2687          .. doxygenfunction:: simgrid::s4u::Semaphore::create(unsigned int initial_capacity)
2688
2689       .. group-tab:: Python
2690
2691          .. code-block:: Python
2692
2693             from simgrid import Semaphore
2694             semaphore = Semaphore(1)
2695             # Automatically acquire the semaphore, and release it after leaving the scope.
2696             with semaphore:
2697                 # Do something with the shared resource
2698                 pass
2699
2700          .. automethod:: simgrid.Semaphore.__init__
2701
2702       .. group-tab:: C
2703
2704          .. code-block:: C
2705
2706             #include <simgrid/semaphore.h>
2707
2708          .. doxygentypedef:: sg_sem_t
2709          .. cpp:type:: const s4u_Semaphore* const_sg_sem_t
2710
2711             Pointer to a constant semaphore object.
2712
2713          .. doxygenfunction:: sg_sem_init(int initial_value)
2714          .. doxygenfunction:: sg_sem_destroy(const_sg_sem_t sem)
2715
2716 Locking
2717 -------
2718
2719    .. tabs::
2720
2721       .. group-tab:: C++
2722
2723          .. doxygenfunction:: simgrid::s4u::Semaphore::acquire()
2724          .. doxygenfunction:: simgrid::s4u::Semaphore::acquire_timeout(double timeout)
2725          .. doxygenfunction:: simgrid::s4u::Semaphore::get_capacity() const
2726          .. doxygenfunction:: simgrid::s4u::Semaphore::release()
2727          .. doxygenfunction:: simgrid::s4u::Semaphore::would_block() const
2728
2729       .. group-tab:: Python
2730
2731          .. automethod:: simgrid.Semaphore.acquire
2732          .. automethod:: simgrid.Semaphore.acquire_timeout
2733          .. autoattribute:: simgrid.Semaphore.capacity
2734          .. automethod:: simgrid.Semaphore.release
2735          .. autoattribute:: simgrid.Semaphore.would_block
2736
2737       .. group-tab:: C
2738
2739          .. doxygenfunction:: sg_sem_acquire(sg_sem_t sem)
2740          .. doxygenfunction:: sg_sem_acquire_timeout(sg_sem_t sem, double timeout)
2741          .. doxygenfunction:: sg_sem_get_capacity(const_sg_sem_t sem)
2742          .. doxygenfunction:: sg_sem_release(sg_sem_t sem)
2743          .. doxygenfunction:: sg_sem_would_block(const_sg_sem_t sem)
2744
2745 .. |hr| raw:: html
2746
2747    <hr />