-
Notifications
You must be signed in to change notification settings - Fork 2
/
index.html
357 lines (351 loc) · 23.8 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Process-in-Process: Process-in-Process</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="PiP-doxygen.jpeg"/></td>
<td id="projectalign">
<div id="projectname">Process-in-Process<span id="projectnumber"> 2.4.1</span>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */
$(document).ready(function(){initNavTree('index.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div><div class="header">
<div class="headertitle"><div class="title">Process-in-Process </div></div>
</div><!--header-->
<div class="contents">
<div class="textblock"><h1><a class="anchor" id="autotoc_md0"></a>
Process-in-Process (PiP)</h1>
<p >PiP is a user-level library to have the best of the both worlds of multi-process and multi-thread parallel execution models. PiP allows a process to create sub-processes into the same virtual address space where the parent process runs. The parent process and sub-processes share the same address space, however, each process has its own variable set. So, each process runs independently from the other process. If some or all processes agree, then data owned by a process can be accessed by the other processes. Those processes share the same address space, just like pthreads, but each process has its own variables like the process execution model. Hereinafter, the parent process is called PiP process and sub-processes are called PiP tasks.</p>
<h2><a class="anchor" id="autotoc_md1"></a>
PiP Versions</h2>
<p >Currently there are three PiP library versions:</p>
<ul>
<li>Version 1 - Deprecated</li>
<li>Version 2 - Stable version</li>
<li>Version 3 - Stable version supporting BLT and ULP (experimental)</li>
</ul>
<p >Unfortunately each version has unique ABI and there is no ABI compatibility among them. The functionality of PiP-v1 is almost the same with PiP-v2, however, PiP-v2's API is a subset of the PiP-v3's API. Hereafter <b>NN</b> denotes the PiP version number.</p>
<h2><a class="anchor" id="autotoc_md2"></a>
Bi-Level Thread (BLT, from v3)</h2>
<p >PiP also provides new thread implementation named "Bi-Level Thread
(BLT)", again, to take the best of two worlds, Kernel-Level Thread (KLT) and User-Level Thread (ULT) here. A BLT is a PiP task. When a PiP task is created it runs as a KLT. At any point the KLT can become a ULT by decoupling the associated kernel thread from the KLT. The decoupled kernel thread becomes idle. Later, the ULT can become KLT again by coupling with the kernel thread.</p>
<h2><a class="anchor" id="autotoc_md3"></a>
User-Level Process (ULP, from v3)</h2>
<p >As described, PiP allows PiP tasks to share the same virtual address space. This mans that a PiP task can context-switch to the other PiP task at user-level. This is called User-Level Process where processes may be derived from the same program or different programs. Threads basically share most of the kernel resources, such as address space, file descriptors, a process id, and so on whilst processes do not. Every process has its own file descriptor space, for example. When a ULP is scheduled by a KLT having PID 1000, then the getpid() is called by the ULP returns 1000. Further, when the ULT is migrated to be scheduled by the other KLT, then the returned PID is different. So, when implementing a ULP system, this systemcall consistency must be preserved. In ULP on PiP, the consistency can be maintained by utilizing the above BLT mechanism. When a ULT tries to call a system call, it is coupled with its kernel thread which was created at the beginning as a KLT. It should be note that Thread Local Storage (TLS) regions are also switched when switching ULP (and BLT) contexts.</p>
<h2><a class="anchor" id="autotoc_md4"></a>
Execution Mode</h2>
<p >There are several PiP implementation modes which can be selected at the runtime. These implementations can be categorized into two;</p>
<ul>
<li>Process and</li>
<li>(P)Thread.</li>
</ul>
<p >In the pthread mode, although each PiP task has its own static variables unlike thread, PiP task behaves more like PThread, having a TID, having the same file descriptor space, having the same signal delivery semantics as Pthread does, and so on. In the process mode, a PiP task behaves more like a process, having a PID, having an independent file descriptor space, having the same signal delivery semantics as Linux process does, and so on. The above mentioned ULP can only work with the process mode.</p>
<p >When the <b>PIP_MODE</b> environment variable set to "thread" then the PiP library runs in the pthread mode, and if it is set to "process" then it runs in the process mode.</p>
<p >Several function are made available by the PiP library to absorb the functional differences due to the execution modes.</p>
<h1><a class="anchor" id="autotoc_md5"></a>
License</h1>
<p >This package is licensed under the 2-clause simplified BSD License - see the [LICENSE](LICENSE) file for details.</p>
<h1><a class="anchor" id="autotoc_md6"></a>
Installation</h1>
<p >Basically PiP requires the following three software packages;</p>
<ul>
<li><a href="https://github.com/procinproc/PiP">PiP</a> - Process in Process (this package)</li>
<li><a href="https://github.com/procinproc/PiP-Testsuite">PiP-Testsuite</a> - Testsuite for PiP</li>
<li><a href="https://github.com/procinproc/PiP-glibc">PiP-glibc</a> - patched GNU libc for PiP</li>
<li><a href="https://github.com/procinproc/PiP-gdb">PiP-gdb</a> - patched gdb to debug PiP root and PiP tasks.</li>
</ul>
<p >By using PiP-glibc, users can create up to 300 PiP tasks which can be debugged by using PiP-gdb. In other words, without installing PiP-glibc, users can create up to around 10 PiP tasks (the number depends on the program) and cannot debug by using PiP-gdb.</p>
<p >There are several ways to install the PiP packages; Docker, Spack, and building from the source code. It is strongly recommended to use the following PiP package installation program (pip-pip):</p>
<ul>
<li><a href="https://github.com/procinproc/PiP-pip">PiP-pip</a> - PiP package installing program</li>
</ul>
<p >This is the easiest way to install PiP packages in any form. Here is the example of <code>pip-pip</code> usage: </p><pre class="fragment">$ git clone https://github.com/procinproc/PiP-pip.git
$ cd PiP-pip
$ ./pip-pip --how=HOW --pip=PIP_VERSION --work=BUILD_DIR --prefix=INSTALL_DIR
</pre><p> <b>HOW</b> can be one of <code>docker</code>, <code>spack</code> and <code>github</code>, or any combination of them. <code>pip-pip --help</code> will show you how to use the program. The <code>docker</code> and <code>spack</code> installations include all three packages; PiP, PiP-glibc and PiP-gdb.</p>
<h1><a class="anchor" id="autotoc_md7"></a>
PiP Documents</h1>
<p >The following PiP documents are created by using <a href="https://www.doxygen.nl/">Doxygen</a>.</p>
<h2><a class="anchor" id="autotoc_md8"></a>
Man pages</h2>
<p >Man pages will be installed at <b>PIP_INSTALL_DIR</b>/share/man. </p><pre class="fragment">$ man -M PIP_INSTALL_DIR/share/man 7 libpip
</pre><p> Or, use the pip-man command (from v2). </p><pre class="fragment">$ PIP_INSTALL_DIR/bin/pip-man 7 libpip
</pre><p> The above two examples will show you the same document you are reading.</p>
<h2><a class="anchor" id="autotoc_md9"></a>
PDF</h2>
<p ><a href="doc/latex-inuse/libpip-manpages.pdf">PDF documents</a> will be installed at <b>PIP_INSTALL_DIR</b>/share/doc/PiP/libpip-manpages.pdf.</p>
<h2><a class="anchor" id="autotoc_md10"></a>
HTML</h2>
<p ><a href="doc/html/index.html">HTML documents</a> will be installed at <b>PIP_INSTALL_DIR</b>/share/doc/PiP/index.html.</p>
<h1><a class="anchor" id="autotoc_md11"></a>
Getting Started</h1>
<h2><a class="anchor" id="autotoc_md12"></a>
Compile and link your PiP programs</h2>
<ul>
<li>pipcc(1) command (since v2)</li>
</ul>
<p >You can use pipcc(1) command to compile and link your PiP programs. </p><pre class="fragment">$ pipcc -Wall -O2 -g -c pip-prog.c
$ pipcc -Wall -O2 -g pip-prog.c -o pip-prog
</pre> <h2><a class="anchor" id="autotoc_md13"></a>
Run your PiP programs</h2>
<ul>
<li>pip-exec(1) command (piprun(1) in PiP v1)</li>
</ul>
<p >Let's assume that you have a non-PiP program(s) and want to run as PiP tasks. All you have to do is to compile your program by using the above pipcc(1) command and to use the pip-exec(1) command to run your program as PiP tasks. </p><pre class="fragment">$ pipcc myprog.c -o myprog
$ pip-exec -n 8 ./myprog
$ ./myprog
</pre><p> In this case, the pip-exec(1) command becomes the PiP root and your program runs as 8 PiP tasks. Note that the 'myprog.c' may or may not call any PiP functions. Your program can also run as a normal program (not as a PiP task) without using the pip-exec(1) command. In either case, your programs must be compiled and linked by using the pipcc(1) command described above.</p>
<p >You may write your own PiP programs which includes the PiP root programming. In this case, your program can run without using the pip-exec(1) command.</p>
<p >If you get the following message when you try to run your program; </p><pre class="fragment">PiP-ERR(19673) './myprog' is not PIE
</pre><p> Then this means that the 'myprog' (having PID 19673) is not compiled by using the pipcc(1) command properly. You may check if your program(s) can run as a PiP root and/or PiP task by using the pip-check(1) command (from v2); </p><pre class="fragment">$ pip-check a.out
a.out : Root&Task
</pre><p> Above example shows that the 'a.out' program can run as a PiP root and PiP tasks.</p>
<ul>
<li><p class="startli">pips(1) command (from v2)</p>
<p class="startli">Similar to the Linux <code>ps</code> command, you can see how your PiP program(s) is (are) running by using the <code>pips(1)</code> command. <code>pips</code> can accept 'a', 'u' and 'x' options just like the <code>ps</code> command.</p>
<p class="startli">$ pips [a][u][x] [PIPS-OPTIONS] [-] [PATTERN ..]</p>
<p class="startli">List the PiP tasks via the 'ps' command;</p>
<p class="startli">$ pips –ps [ PATTERN .. ]</p>
<p class="startli">or, show the activities of PiP tasks via the 'top' command;</p>
<p class="startli">$ pips –top [ PATTERN .. ]</p>
<p class="startli">Additionally you can kill all of your PiP tasks by using the same pips(1) command;</p>
<p class="startli">$ pips -s KILL [ PATTERN .. ]</p>
</li>
</ul>
<h2><a class="anchor" id="autotoc_md14"></a>
Debugging your PiP programs by the pip-gdb command</h2>
<p >The following procedure is to attach all PiP tasks and PiP root which created those tasks. Each PiP task is treated as a GDB inferior in PiP-gdb. Note that PiP-glibc and PiP-gdb packages are required to do this. Note that all features in this section are only supported by PiP v2 or higher, only with the process execution mode (thread mode and ULP/BLT in PiP v3 are NOT supported). </p><pre class="fragment">$ pip-gdb
(pip-gdb) attach PID
</pre><p> The attached inferiors can be seen by the following GDB command: </p><pre class="fragment">(pip-gdb) info inferiors
Num Description Executable
4 process 6453 (pip 2) /somewhere/pip-task-2
3 process 6452 (pip 1) /somewhere/pip-task-1
2 process 6451 (pip 0) /somewhere/pip-task-0
* 1 process 6450 (pip root) /somewhere/pip-root
</pre><p> You can select and debug an inferior by the following GDB command: </p><pre class="fragment">(pip-gdb) inferior 2
[Switching to inferior 2 [process 6451 (pip 0)] (/somewhere/pip-task-0)]
</pre><p> When an already-attached program calls '<a class="el" href="group__pip__spawn.html#gae9187ea22ecf0623fa3ecfba5337f52d">pip_spawn()</a>' and becomes a PiP root task, the newly created PiP child tasks aren't attached automatically, but you can add empty inferiors and then attach the PiP child tasks to the inferiors. e.g. </p><pre class="fragment">.... type Control-Z to stop the root task.
^Z
Program received signal SIGTSTP, Stopped (user).
(pip-gdb) add-inferior
Added inferior 2
(pip-gdb) inferior 2
(pip-gdb) attach 1902
(pip-gdb) add-inferior
Added inferior 3
(pip-gdb) inferior 3
(pip-gdb) attach 1903
(pip-gdb) add-inferior
Added inferior 4
(pip-gdb) inferior 4
(pip-gdb) attach 1904
(pip-gdb) info inferiors
Num Description Executable
* 4 process 1904 (pip 2) /somewhere/pip-task-2
3 process 1903 (pip 1) /somewhere/pip-task-1
2 process 1902 (pip 0) /somewhere/pip-task-0
1 process 1897 (pip root) /somewhere/pip-root
</pre><p> You can attach all relevant PiP tasks by: </p><pre class="fragment">$ pip-gdb -p PID-of-your-PiP-program
</pre><p> (from v2)</p>
<p >If the <b>PIP_GDB_PATH</b> environment is set to the path pointing to PiP-gdb executable file, then PiP-gdb is automatically attached when an exception signal (SIGSEGV or SIGHUP by default) is delivered. The exception signals can also be defined by setting the <b>PIP_GDB_SIGNALS</b> environment. Signal names (case insensitive) can be concatenated by the '+' or '-' symbol. 'all' is reserved to specify most of the signals. For example, 'ALL-TERM' means all signals excepting SIGTERM, another example, 'PIPE+INT' means SIGPIPE and SIGINT. If one of the specified or default signals is delivered, then PiP-gdb will be attached automatically. The PiP-gdb will show backtrace by default. If users specify <b>PIP_GDB_COMMAND</b>, a filename containing some GDB commands, then those GDB commands will be executed by PiP-gdb in batch mode.</p>
<p >If the <b>PIP_STOP_ON_START</b> environment is set, then the PiP library delivers SIGSTOP to a spawned PiP task which is about to start user program. If its value is a number in decimal, then the PiP task whose PiP-ID is the same with the specified number will be stopped. If the number is minus, then all PiP tasks will be stopped at the very beginning. Do not forget to compile your programs with a debug option.</p>
<h1><a class="anchor" id="autotoc_md15"></a>
Mailing Lists</h1>
<p >If you have any questions or comments on PiP, send e-mails to; </p><pre class="fragment">[email protected]
</pre><p> Or, join our PiP users' mailing list; </p><pre class="fragment">[email protected]
</pre> <h1><a class="anchor" id="autotoc_md16"></a>
Publications</h1>
<h2><a class="anchor" id="autotoc_md17"></a>
Research papers</h2>
<p >Atsushi Hori, Min Si, Balazs Gerofi, Masamichi Takagi, Jay Dayal, Pavan Balaji, and Yutaka Ishikawa. "Process-in-process: techniques for
practical address-space sharing," In Proceedings of the 27th International Symposium on High-Performance Parallel and Distributed Computing (HPDC '18). ACM, New York, NY, USA, 131-143. DOI: <a href="https://doi.org/10.1145/3208040.3208045">https://doi.org/10.1145/3208040.3208045</a></p>
<p >Atsushi Hori, Balazs Gerofi, and Yuataka Ishikawa. "An Implementation
of User-Level Processes using Address Space Sharing," 2020 IEEE International Parallel and Distributed Processing Symposium Workshops (IPDPSW), New Orleans, LA, USA, 2020, pp. 976-984, DOI: <a href="https://doi.org/10.1109/IPDPSW50202.2020.00161">https://doi.org/10.1109/IPDPSW50202.2020.00161</a>.</p>
<p >Kaiming Ouyang, Min Si, Atsushi Hori, Zizhong Chen, and Pavan Balaji. 2020. "CAB-MPI: exploring interprocess work-stealing towards
balanced MPI communication," In Proceedings of the International Conference for High Performance Computing, Networking, Storage and Analysis (SC '20). IEEE Press, Article 36.</p>
<p >Kaiming Ouyang, Min Si, Atsushi Hori, Zizhong Chen, Pavan Balaji. 2021. "Daps: A dynamic asynchronous progress stealing model for mpi communication," In Proceedings of 2021 IEEE International Conference on Cluster Computing (CLUSTER).</p>
<p >Atsushi Hori, Kaiming Ouyang, Balazs Georfi, Yutaka Ishikawa. 2021. "On the
Difference between Shared Memory and Shared Address Space in HPC Communication," In Proceedings of Supercomputing Asia 2022, Springer LNCS 13214 2022.</p>
<h1><a class="anchor" id="autotoc_md18"></a>
Commands</h1>
<dl class="section see"><dt>See also</dt><dd>pip-check </dd>
<dd>
pip-exec </dd>
<dd>
pip-man </dd>
<dd>
pip-mode </dd>
<dd>
pip-tgkill </dd>
<dd>
<a class="el" href="group__pipcc.html" title="C compile driver for PiP.">pipcc</a> </dd>
<dd>
<a class="el" href="group__pipfc.html" title="Fortran compile driver for PiP.">pipfc</a> </dd>
<dd>
<a class="el" href="group__pips.html" title="list or kill running PiP tasks">pips</a> </dd>
<dd>
<a class="el" href="group__printpipmode.html" title="print current PiP mode">printpipmode</a></dd></dl>
<h1><a class="anchor" id="autotoc_md19"></a>
Functions</h1>
<dl class="section see"><dt>See also</dt><dd><a class="el" href="group__pip__abort.html#ga49a4a9ee014ffdaf0c26df18adf965ad">pip_abort</a> </dd>
<dd>
<a class="el" href="group__pip__barrier__fin.html#ga70dab15271b84fe05d7088a6cf8bf784">pip_barrier_fin</a> </dd>
<dd>
<a class="el" href="group__pip__barrier__init.html#ga84022f9c64f431e7d513342aeed0b61e">pip_barrier_init</a> </dd>
<dd>
<a class="el" href="group__pip__barrier__wait.html#gaca103c9732a8e28ee8faf79ef4a69e4f">pip_barrier_wait</a> </dd>
<dd>
<a class="el" href="group__pip__exit.html#ga55171ea8db2c2693f005560e427485c2">pip_exit</a> </dd>
<dd>
<a class="el" href="group__pip__export.html#ga76ef9337bec7dd836168f22247d4c64c">pip_export</a> </dd>
<dd>
<a class="el" href="group__pip__fin.html#gac4654282785abb9434ce81573fdf16ed">pip_fin</a> </dd>
<dd>
<a class="el" href="group__pip__get__aux.html#ga779abad7e346657a6fd3c024e204addb">pip_get_aux</a> </dd>
<dd>
<a class="el" href="group__pip__get__mode.html#gab603f68c1ce972a5f3bfb8c95fcfb555">pip_get_mode</a> </dd>
<dd>
<a class="el" href="group__pip__get__mode__str.html#ga83533dc6e4bb48b9355ec7eb3933d6cf">pip_get_mode_str</a> </dd>
<dd>
<a class="el" href="group__pip__get__ntasks.html#ga9786d5aafa2a3882714c35ecc9f39a5a">pip_get_ntasks</a> </dd>
<dd>
<a class="el" href="group__pip__get__pipid.html#ga4e715bb8c325e9acc81af0745908dc0e">pip_get_pipid</a> </dd>
<dd>
<a class="el" href="group__pip__get__system__id.html#gadf3d9e96b46d7a58bf4ce6dda173091a">pip_get_system_id</a> </dd>
<dd>
<a class="el" href="group__pip__gettime.html#ga0dd8b92cd199ecfb693f9563f443c90b">pip_gettime</a> </dd>
<dd>
<a class="el" href="group__pip__import.html#ga6d7ac596a9da824e40d7c06528f42e5f">pip_import</a> </dd>
<dd>
<a class="el" href="group__pip__init.html#gadf72c68d9ac794ab6153bfc7bf6b8490">pip_init</a> </dd>
<dd>
<a class="el" href="group__pip__is__initialized.html#gabbec4ae2f820b13400f63cba55a53399">pip_is_initialized</a> </dd>
<dd>
<a class="el" href="group__pip__is__shared__fd.html#ga180ece8f3f537d84db8e70921f3ae099">pip_is_shared_fd</a> </dd>
<dd>
<a class="el" href="group__pip__is__threaded.html#ga0455093d5040ae45585cc88a5f3f002b">pip_is_threaded</a> </dd>
<dd>
<a class="el" href="group__pip__isa__root.html#ga6f1045bdbf682cb2ac504f09b57b73e9">pip_isa_root</a> </dd>
<dd>
<a class="el" href="group__pip__isa__task.html#gaf0283e47ad2d415206d6a3fa61e8a0a9">pip_isa_task</a> </dd>
<dd>
<a class="el" href="group__pip__kill.html#ga4a396f38920d94b71dcfd3c898fbb82b">pip_kill</a> </dd>
<dd>
<a class="el" href="group__pip__kill__all__child__tasks.html#ga68c0222ca0af650990ad0ed7db8a8a55">pip_kill_all_child_tasks</a> </dd>
<dd>
<a class="el" href="group__pip__named__export.html#ga3613eaa34ad5a4985007ff9177eb6542">pip_named_export</a> </dd>
<dd>
<a class="el" href="group__pip__named__import.html#ga16cbf39b7e29a7453ee836847e06aa16">pip_named_import</a> </dd>
<dd>
<a class="el" href="group__pip__named__tryimport.html#ga3cf67ef6b8cb058400ee1ea91d4436bd">pip_named_tryimport</a> </dd>
<dd>
<a class="el" href="group__pip__set__aux.html#gabe36293dba51fe90f94057bb4f82f328">pip_set_aux</a> </dd>
<dd>
<a class="el" href="group__pip__sigmask.html#gaf546ee24368b118e937aadd2dbea2217">pip_sigmask</a> </dd>
<dd>
<a class="el" href="group__pip__signal__wait.html#ga2048e7685a030e61e8c529c474899feb">pip_signal_wait</a> </dd>
<dd>
<a class="el" href="group__pip__spawn.html#gae9187ea22ecf0623fa3ecfba5337f52d">pip_spawn</a> </dd>
<dd>
<a class="el" href="group__pip__spawn__from__func.html#ga67a1111a705fc7c9fd9e80a6129bad04">pip_spawn_from_func</a> </dd>
<dd>
<a class="el" href="group__pip__spawn__from__main.html#gaab3d0ac4570f676549b42f3fd775f296">pip_spawn_from_main</a> </dd>
<dd>
<a class="el" href="group__pip__spawn__hook.html#ga1c3f1d9e029f68dbcfb7d78b7dfa1533">pip_spawn_hook</a> </dd>
<dd>
<a class="el" href="group__pip__task__spawn.html#gaf1fcc4cb85ec3eda734afe2beb0c6a36">pip_task_spawn</a> </dd>
<dd>
<a class="el" href="group__pip__trywait.html#ga9e786d15401af041842f3f503c962a4b">pip_trywait</a> </dd>
<dd>
<a class="el" href="group__pip__trywait__any.html#ga697a16f7400d2a2ed2b8ffa230ca83d9">pip_trywait_any</a> </dd>
<dd>
<a class="el" href="group__pip__wait.html#gae04520bc29d3ec85d7090f7e645de27d">pip_wait</a> </dd>
<dd>
<a class="el" href="group__pip__wait__any.html#ga621bba73fda6b2bbe3c04e0c65006d36">pip_wait_any</a> </dd>
<dd>
<a class="el" href="group__pip__yield.html#ga50469f21446ce86ea18ddd282cf15894">pip_yield</a></dd></dl>
<h1><a class="anchor" id="autotoc_md20"></a>
Author</h1>
<p >Atsushi Hori </p>
</div></div><!-- PageDoc -->
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4 </li>
</ul>
</div>
</body>
</html>