xref: /aosp_15_r20/external/pigweed/pw_async2/docs.rst (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1*61c4878aSAndroid Build Coastguard Worker.. _module-pw_async2:
2*61c4878aSAndroid Build Coastguard Worker
3*61c4878aSAndroid Build Coastguard Worker=========
4*61c4878aSAndroid Build Coastguard Workerpw_async2
5*61c4878aSAndroid Build Coastguard Worker=========
6*61c4878aSAndroid Build Coastguard Worker.. pigweed-module::
7*61c4878aSAndroid Build Coastguard Worker   :name: pw_async2
8*61c4878aSAndroid Build Coastguard Worker
9*61c4878aSAndroid Build Coastguard Worker   - **Simple Ownership**: Say goodbye to that jumble of callbacks and shared
10*61c4878aSAndroid Build Coastguard Worker     state! Complex tasks with many concurrent elements can be expressed by
11*61c4878aSAndroid Build Coastguard Worker     simply combining smaller tasks.
12*61c4878aSAndroid Build Coastguard Worker   - **Efficient**: No dynamic memory allocation required.
13*61c4878aSAndroid Build Coastguard Worker   - **Pluggable**: Your existing event loop, work queue, or task scheduler
14*61c4878aSAndroid Build Coastguard Worker     can run the ``Dispatcher`` without any extra threads.
15*61c4878aSAndroid Build Coastguard Worker   - **Coroutine-capable**: C++20 coroutines work just like other tasks, and can
16*61c4878aSAndroid Build Coastguard Worker     easily plug into an existing ``pw_async2`` system.
17*61c4878aSAndroid Build Coastguard Worker
18*61c4878aSAndroid Build Coastguard Worker:cpp:class:`pw::async2::Task` is Pigweed's async primitive. ``Task`` objects
19*61c4878aSAndroid Build Coastguard Workerare cooperatively-scheduled "threads" which yield to the
20*61c4878aSAndroid Build Coastguard Worker:cpp:class:`pw::async2::Dispatcher` when waiting. When the ``Task`` is able to make
21*61c4878aSAndroid Build Coastguard Workerprogress, the ``Dispatcher`` will run it again. For example:
22*61c4878aSAndroid Build Coastguard Worker
23*61c4878aSAndroid Build Coastguard Worker.. tab-set::
24*61c4878aSAndroid Build Coastguard Worker
25*61c4878aSAndroid Build Coastguard Worker   .. tab-item:: Manual state machine
26*61c4878aSAndroid Build Coastguard Worker
27*61c4878aSAndroid Build Coastguard Worker      .. literalinclude:: examples/basic.cc
28*61c4878aSAndroid Build Coastguard Worker         :language: cpp
29*61c4878aSAndroid Build Coastguard Worker         :linenos:
30*61c4878aSAndroid Build Coastguard Worker         :start-after: [pw_async2-examples-basic-manual]
31*61c4878aSAndroid Build Coastguard Worker         :end-before: [pw_async2-examples-basic-manual]
32*61c4878aSAndroid Build Coastguard Worker
33*61c4878aSAndroid Build Coastguard Worker   .. tab-item:: Coroutine
34*61c4878aSAndroid Build Coastguard Worker
35*61c4878aSAndroid Build Coastguard Worker      .. literalinclude:: examples/basic.cc
36*61c4878aSAndroid Build Coastguard Worker         :language: cpp
37*61c4878aSAndroid Build Coastguard Worker         :linenos:
38*61c4878aSAndroid Build Coastguard Worker         :start-after: [pw_async2-examples-basic-coro]
39*61c4878aSAndroid Build Coastguard Worker         :end-before: [pw_async2-examples-basic-coro]
40*61c4878aSAndroid Build Coastguard Worker
41*61c4878aSAndroid Build Coastguard WorkerTasks can then be run on a :cpp:class:`pw::async2::Dispatcher` using the
42*61c4878aSAndroid Build Coastguard Worker:cpp:func:`pw::async2::Dispatcher::Post` method:
43*61c4878aSAndroid Build Coastguard Worker
44*61c4878aSAndroid Build Coastguard Worker.. literalinclude:: examples/basic.cc
45*61c4878aSAndroid Build Coastguard Worker   :language: cpp
46*61c4878aSAndroid Build Coastguard Worker   :linenos:
47*61c4878aSAndroid Build Coastguard Worker   :start-after: [pw_async2-examples-basic-dispatcher]
48*61c4878aSAndroid Build Coastguard Worker   :end-before: [pw_async2-examples-basic-dispatcher]
49*61c4878aSAndroid Build Coastguard Worker
50*61c4878aSAndroid Build Coastguard Worker.. grid:: 2
51*61c4878aSAndroid Build Coastguard Worker
52*61c4878aSAndroid Build Coastguard Worker   .. grid-item-card:: :octicon:`rocket` Quickstart & guides
53*61c4878aSAndroid Build Coastguard Worker      :link: module-pw_async2-quickstart-guides
54*61c4878aSAndroid Build Coastguard Worker      :link-type: ref
55*61c4878aSAndroid Build Coastguard Worker      :class-item: sales-pitch-cta-primary
56*61c4878aSAndroid Build Coastguard Worker
57*61c4878aSAndroid Build Coastguard Worker      How to:
58*61c4878aSAndroid Build Coastguard Worker
59*61c4878aSAndroid Build Coastguard Worker      * Use dispatchers to coordinate tasks
60*61c4878aSAndroid Build Coastguard Worker      * Pass data between tasks
61*61c4878aSAndroid Build Coastguard Worker      * Use coroutines
62*61c4878aSAndroid Build Coastguard Worker
63*61c4878aSAndroid Build Coastguard Worker      And more.
64*61c4878aSAndroid Build Coastguard Worker
65*61c4878aSAndroid Build Coastguard Worker   .. grid-item-card:: :octicon:`code-square` Reference
66*61c4878aSAndroid Build Coastguard Worker      :link: module-pw_async2-reference
67*61c4878aSAndroid Build Coastguard Worker      :link-type: ref
68*61c4878aSAndroid Build Coastguard Worker      :class-item: sales-pitch-cta-secondary
69*61c4878aSAndroid Build Coastguard Worker
70*61c4878aSAndroid Build Coastguard Worker      API reference for:
71*61c4878aSAndroid Build Coastguard Worker
72*61c4878aSAndroid Build Coastguard Worker      * ``Task``
73*61c4878aSAndroid Build Coastguard Worker      * ``Dispatcher``
74*61c4878aSAndroid Build Coastguard Worker      * ``CoRo``
75*61c4878aSAndroid Build Coastguard Worker
76*61c4878aSAndroid Build Coastguard Worker      And more.
77*61c4878aSAndroid Build Coastguard Worker
78*61c4878aSAndroid Build Coastguard Worker.. grid:: 2
79*61c4878aSAndroid Build Coastguard Worker
80*61c4878aSAndroid Build Coastguard Worker   .. grid-item-card:: :octicon:`code-square` Backends
81*61c4878aSAndroid Build Coastguard Worker      :link: module-pw_async2-backends
82*61c4878aSAndroid Build Coastguard Worker      :link-type: ref
83*61c4878aSAndroid Build Coastguard Worker      :class-item: sales-pitch-cta-secondary
84*61c4878aSAndroid Build Coastguard Worker
85*61c4878aSAndroid Build Coastguard Worker      You can fulfill the ``pw_async2`` interface with a Pigweed-provided
86*61c4878aSAndroid Build Coastguard Worker      backend or roll your own.
87*61c4878aSAndroid Build Coastguard Worker
88*61c4878aSAndroid Build Coastguard Worker   .. grid-item-card:: :octicon:`pencil` Pigweed blog: C++20 coroutines
89*61c4878aSAndroid Build Coastguard Worker      :link: docs-blog-05-coroutines
90*61c4878aSAndroid Build Coastguard Worker      :link-type: ref
91*61c4878aSAndroid Build Coastguard Worker      :class-item: sales-pitch-cta-secondary
92*61c4878aSAndroid Build Coastguard Worker
93*61c4878aSAndroid Build Coastguard Worker      A blog post on how Pigweed implements coroutines without heap
94*61c4878aSAndroid Build Coastguard Worker      allocation, and challenges encountered along the way.
95*61c4878aSAndroid Build Coastguard Worker
96*61c4878aSAndroid Build Coastguard Worker.. toctree::
97*61c4878aSAndroid Build Coastguard Worker   :hidden:
98*61c4878aSAndroid Build Coastguard Worker   :maxdepth: 1
99*61c4878aSAndroid Build Coastguard Worker
100*61c4878aSAndroid Build Coastguard Worker   guides
101*61c4878aSAndroid Build Coastguard Worker   reference
102*61c4878aSAndroid Build Coastguard Worker   Backends <backends>
103