232 lines
35 KiB
HTML
232 lines
35 KiB
HTML
<!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=9"/>
|
|
<meta name="generator" content="Doxygen 1.9.1"/>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
|
<title>libctru: include/3ds/thread.h Source File</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="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 style="height: 56px;">
|
|
<td id="projectalign" style="padding-left: 0.5em;">
|
|
<div id="projectname">libctru
|
|
 <span id="projectnumber">v2.4.1</span>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<!-- end header part -->
|
|
<!-- Generated by Doxygen 1.9.1 -->
|
|
<script type="text/javascript">
|
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
|
var searchBox = new SearchBox("searchBox", "search",false,'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:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
|
$(function() {
|
|
initMenu('',true,false,'search.php','Search');
|
|
$(document).ready(function() { init_search(); });
|
|
});
|
|
/* @license-end */</script>
|
|
<div id="main-nav"></div>
|
|
<!-- 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 id="nav-path" class="navpath">
|
|
<ul>
|
|
<li class="navelem"><a class="el" href="dir_d44c64559bbebec7f509842c48db8b23.html">include</a></li><li class="navelem"><a class="el" href="dir_d475325f6a9fe3bfc3a495c72a9e475e.html">3ds</a></li> </ul>
|
|
</div>
|
|
</div><!-- top -->
|
|
<div class="header">
|
|
<div class="headertitle">
|
|
<div class="title">thread.h</div> </div>
|
|
</div><!--header-->
|
|
<div class="contents">
|
|
<a href="thread_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">/**</span></div>
|
|
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment"> * @file thread.h</span></div>
|
|
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment"> * @brief Provides functions to use threads.</span></div>
|
|
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment"> */</span></div>
|
|
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="preprocessor">#pragma once</span></div>
|
|
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="preprocessor">#include <<a class="code" href="types_8h.html">3ds/types.h</a>></span></div>
|
|
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span> <span class="preprocessor">#include <<a class="code" href="result_8h.html">3ds/result.h</a>></span></div>
|
|
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="preprocessor">#include <<a class="code" href="synchronization_8h.html">3ds/synchronization.h</a>></span></div>
|
|
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="preprocessor">#include <<a class="code" href="svc_8h.html">3ds/svc.h</a>></span></div>
|
|
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="preprocessor">#include <<a class="code" href="errf_8h.html">3ds/errf.h</a>></span></div>
|
|
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="comment"></span> </div>
|
|
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="comment">/// Makes the exception handler reuse the stack of the faulting thread as-is</span></div>
|
|
<div class="line"><a name="l00013"></a><span class="lineno"><a class="line" href="thread_8h.html#ab40408690d779ababc87bc40b105279b"> 13</a></span> <span class="comment"></span><span class="preprocessor">#define RUN_HANDLER_ON_FAULTING_STACK ((void*)1)</span></div>
|
|
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="comment"></span> </div>
|
|
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="comment">/// Makes the exception handler push the exception data on its stack</span></div>
|
|
<div class="line"><a name="l00016"></a><span class="lineno"><a class="line" href="thread_8h.html#a099258b92996e6da2567e3da9b2f1356"> 16</a></span> <span class="comment"></span><span class="preprocessor">#define WRITE_DATA_TO_HANDLER_STACK NULL</span></div>
|
|
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span> <span class="comment"></span> </div>
|
|
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="comment">/// Makes the exception handler push the exception data on the stack of the faulting thread</span></div>
|
|
<div class="line"><a name="l00019"></a><span class="lineno"><a class="line" href="thread_8h.html#a6bdd0577b7b6ba62b9d04602e70ec7f8"> 19</a></span> <span class="comment"></span><span class="preprocessor">#define WRITE_DATA_TO_FAULTING_STACK ((ERRF_ExceptionData*)1)</span></div>
|
|
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span> <span class="comment"></span> </div>
|
|
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span> <span class="comment">/// libctru thread handle type</span></div>
|
|
<div class="line"><a name="l00022"></a><span class="lineno"><a class="line" href="thread_8h.html#a32603732d12a56b392a691e42360b035"> 22</a></span> <span class="comment"></span><span class="keyword">typedef</span> <span class="keyword">struct </span>Thread_tag* <a class="code" href="thread_8h.html#a32603732d12a56b392a691e42360b035">Thread</a>;</div>
|
|
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span> <span class="comment"></span> </div>
|
|
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span> <span class="comment">/// Exception handler type, necessarily an ARM function that does not return.</span></div>
|
|
<div class="line"><a name="l00025"></a><span class="lineno"><a class="line" href="thread_8h.html#a37848b429717564001807d9619349b31"> 25</a></span> <span class="comment"></span><span class="keyword">typedef</span> void (*<a class="code" href="thread_8h.html#a37848b429717564001807d9619349b31">ExceptionHandler</a>)(<a class="code" href="structERRF__ExceptionInfo.html">ERRF_ExceptionInfo</a>* excep, <a class="code" href="structCpuRegisters.html">CpuRegisters</a>* regs);</div>
|
|
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span> <span class="comment"></span> </div>
|
|
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span> <span class="comment">/**</span></div>
|
|
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span> <span class="comment"> * @brief Creates a new libctru thread.</span></div>
|
|
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span> <span class="comment"> * @param entrypoint The function that will be called first upon thread creation</span></div>
|
|
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span> <span class="comment"> * @param arg The argument passed to @p entrypoint</span></div>
|
|
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span> <span class="comment"> * @param stack_size The size of the stack that will be allocated for the thread (will be rounded to a multiple of 8 bytes)</span></div>
|
|
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span> <span class="comment"> * @param prio Low values gives the thread higher priority.</span></div>
|
|
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span> <span class="comment"> * For userland apps, this has to be within the range [0x18;0x3F].</span></div>
|
|
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span> <span class="comment"> * The main thread usually has a priority of 0x30, but not always. Use svcGetThreadPriority() if you need</span></div>
|
|
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span> <span class="comment"> * to create a thread with a priority that is explicitly greater or smaller than that of the main thread.</span></div>
|
|
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span> <span class="comment"> * @param core_id The ID of the processor the thread should be ran on. Processor IDs are labeled starting from 0.</span></div>
|
|
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span> <span class="comment"> * On Old3DS it must be <2, and on New3DS it must be <4.</span></div>
|
|
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span> <span class="comment"> * Pass -1 to execute the thread on all CPUs and -2 to execute the thread on the default CPU (read from the Exheader).</span></div>
|
|
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span> <span class="comment"> * @param detached When set to true, the thread is automatically freed when it finishes.</span></div>
|
|
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span> <span class="comment"> * @return The libctru thread handle on success, NULL on failure.</span></div>
|
|
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span> <span class="comment"> *</span></div>
|
|
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span> <span class="comment"> * - Processor #0 is the application core. It is always possible to create a thread on this core.</span></div>
|
|
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span> <span class="comment"> * - Processor #1 is the system core. If APT_SetAppCpuTimeLimit is used, it is possible to create a single thread on this core.</span></div>
|
|
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span> <span class="comment"> * - Processor #2 is New3DS exclusive. Normal applications can create threads on this core if the exheader kernel flags bitmask has 0x2000 set.</span></div>
|
|
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span> <span class="comment"> * - Processor #3 is New3DS exclusive. Normal applications cannot create threads on this core.</span></div>
|
|
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span> <span class="comment"> * - Processes in the BASE memory region can always create threads on processors #2 and #3.</span></div>
|
|
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span> <span class="comment"> *</span></div>
|
|
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span> <span class="comment"> * @note Default exit code of a thread is 0.</span></div>
|
|
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span> <span class="comment"> * @warning @ref svcExitThread should never be called from the thread, use @ref threadExit instead.</span></div>
|
|
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span> <span class="comment"> */</span></div>
|
|
<div class="line"><a name="l00051"></a><span class="lineno"><a class="line" href="thread_8h.html#a38c873d8cb02de7f5eca848fe68183ee"> 51</a></span> <a class="code" href="thread_8h.html#a32603732d12a56b392a691e42360b035">Thread</a> <a class="code" href="thread_8h.html#a38c873d8cb02de7f5eca848fe68183ee">threadCreate</a>(<a class="code" href="types_8h.html#a857e4e893f41191500e83c00058df64e">ThreadFunc</a> entrypoint, <span class="keywordtype">void</span>* arg, <span class="keywordtype">size_t</span> stack_size, <span class="keywordtype">int</span> prio, <span class="keywordtype">int</span> core_id, <span class="keywordtype">bool</span> detached);</div>
|
|
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span> <span class="comment"></span> </div>
|
|
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span> <span class="comment">/**</span></div>
|
|
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span> <span class="comment"> * @brief Retrieves the OS thread handle of a libctru thread.</span></div>
|
|
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span> <span class="comment"> * @param thread libctru thread handle</span></div>
|
|
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span> <span class="comment"> * @return OS thread handle</span></div>
|
|
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span> <span class="comment"> */</span></div>
|
|
<div class="line"><a name="l00058"></a><span class="lineno"><a class="line" href="thread_8h.html#a6f95b5664998852d05adfe79d2490988"> 58</a></span> <a class="code" href="types_8h.html#ab6d744c6b5de129f12937e482dc674fb">Handle</a> <a class="code" href="thread_8h.html#a6f95b5664998852d05adfe79d2490988">threadGetHandle</a>(<a class="code" href="thread_8h.html#a32603732d12a56b392a691e42360b035">Thread</a> thread);</div>
|
|
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span> <span class="comment"></span> </div>
|
|
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span> <span class="comment">/**</span></div>
|
|
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span> <span class="comment"> * @brief Retrieves the exit code of a finished libctru thread.</span></div>
|
|
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span> <span class="comment"> * @param thread libctru thread handle</span></div>
|
|
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span> <span class="comment"> * @return Exit code</span></div>
|
|
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span> <span class="comment"> */</span></div>
|
|
<div class="line"><a name="l00065"></a><span class="lineno"><a class="line" href="thread_8h.html#aece3cff1637deec4b6497bb438dba2e8"> 65</a></span> <span class="keywordtype">int</span> <a class="code" href="thread_8h.html#aece3cff1637deec4b6497bb438dba2e8">threadGetExitCode</a>(<a class="code" href="thread_8h.html#a32603732d12a56b392a691e42360b035">Thread</a> thread);</div>
|
|
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span> <span class="comment"></span> </div>
|
|
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span> <span class="comment">/**</span></div>
|
|
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span> <span class="comment"> * @brief Frees a finished libctru thread.</span></div>
|
|
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span> <span class="comment"> * @param thread libctru thread handle</span></div>
|
|
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span> <span class="comment"> * @remarks This function should not be called if the thread is detached, as it is freed automatically when it finishes.</span></div>
|
|
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span> <span class="comment"> */</span></div>
|
|
<div class="line"><a name="l00072"></a><span class="lineno"><a class="line" href="thread_8h.html#aed4c2f06cf2ae66583325bd96588fa27"> 72</a></span> <span class="keywordtype">void</span> <a class="code" href="thread_8h.html#aed4c2f06cf2ae66583325bd96588fa27">threadFree</a>(<a class="code" href="thread_8h.html#a32603732d12a56b392a691e42360b035">Thread</a> thread);</div>
|
|
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span> <span class="comment"></span> </div>
|
|
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span> <span class="comment">/**</span></div>
|
|
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span> <span class="comment"> * @brief Waits for a libctru thread to finish (or returns immediately if it is already finished).</span></div>
|
|
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span> <span class="comment"> * @param thread libctru thread handle</span></div>
|
|
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span> <span class="comment"> * @param timeout_ns Timeout in nanoseconds. Pass U64_MAX if a timeout isn't desired</span></div>
|
|
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span> <span class="comment"> */</span></div>
|
|
<div class="line"><a name="l00079"></a><span class="lineno"><a class="line" href="thread_8h.html#a5d7a5a77d24710c19f866d02594553db"> 79</a></span> <a class="code" href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a> <a class="code" href="thread_8h.html#a5d7a5a77d24710c19f866d02594553db">threadJoin</a>(<a class="code" href="thread_8h.html#a32603732d12a56b392a691e42360b035">Thread</a> thread, <a class="code" href="types_8h.html#a3f7e2bcbb0b4c338f3c4f6c937cd4234">u64</a> timeout_ns);</div>
|
|
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span> <span class="comment"></span> </div>
|
|
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span> <span class="comment">/**</span></div>
|
|
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span> <span class="comment"> * @brief Changes a thread's status from attached to detached.</span></div>
|
|
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span> <span class="comment"> * @param thread libctru thread handle</span></div>
|
|
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span> <span class="comment"> */</span></div>
|
|
<div class="line"><a name="l00085"></a><span class="lineno"><a class="line" href="thread_8h.html#ac20502670ea68159c68d6e153e27e712"> 85</a></span> <span class="keywordtype">void</span> <a class="code" href="thread_8h.html#ac20502670ea68159c68d6e153e27e712">threadDetach</a>(<a class="code" href="thread_8h.html#a32603732d12a56b392a691e42360b035">Thread</a> thread);</div>
|
|
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span> <span class="comment"></span> </div>
|
|
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span> <span class="comment">/**</span></div>
|
|
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span> <span class="comment"> * @brief Retrieves the libctru thread handle of the current thread.</span></div>
|
|
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span> <span class="comment"> * @return libctru thread handle of the current thread, or NULL for the main thread</span></div>
|
|
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span> <span class="comment"> */</span></div>
|
|
<div class="line"><a name="l00091"></a><span class="lineno"><a class="line" href="thread_8h.html#aaf77fd339bcd06c1aa63aaffa74ba118"> 91</a></span> <a class="code" href="thread_8h.html#a32603732d12a56b392a691e42360b035">Thread</a> <a class="code" href="thread_8h.html#aaf77fd339bcd06c1aa63aaffa74ba118">threadGetCurrent</a>(<span class="keywordtype">void</span>);</div>
|
|
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span> <span class="comment"></span> </div>
|
|
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span> <span class="comment">/**</span></div>
|
|
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span> <span class="comment"> * @brief Exits the current libctru thread with an exit code (not usable from the main thread).</span></div>
|
|
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span> <span class="comment"> * @param rc Exit code</span></div>
|
|
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span> <span class="comment"> */</span></div>
|
|
<div class="line"><a name="l00097"></a><span class="lineno"><a class="line" href="thread_8h.html#aa018f7fca858955b66821d6faa4e9b47"> 97</a></span> <span class="keywordtype">void</span> <a class="code" href="thread_8h.html#aa018f7fca858955b66821d6faa4e9b47">threadExit</a>(<span class="keywordtype">int</span> rc) <a class="code" href="rbtree_8h.html#a797a3e1c8507a7c7b4e051d3f1349154">__attribute__</a>((noreturn));</div>
|
|
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span> <span class="comment"></span> </div>
|
|
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span> <span class="comment">/**</span></div>
|
|
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span> <span class="comment"> * @brief Sets the exception handler for the current thread. Called from the main thread, this sets the default handler.</span></div>
|
|
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span> <span class="comment"> * @param handler The exception handler, necessarily an ARM function that does not return</span></div>
|
|
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span> <span class="comment"> * @param stack_top A pointer to the top of the stack that will be used by the handler. See also @ref RUN_HANDLER_ON_FAULTING_STACK</span></div>
|
|
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span> <span class="comment"> * @param exception_data A pointer to the buffer that will contain the exception data.</span></div>
|
|
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span> <span class="comment"> See also @ref WRITE_DATA_TO_HANDLER_STACK and @ref WRITE_DATA_TO_FAULTING_STACK</span></div>
|
|
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span> <span class="comment"> *</span></div>
|
|
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span> <span class="comment"> * To have CPU exceptions reported through this mechanism, it is normally necessary that UNITINFO is set to a non-zero value when Kernel11 starts,</span></div>
|
|
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span> <span class="comment"> * and this mechanism is also controlled by @ref svcKernelSetState type 6, see 3dbrew.</span></div>
|
|
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span> <span class="comment"> *</span></div>
|
|
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span> <span class="comment"> * VFP exceptions are always reported this way even if the process is being debugged using the debug SVCs.</span></div>
|
|
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span> <span class="comment"> *</span></div>
|
|
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span> <span class="comment"> * The current thread need not be a libctru thread.</span></div>
|
|
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span> <span class="comment"> */</span></div>
|
|
<div class="line"><a name="l00113"></a><span class="lineno"><a class="line" href="thread_8h.html#ad102ce4415b0054ec6903a5668e5ffab"> 113</a></span> <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="thread_8h.html#ad102ce4415b0054ec6903a5668e5ffab">threadOnException</a>(<a class="code" href="thread_8h.html#a37848b429717564001807d9619349b31">ExceptionHandler</a> handler, <span class="keywordtype">void</span>* stack_top, <a class="code" href="structERRF__ExceptionData.html">ERRF_ExceptionData</a>* exception_data)</div>
|
|
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span> {</div>
|
|
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>  <a class="code" href="types_8h.html#a92c50087ca0e64fa93fc59402c55f8ca">u8</a>* tls = (<a class="code" href="types_8h.html#a92c50087ca0e64fa93fc59402c55f8ca">u8</a>*)<a class="code" href="svc_8h.html#a3f23b2d589b488efb59603000c5f7969">getThreadLocalStorage</a>();</div>
|
|
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>  </div>
|
|
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>  *(<a class="code" href="types_8h.html#afaa62991928fb9fb18ff0db62a040aba">u32</a>*)(tls + 0x40) = (<a class="code" href="types_8h.html#afaa62991928fb9fb18ff0db62a040aba">u32</a>)handler;</div>
|
|
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>  *(<a class="code" href="types_8h.html#afaa62991928fb9fb18ff0db62a040aba">u32</a>*)(tls + 0x44) = (<a class="code" href="types_8h.html#afaa62991928fb9fb18ff0db62a040aba">u32</a>)stack_top;</div>
|
|
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>  *(<a class="code" href="types_8h.html#afaa62991928fb9fb18ff0db62a040aba">u32</a>*)(tls + 0x48) = (<a class="code" href="types_8h.html#afaa62991928fb9fb18ff0db62a040aba">u32</a>)exception_data;</div>
|
|
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>  </div>
|
|
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>  <a class="code" href="synchronization_8h.html#a4f5f4fd74aae52a2310fb2c6a5983e4d">__dsb</a>();</div>
|
|
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>  <a class="code" href="synchronization_8h.html#a88917e3c9a446a5d078165af7b9c884c">__isb</a>();</div>
|
|
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span> }</div>
|
|
<div class="ttc" id="aerrf_8h_html"><div class="ttname"><a href="errf_8h.html">errf.h</a></div><div class="ttdoc">Error Display API.</div></div>
|
|
<div class="ttc" id="arbtree_8h_html_a797a3e1c8507a7c7b4e051d3f1349154"><div class="ttname"><a href="rbtree_8h.html#a797a3e1c8507a7c7b4e051d3f1349154">__attribute__</a></div><div class="ttdeci">__attribute__((warn_unused_result)) rbtree_node_t *rbtree_insert(rbtree_t *tree</div><div class="ttdoc">Inserts a node into an rbtree.</div></div>
|
|
<div class="ttc" id="aresult_8h_html"><div class="ttname"><a href="result_8h.html">result.h</a></div><div class="ttdoc">3DS result code tools</div></div>
|
|
<div class="ttc" id="astructCpuRegisters_html"><div class="ttname"><a href="structCpuRegisters.html">CpuRegisters</a></div><div class="ttdoc">Structure representing CPU registers.</div><div class="ttdef"><b>Definition:</b> types.h:63</div></div>
|
|
<div class="ttc" id="astructERRF__ExceptionData_html"><div class="ttname"><a href="structERRF__ExceptionData.html">ERRF_ExceptionData</a></div><div class="ttdef"><b>Definition:</b> errf.h:38</div></div>
|
|
<div class="ttc" id="astructERRF__ExceptionInfo_html"><div class="ttname"><a href="structERRF__ExceptionInfo.html">ERRF_ExceptionInfo</a></div><div class="ttdef"><b>Definition:</b> errf.h:28</div></div>
|
|
<div class="ttc" id="asvc_8h_html"><div class="ttname"><a href="svc_8h.html">svc.h</a></div><div class="ttdoc">Syscall wrappers.</div></div>
|
|
<div class="ttc" id="asvc_8h_html_a3f23b2d589b488efb59603000c5f7969"><div class="ttname"><a href="svc_8h.html#a3f23b2d589b488efb59603000c5f7969">getThreadLocalStorage</a></div><div class="ttdeci">static void * getThreadLocalStorage(void)</div><div class="ttdoc">Gets the thread local storage buffer.</div><div class="ttdef"><b>Definition:</b> svc.h:531</div></div>
|
|
<div class="ttc" id="asynchronization_8h_html"><div class="ttname"><a href="synchronization_8h.html">synchronization.h</a></div><div class="ttdoc">Provides synchronization locks.</div></div>
|
|
<div class="ttc" id="asynchronization_8h_html_a4f5f4fd74aae52a2310fb2c6a5983e4d"><div class="ttname"><a href="synchronization_8h.html#a4f5f4fd74aae52a2310fb2c6a5983e4d">__dsb</a></div><div class="ttdeci">static void __dsb(void)</div><div class="ttdoc">Performs a Data Synchronization Barrier operation.</div><div class="ttdef"><b>Definition:</b> synchronization.h:34</div></div>
|
|
<div class="ttc" id="asynchronization_8h_html_a88917e3c9a446a5d078165af7b9c884c"><div class="ttname"><a href="synchronization_8h.html#a88917e3c9a446a5d078165af7b9c884c">__isb</a></div><div class="ttdeci">static void __isb(void)</div><div class="ttdoc">Performs an Instruction Synchronization Barrier (officially "flush prefetch buffer") operation.</div><div class="ttdef"><b>Definition:</b> synchronization.h:46</div></div>
|
|
<div class="ttc" id="athread_8h_html_a32603732d12a56b392a691e42360b035"><div class="ttname"><a href="thread_8h.html#a32603732d12a56b392a691e42360b035">Thread</a></div><div class="ttdeci">struct Thread_tag * Thread</div><div class="ttdoc">libctru thread handle type</div><div class="ttdef"><b>Definition:</b> thread.h:22</div></div>
|
|
<div class="ttc" id="athread_8h_html_a37848b429717564001807d9619349b31"><div class="ttname"><a href="thread_8h.html#a37848b429717564001807d9619349b31">ExceptionHandler</a></div><div class="ttdeci">void(* ExceptionHandler)(ERRF_ExceptionInfo *excep, CpuRegisters *regs)</div><div class="ttdoc">Exception handler type, necessarily an ARM function that does not return.</div><div class="ttdef"><b>Definition:</b> thread.h:25</div></div>
|
|
<div class="ttc" id="athread_8h_html_a38c873d8cb02de7f5eca848fe68183ee"><div class="ttname"><a href="thread_8h.html#a38c873d8cb02de7f5eca848fe68183ee">threadCreate</a></div><div class="ttdeci">Thread threadCreate(ThreadFunc entrypoint, void *arg, size_t stack_size, int prio, int core_id, bool detached)</div><div class="ttdoc">Creates a new libctru thread.</div></div>
|
|
<div class="ttc" id="athread_8h_html_a5d7a5a77d24710c19f866d02594553db"><div class="ttname"><a href="thread_8h.html#a5d7a5a77d24710c19f866d02594553db">threadJoin</a></div><div class="ttdeci">Result threadJoin(Thread thread, u64 timeout_ns)</div><div class="ttdoc">Waits for a libctru thread to finish (or returns immediately if it is already finished).</div></div>
|
|
<div class="ttc" id="athread_8h_html_a6f95b5664998852d05adfe79d2490988"><div class="ttname"><a href="thread_8h.html#a6f95b5664998852d05adfe79d2490988">threadGetHandle</a></div><div class="ttdeci">Handle threadGetHandle(Thread thread)</div><div class="ttdoc">Retrieves the OS thread handle of a libctru thread.</div></div>
|
|
<div class="ttc" id="athread_8h_html_aa018f7fca858955b66821d6faa4e9b47"><div class="ttname"><a href="thread_8h.html#aa018f7fca858955b66821d6faa4e9b47">threadExit</a></div><div class="ttdeci">void threadExit(int rc) __attribute__((noreturn))</div><div class="ttdoc">Exits the current libctru thread with an exit code (not usable from the main thread).</div></div>
|
|
<div class="ttc" id="athread_8h_html_aaf77fd339bcd06c1aa63aaffa74ba118"><div class="ttname"><a href="thread_8h.html#aaf77fd339bcd06c1aa63aaffa74ba118">threadGetCurrent</a></div><div class="ttdeci">Thread threadGetCurrent(void)</div><div class="ttdoc">Retrieves the libctru thread handle of the current thread.</div></div>
|
|
<div class="ttc" id="athread_8h_html_ac20502670ea68159c68d6e153e27e712"><div class="ttname"><a href="thread_8h.html#ac20502670ea68159c68d6e153e27e712">threadDetach</a></div><div class="ttdeci">void threadDetach(Thread thread)</div><div class="ttdoc">Changes a thread's status from attached to detached.</div></div>
|
|
<div class="ttc" id="athread_8h_html_ad102ce4415b0054ec6903a5668e5ffab"><div class="ttname"><a href="thread_8h.html#ad102ce4415b0054ec6903a5668e5ffab">threadOnException</a></div><div class="ttdeci">static void threadOnException(ExceptionHandler handler, void *stack_top, ERRF_ExceptionData *exception_data)</div><div class="ttdoc">Sets the exception handler for the current thread.</div><div class="ttdef"><b>Definition:</b> thread.h:113</div></div>
|
|
<div class="ttc" id="athread_8h_html_aece3cff1637deec4b6497bb438dba2e8"><div class="ttname"><a href="thread_8h.html#aece3cff1637deec4b6497bb438dba2e8">threadGetExitCode</a></div><div class="ttdeci">int threadGetExitCode(Thread thread)</div><div class="ttdoc">Retrieves the exit code of a finished libctru thread.</div></div>
|
|
<div class="ttc" id="athread_8h_html_aed4c2f06cf2ae66583325bd96588fa27"><div class="ttname"><a href="thread_8h.html#aed4c2f06cf2ae66583325bd96588fa27">threadFree</a></div><div class="ttdeci">void threadFree(Thread thread)</div><div class="ttdoc">Frees a finished libctru thread.</div></div>
|
|
<div class="ttc" id="atypes_8h_html"><div class="ttname"><a href="types_8h.html">types.h</a></div><div class="ttdoc">Various system types.</div></div>
|
|
<div class="ttc" id="atypes_8h_html_a3f7e2bcbb0b4c338f3c4f6c937cd4234"><div class="ttname"><a href="types_8h.html#a3f7e2bcbb0b4c338f3c4f6c937cd4234">u64</a></div><div class="ttdeci">uint64_t u64</div><div class="ttdoc">64-bit unsigned integer</div><div class="ttdef"><b>Definition:</b> types.h:24</div></div>
|
|
<div class="ttc" id="atypes_8h_html_a857e4e893f41191500e83c00058df64e"><div class="ttname"><a href="types_8h.html#a857e4e893f41191500e83c00058df64e">ThreadFunc</a></div><div class="ttdeci">void(* ThreadFunc)(void *)</div><div class="ttdoc">Thread entrypoint function.</div><div class="ttdef"><b>Definition:</b> types.h:43</div></div>
|
|
<div class="ttc" id="atypes_8h_html_a92c50087ca0e64fa93fc59402c55f8ca"><div class="ttname"><a href="types_8h.html#a92c50087ca0e64fa93fc59402c55f8ca">u8</a></div><div class="ttdeci">uint8_t u8</div><div class="ttdoc">would be nice if newlib had this already</div><div class="ttdef"><b>Definition:</b> types.h:21</div></div>
|
|
<div class="ttc" id="atypes_8h_html_ab6d744c6b5de129f12937e482dc674fb"><div class="ttname"><a href="types_8h.html#ab6d744c6b5de129f12937e482dc674fb">Handle</a></div><div class="ttdeci">u32 Handle</div><div class="ttdoc">Resource handle.</div><div class="ttdef"><b>Definition:</b> types.h:41</div></div>
|
|
<div class="ttc" id="atypes_8h_html_ac830bf5a4f2cf8273f61ab99a46cf163"><div class="ttname"><a href="types_8h.html#ac830bf5a4f2cf8273f61ab99a46cf163">Result</a></div><div class="ttdeci">s32 Result</div><div class="ttdoc">Function result.</div><div class="ttdef"><b>Definition:</b> types.h:42</div></div>
|
|
<div class="ttc" id="atypes_8h_html_afaa62991928fb9fb18ff0db62a040aba"><div class="ttname"><a href="types_8h.html#afaa62991928fb9fb18ff0db62a040aba">u32</a></div><div class="ttdeci">uint32_t u32</div><div class="ttdoc">32-bit unsigned integer</div><div class="ttdef"><b>Definition:</b> types.h:23</div></div>
|
|
</div><!-- fragment --></div><!-- contents -->
|
|
<!-- start footer part -->
|
|
<hr class="footer"/><address class="footer"><small>
|
|
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.1
|
|
</small></address>
|
|
</body>
|
|
</html>
|