xref: /aosp_15_r20/external/pigweed/pw_console/internals.rst (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1*61c4878aSAndroid Build Coastguard Worker.. _module-pw_console-internals:
2*61c4878aSAndroid Build Coastguard Worker
3*61c4878aSAndroid Build Coastguard WorkerInternal Design
4*61c4878aSAndroid Build Coastguard Worker===============
5*61c4878aSAndroid Build Coastguard Worker.. pigweed-module-subpage::
6*61c4878aSAndroid Build Coastguard Worker   :name: pw_console
7*61c4878aSAndroid Build Coastguard Worker
8*61c4878aSAndroid Build Coastguard WorkerThreads and Event Loops
9*61c4878aSAndroid Build Coastguard Worker-----------------------
10*61c4878aSAndroid Build Coastguard Worker
11*61c4878aSAndroid Build Coastguard WorkerIn `ptpython`_ and `IPython`_ all user repl code is run in the foreground. This
12*61c4878aSAndroid Build Coastguard Workerallows interrupts like ``Ctrl-C`` and functions like ``print()`` and
13*61c4878aSAndroid Build Coastguard Worker``time.sleep()`` to work as expected. Pigweed's Console doesn't use this
14*61c4878aSAndroid Build Coastguard Workerapproach as it would hide or freeze the `prompt_toolkit`_ user interface while
15*61c4878aSAndroid Build Coastguard Workerrunning repl code.
16*61c4878aSAndroid Build Coastguard Worker
17*61c4878aSAndroid Build Coastguard WorkerTo get around this issue all user repl code is run in a dedicated thread with
18*61c4878aSAndroid Build Coastguard Workerstdout and stderr patched to capture output. This lets the user interface stay
19*61c4878aSAndroid Build Coastguard Workerresponsive and new log messages to continue to be displayed.
20*61c4878aSAndroid Build Coastguard Worker
21*61c4878aSAndroid Build Coastguard WorkerHere's a diagram showing how ``pw_console`` threads and `asyncio`_ tasks are
22*61c4878aSAndroid Build Coastguard Workerorganized.
23*61c4878aSAndroid Build Coastguard Worker
24*61c4878aSAndroid Build Coastguard Worker.. mermaid::
25*61c4878aSAndroid Build Coastguard Worker
26*61c4878aSAndroid Build Coastguard Worker   flowchart LR
27*61c4878aSAndroid Build Coastguard Worker       classDef eventLoop fill:#e3f2fd,stroke:#90caf9,stroke-width:1px;
28*61c4878aSAndroid Build Coastguard Worker       classDef thread fill:#fffde7,stroke:#ffeb3b,stroke-width:1px;
29*61c4878aSAndroid Build Coastguard Worker       classDef plugin fill:#fce4ec,stroke:#f06292,stroke-width:1px;
30*61c4878aSAndroid Build Coastguard Worker       classDef builtinFeature fill:#e0f2f1,stroke:#4db6ac,stroke-width:1px;
31*61c4878aSAndroid Build Coastguard Worker
32*61c4878aSAndroid Build Coastguard Worker       %% Subgraphs are drawn in reverse order.
33*61c4878aSAndroid Build Coastguard Worker
34*61c4878aSAndroid Build Coastguard Worker       subgraph pluginThread [Plugin Thread 1]
35*61c4878aSAndroid Build Coastguard Worker           subgraph pluginLoop [Plugin Event Loop 1]
36*61c4878aSAndroid Build Coastguard Worker               toolbarFunc-->|"Refresh<br/>UI Tokens"| toolbarFunc
37*61c4878aSAndroid Build Coastguard Worker               toolbarFunc[Toolbar Update Function]
38*61c4878aSAndroid Build Coastguard Worker           end
39*61c4878aSAndroid Build Coastguard Worker           class pluginLoop eventLoop;
40*61c4878aSAndroid Build Coastguard Worker       end
41*61c4878aSAndroid Build Coastguard Worker       class pluginThread thread;
42*61c4878aSAndroid Build Coastguard Worker
43*61c4878aSAndroid Build Coastguard Worker       subgraph pluginThread2 [Plugin Thread 2]
44*61c4878aSAndroid Build Coastguard Worker           subgraph pluginLoop2 [Plugin Event Loop 2]
45*61c4878aSAndroid Build Coastguard Worker               paneFunc-->|"Refresh<br/>UI Tokens"| paneFunc
46*61c4878aSAndroid Build Coastguard Worker               paneFunc[Pane Update Function]
47*61c4878aSAndroid Build Coastguard Worker           end
48*61c4878aSAndroid Build Coastguard Worker           class pluginLoop2 eventLoop;
49*61c4878aSAndroid Build Coastguard Worker       end
50*61c4878aSAndroid Build Coastguard Worker       class pluginThread2 thread;
51*61c4878aSAndroid Build Coastguard Worker
52*61c4878aSAndroid Build Coastguard Worker       subgraph replThread [Repl Thread]
53*61c4878aSAndroid Build Coastguard Worker           subgraph replLoop [Repl Event Loop]
54*61c4878aSAndroid Build Coastguard Worker               Task1 -->|Finished| Task2 -->|Cancel with Ctrl-C| Task3
55*61c4878aSAndroid Build Coastguard Worker           end
56*61c4878aSAndroid Build Coastguard Worker           class replLoop eventLoop;
57*61c4878aSAndroid Build Coastguard Worker       end
58*61c4878aSAndroid Build Coastguard Worker       class replThread thread;
59*61c4878aSAndroid Build Coastguard Worker
60*61c4878aSAndroid Build Coastguard Worker       subgraph main [Main Thread]
61*61c4878aSAndroid Build Coastguard Worker           subgraph mainLoop [User Interface Event Loop]
62*61c4878aSAndroid Build Coastguard Worker               log[[Log Pane]]
63*61c4878aSAndroid Build Coastguard Worker               repl[[Python Repl]]
64*61c4878aSAndroid Build Coastguard Worker               pluginToolbar([User Toolbar Plugin])
65*61c4878aSAndroid Build Coastguard Worker               pluginPane([User Pane Plugin])
66*61c4878aSAndroid Build Coastguard Worker               class log,repl builtinFeature;
67*61c4878aSAndroid Build Coastguard Worker               class pluginToolbar,pluginPane plugin;
68*61c4878aSAndroid Build Coastguard Worker           end
69*61c4878aSAndroid Build Coastguard Worker           class mainLoop eventLoop;
70*61c4878aSAndroid Build Coastguard Worker       end
71*61c4878aSAndroid Build Coastguard Worker       class main thread;
72*61c4878aSAndroid Build Coastguard Worker
73*61c4878aSAndroid Build Coastguard Worker       repl-.->|Run Code| replThread
74*61c4878aSAndroid Build Coastguard Worker       pluginToolbar-.->|Register Plugin| pluginThread
75*61c4878aSAndroid Build Coastguard Worker       pluginPane-.->|Register Plugin| pluginThread2
76*61c4878aSAndroid Build Coastguard Worker
77*61c4878aSAndroid Build Coastguard Worker.. _IPython: https://ipython.readthedocs.io/
78*61c4878aSAndroid Build Coastguard Worker.. _prompt_toolkit: https://python-prompt-toolkit.readthedocs.io/
79*61c4878aSAndroid Build Coastguard Worker.. _asyncio: https://docs.python.org/3/library/asyncio.html
80*61c4878aSAndroid Build Coastguard Worker.. _ptpython: https://github.com/prompt-toolkit/ptpython/
81