aboutsummaryrefslogtreecommitdiff
path: root/21.02/_send_thread_8cpp_source.xhtml
blob: 70a1bcf7d8d983f35850454208fa22d933ae543c (plain)
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
<!-- Copyright (c) 2020 ARM Limited. -->
<!--                                 -->
<!-- SPDX-License-Identifier: MIT    -->
<!--                                 -->
<!-- HTML header for doxygen 1.8.13-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://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.8.13"/>
<meta name="robots" content="NOINDEX, NOFOLLOW" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>ArmNN: src/profiling/SendThread.cpp 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="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>
<script type="text/javascript">
  $(document).ready(initResizable);
</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>
<script type="text/x-mathjax-config">
  MathJax.Hub.Config({
    extensions: ["tex2jax.js"],
    jax: ["input/TeX","output/HTML-CSS"],
});
</script><script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="stylesheet.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;">
  <img alt="ArmNN" src="Arm_NN_horizontal_blue.png" style="max-width: 10rem; margin-top: .5rem; margin-left 10px"/>
  <td style="padding-left: 0.5em;">
   <div id="projectname">
   &#160;<span id="projectnumber">21.02</span>
   </div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
  initMenu('',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
</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">
$(document).ready(function(){initNavTree('_send_thread_8cpp_source.xhtml','');});
</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 class="header">
  <div class="headertitle">
<div class="title">SendThread.cpp</div>  </div>
</div><!--header-->
<div class="contents">
<a href="_send_thread_8cpp.xhtml">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;<span class="comment">// Copyright © 2020 Arm Ltd and Contributors. All rights reserved.</span></div><div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;<span class="comment">// SPDX-License-Identifier: MIT</span></div><div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;</div><div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="_send_thread_8hpp.xhtml">SendThread.hpp</a>&quot;</span></div><div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="_profiling_utils_8hpp.xhtml">ProfilingUtils.hpp</a>&quot;</span></div><div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;</div><div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="_exceptions_8hpp.xhtml">armnn/Exceptions.hpp</a>&gt;</span></div><div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="_conversion_8hpp.xhtml">armnn/Conversion.hpp</a>&gt;</span></div><div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="_numeric_cast_8hpp.xhtml">armnn/utility/NumericCast.hpp</a>&gt;</span></div><div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;</div><div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="_processes_8hpp.xhtml">Processes.hpp</a>&gt;</span></div><div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;</div><div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;<span class="preprocessor">#include &lt;cstring&gt;</span></div><div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;</div><div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacearmnn.xhtml">armnn</a></div><div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;{</div><div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;</div><div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;<span class="keyword">namespace </span>profiling</div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;{</div><div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;</div><div class="line"><a name="l00023"></a><span class="lineno"><a class="line" href="classarmnn_1_1profiling_1_1_send_thread.xhtml#ad02c2666a109b2b56624295ffae06d6e">   23</a></span>&#160;<a class="code" href="classarmnn_1_1profiling_1_1_send_thread.xhtml#ad02c2666a109b2b56624295ffae06d6e">SendThread::SendThread</a>(<a class="code" href="classarmnn_1_1profiling_1_1_profiling_state_machine.xhtml">armnn::profiling::ProfilingStateMachine</a>&amp; profilingStateMachine,</div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;                       <a class="code" href="classarmnn_1_1profiling_1_1_i_buffer_manager.xhtml">armnn::profiling::IBufferManager</a>&amp; buffer,</div><div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;                       <a class="code" href="classarmnn_1_1profiling_1_1_i_send_counter_packet.xhtml">armnn::profiling::ISendCounterPacket</a>&amp; sendCounterPacket,</div><div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;                       <span class="keywordtype">int</span> timeout)</div><div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;    : m_StateMachine(profilingStateMachine)</div><div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;    , m_BufferManager(buffer)</div><div class="line"><a name="l00029"></a><span class="lineno">   29</span>&#160;    , m_SendCounterPacket(sendCounterPacket)</div><div class="line"><a name="l00030"></a><span class="lineno">   30</span>&#160;    , m_Timeout(timeout)</div><div class="line"><a name="l00031"></a><span class="lineno">   31</span>&#160;    , m_IsRunning(<a class="code" href="_cl_layer_tests_8cpp.xhtml#a2289f9e7fac0ce47801448e873b04303">false</a>)</div><div class="line"><a name="l00032"></a><span class="lineno">   32</span>&#160;    , m_KeepRunning(<a class="code" href="_cl_layer_tests_8cpp.xhtml#a2289f9e7fac0ce47801448e873b04303">false</a>)</div><div class="line"><a name="l00033"></a><span class="lineno">   33</span>&#160;    , m_SendThreadException(nullptr)</div><div class="line"><a name="l00034"></a><span class="lineno">   34</span>&#160;{</div><div class="line"><a name="l00035"></a><span class="lineno">   35</span>&#160;    m_BufferManager.<a class="code" href="classarmnn_1_1profiling_1_1_i_buffer_manager.xhtml#a2d5f60e55b59ae8667ff593b5bfc5deb">SetConsumer</a>(<span class="keyword">this</span>);</div><div class="line"><a name="l00036"></a><span class="lineno">   36</span>&#160;}</div><div class="line"><a name="l00037"></a><span class="lineno">   37</span>&#160;</div><div class="line"><a name="l00038"></a><span class="lineno"><a class="line" href="classarmnn_1_1profiling_1_1_send_thread.xhtml#ad2d0b47c9cfacb7abdb524878b07c9a7">   38</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_1_1profiling_1_1_send_thread.xhtml#ad2d0b47c9cfacb7abdb524878b07c9a7">SendThread::SetReadyToRead</a>()</div><div class="line"><a name="l00039"></a><span class="lineno">   39</span>&#160;{</div><div class="line"><a name="l00040"></a><span class="lineno">   40</span>&#160;    <span class="comment">// We need to wait for the send thread to release its mutex</span></div><div class="line"><a name="l00041"></a><span class="lineno">   41</span>&#160;    {</div><div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;        std::lock_guard&lt;std::mutex&gt; lck(m_WaitMutex);</div><div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;        m_ReadyToRead = <span class="keyword">true</span>;</div><div class="line"><a name="l00044"></a><span class="lineno">   44</span>&#160;    }</div><div class="line"><a name="l00045"></a><span class="lineno">   45</span>&#160;    <span class="comment">// Signal the send thread that there&#39;s something to read in the buffer</span></div><div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;    m_WaitCondition.notify_one();</div><div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;}</div><div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;</div><div class="line"><a name="l00049"></a><span class="lineno"><a class="line" href="classarmnn_1_1profiling_1_1_send_thread.xhtml#a160847691cc1341520cf16c11c1ec724">   49</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_1_1profiling_1_1_send_thread.xhtml#a160847691cc1341520cf16c11c1ec724">SendThread::Start</a>(<a class="code" href="classarmnn_1_1profiling_1_1_i_profiling_connection.xhtml">IProfilingConnection</a>&amp; profilingConnection)</div><div class="line"><a name="l00050"></a><span class="lineno">   50</span>&#160;{</div><div class="line"><a name="l00051"></a><span class="lineno">   51</span>&#160;    <span class="comment">// Check if the send thread is already running</span></div><div class="line"><a name="l00052"></a><span class="lineno">   52</span>&#160;    <span class="keywordflow">if</span> (m_IsRunning.load())</div><div class="line"><a name="l00053"></a><span class="lineno">   53</span>&#160;    {</div><div class="line"><a name="l00054"></a><span class="lineno">   54</span>&#160;        <span class="comment">// The send thread is already running</span></div><div class="line"><a name="l00055"></a><span class="lineno">   55</span>&#160;        <span class="keywordflow">return</span>;</div><div class="line"><a name="l00056"></a><span class="lineno">   56</span>&#160;    }</div><div class="line"><a name="l00057"></a><span class="lineno">   57</span>&#160;</div><div class="line"><a name="l00058"></a><span class="lineno">   58</span>&#160;    <span class="keywordflow">if</span> (m_SendThread.joinable())</div><div class="line"><a name="l00059"></a><span class="lineno">   59</span>&#160;    {</div><div class="line"><a name="l00060"></a><span class="lineno">   60</span>&#160;        m_SendThread.join();</div><div class="line"><a name="l00061"></a><span class="lineno">   61</span>&#160;    }</div><div class="line"><a name="l00062"></a><span class="lineno">   62</span>&#160;</div><div class="line"><a name="l00063"></a><span class="lineno">   63</span>&#160;    <span class="comment">// Mark the send thread as running</span></div><div class="line"><a name="l00064"></a><span class="lineno">   64</span>&#160;    m_IsRunning.store(<span class="keyword">true</span>);</div><div class="line"><a name="l00065"></a><span class="lineno">   65</span>&#160;</div><div class="line"><a name="l00066"></a><span class="lineno">   66</span>&#160;    <span class="comment">// Keep the send procedure going until the send thread is signalled to stop</span></div><div class="line"><a name="l00067"></a><span class="lineno">   67</span>&#160;    m_KeepRunning.store(<span class="keyword">true</span>);</div><div class="line"><a name="l00068"></a><span class="lineno">   68</span>&#160;</div><div class="line"><a name="l00069"></a><span class="lineno">   69</span>&#160;    <span class="comment">// Make sure the send thread will not flush the buffer until signaled to do so</span></div><div class="line"><a name="l00070"></a><span class="lineno">   70</span>&#160;    <span class="comment">// no need for a mutex as the send thread can not be running at this point</span></div><div class="line"><a name="l00071"></a><span class="lineno">   71</span>&#160;    m_ReadyToRead = <span class="keyword">false</span>;</div><div class="line"><a name="l00072"></a><span class="lineno">   72</span>&#160;</div><div class="line"><a name="l00073"></a><span class="lineno">   73</span>&#160;    m_PacketSent = <span class="keyword">false</span>;</div><div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;</div><div class="line"><a name="l00075"></a><span class="lineno">   75</span>&#160;    <span class="comment">// Start the send thread</span></div><div class="line"><a name="l00076"></a><span class="lineno">   76</span>&#160;    m_SendThread = std::thread(&amp;SendThread::Send, <span class="keyword">this</span>, std::ref(profilingConnection));</div><div class="line"><a name="l00077"></a><span class="lineno">   77</span>&#160;}</div><div class="line"><a name="l00078"></a><span class="lineno">   78</span>&#160;</div><div class="line"><a name="l00079"></a><span class="lineno"><a class="line" href="classarmnn_1_1profiling_1_1_send_thread.xhtml#a32e1e5f33658343e4a480d37329cff38">   79</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_1_1profiling_1_1_send_thread.xhtml#a32e1e5f33658343e4a480d37329cff38">SendThread::Stop</a>(<span class="keywordtype">bool</span> rethrowSendThreadExceptions)</div><div class="line"><a name="l00080"></a><span class="lineno">   80</span>&#160;{</div><div class="line"><a name="l00081"></a><span class="lineno">   81</span>&#160;    <span class="comment">// Signal the send thread to stop</span></div><div class="line"><a name="l00082"></a><span class="lineno">   82</span>&#160;    m_KeepRunning.store(<span class="keyword">false</span>);</div><div class="line"><a name="l00083"></a><span class="lineno">   83</span>&#160;</div><div class="line"><a name="l00084"></a><span class="lineno">   84</span>&#160;    <span class="comment">// Check that the send thread is running</span></div><div class="line"><a name="l00085"></a><span class="lineno">   85</span>&#160;    <span class="keywordflow">if</span> (m_SendThread.joinable())</div><div class="line"><a name="l00086"></a><span class="lineno">   86</span>&#160;    {</div><div class="line"><a name="l00087"></a><span class="lineno">   87</span>&#160;        <span class="comment">// Kick the send thread out of the wait condition</span></div><div class="line"><a name="l00088"></a><span class="lineno">   88</span>&#160;        <a class="code" href="classarmnn_1_1profiling_1_1_send_thread.xhtml#ad2d0b47c9cfacb7abdb524878b07c9a7">SetReadyToRead</a>();</div><div class="line"><a name="l00089"></a><span class="lineno">   89</span>&#160;        <span class="comment">// Wait for the send thread to complete operations</span></div><div class="line"><a name="l00090"></a><span class="lineno">   90</span>&#160;        m_SendThread.join();</div><div class="line"><a name="l00091"></a><span class="lineno">   91</span>&#160;    }</div><div class="line"><a name="l00092"></a><span class="lineno">   92</span>&#160;</div><div class="line"><a name="l00093"></a><span class="lineno">   93</span>&#160;    <span class="comment">// Check if the send thread exception has to be rethrown</span></div><div class="line"><a name="l00094"></a><span class="lineno">   94</span>&#160;    <span class="keywordflow">if</span> (!rethrowSendThreadExceptions)</div><div class="line"><a name="l00095"></a><span class="lineno">   95</span>&#160;    {</div><div class="line"><a name="l00096"></a><span class="lineno">   96</span>&#160;        <span class="comment">// No need to rethrow the send thread exception, return immediately</span></div><div class="line"><a name="l00097"></a><span class="lineno">   97</span>&#160;        <span class="keywordflow">return</span>;</div><div class="line"><a name="l00098"></a><span class="lineno">   98</span>&#160;    }</div><div class="line"><a name="l00099"></a><span class="lineno">   99</span>&#160;</div><div class="line"><a name="l00100"></a><span class="lineno">  100</span>&#160;    <span class="comment">// Check if there&#39;s an exception to rethrow</span></div><div class="line"><a name="l00101"></a><span class="lineno">  101</span>&#160;    <span class="keywordflow">if</span> (m_SendThreadException)</div><div class="line"><a name="l00102"></a><span class="lineno">  102</span>&#160;    {</div><div class="line"><a name="l00103"></a><span class="lineno">  103</span>&#160;        <span class="comment">// Rethrow the send thread exception</span></div><div class="line"><a name="l00104"></a><span class="lineno">  104</span>&#160;        std::rethrow_exception(m_SendThreadException);</div><div class="line"><a name="l00105"></a><span class="lineno">  105</span>&#160;</div><div class="line"><a name="l00106"></a><span class="lineno">  106</span>&#160;        <span class="comment">// Nullify the exception as it has been rethrown</span></div><div class="line"><a name="l00107"></a><span class="lineno">  107</span>&#160;        m_SendThreadException = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00108"></a><span class="lineno">  108</span>&#160;    }</div><div class="line"><a name="l00109"></a><span class="lineno">  109</span>&#160;}</div><div class="line"><a name="l00110"></a><span class="lineno">  110</span>&#160;</div><div class="line"><a name="l00111"></a><span class="lineno">  111</span>&#160;<span class="keywordtype">void</span> SendThread::Send(<a class="code" href="classarmnn_1_1profiling_1_1_i_profiling_connection.xhtml">IProfilingConnection</a>&amp; profilingConnection)</div><div class="line"><a name="l00112"></a><span class="lineno">  112</span>&#160;{</div><div class="line"><a name="l00113"></a><span class="lineno">  113</span>&#160;    <span class="comment">// Run once and keep the sending procedure looping until the thread is signalled to stop</span></div><div class="line"><a name="l00114"></a><span class="lineno">  114</span>&#160;    <span class="keywordflow">do</span></div><div class="line"><a name="l00115"></a><span class="lineno">  115</span>&#160;    {</div><div class="line"><a name="l00116"></a><span class="lineno">  116</span>&#160;        <span class="comment">// Check the current state of the profiling service</span></div><div class="line"><a name="l00117"></a><span class="lineno">  117</span>&#160;        <a class="code" href="namespacearmnn_1_1profiling.xhtml#acb0c054138599582d5a5f537e9798806">ProfilingState</a> currentState = m_StateMachine.<a class="code" href="classarmnn_1_1profiling_1_1_profiling_state_machine.xhtml#ad8d263669817cf577760710ff6c96bb9">GetCurrentState</a>();</div><div class="line"><a name="l00118"></a><span class="lineno">  118</span>&#160;        <span class="keywordflow">switch</span> (currentState)</div><div class="line"><a name="l00119"></a><span class="lineno">  119</span>&#160;        {</div><div class="line"><a name="l00120"></a><span class="lineno">  120</span>&#160;        <span class="keywordflow">case</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#acb0c054138599582d5a5f537e9798806a962074a9de1cf3d6d7b6f955a0a94820">ProfilingState::Uninitialised</a>:</div><div class="line"><a name="l00121"></a><span class="lineno">  121</span>&#160;        <span class="keywordflow">case</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#acb0c054138599582d5a5f537e9798806a4075072d219e061ca0f3124f8fbef463">ProfilingState::NotConnected</a>:</div><div class="line"><a name="l00122"></a><span class="lineno">  122</span>&#160;</div><div class="line"><a name="l00123"></a><span class="lineno">  123</span>&#160;            <span class="comment">// The send thread cannot be running when the profiling service is uninitialized or not connected,</span></div><div class="line"><a name="l00124"></a><span class="lineno">  124</span>&#160;            <span class="comment">// stop the thread immediately</span></div><div class="line"><a name="l00125"></a><span class="lineno">  125</span>&#160;            m_KeepRunning.store(<span class="keyword">false</span>);</div><div class="line"><a name="l00126"></a><span class="lineno">  126</span>&#160;            m_IsRunning.store(<span class="keyword">false</span>);</div><div class="line"><a name="l00127"></a><span class="lineno">  127</span>&#160;</div><div class="line"><a name="l00128"></a><span class="lineno">  128</span>&#160;            <span class="comment">// An exception should be thrown here, save it to be rethrown later from the main thread so that</span></div><div class="line"><a name="l00129"></a><span class="lineno">  129</span>&#160;            <span class="comment">// it can be caught by the consumer</span></div><div class="line"><a name="l00130"></a><span class="lineno">  130</span>&#160;            m_SendThreadException =</div><div class="line"><a name="l00131"></a><span class="lineno">  131</span>&#160;                    std::make_exception_ptr(<a class="code" href="classarmnn_1_1_runtime_exception.xhtml">RuntimeException</a>(<span class="stringliteral">&quot;The send thread should not be running with the &quot;</span></div><div class="line"><a name="l00132"></a><span class="lineno">  132</span>&#160;                                                             <span class="stringliteral">&quot;profiling service not yet initialized or connected&quot;</span>));</div><div class="line"><a name="l00133"></a><span class="lineno">  133</span>&#160;</div><div class="line"><a name="l00134"></a><span class="lineno">  134</span>&#160;            <span class="keywordflow">return</span>;</div><div class="line"><a name="l00135"></a><span class="lineno">  135</span>&#160;        <span class="keywordflow">case</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#acb0c054138599582d5a5f537e9798806a1dc1edc76d5b3c0325f00002f4c841f5">ProfilingState::WaitingForAck</a>:</div><div class="line"><a name="l00136"></a><span class="lineno">  136</span>&#160;</div><div class="line"><a name="l00137"></a><span class="lineno">  137</span>&#160;            <span class="comment">// Send out a StreamMetadata packet and wait for the profiling connection to be acknowledged.</span></div><div class="line"><a name="l00138"></a><span class="lineno">  138</span>&#160;            <span class="comment">// When a ConnectionAcknowledged packet is received, the profiling service state will be automatically</span></div><div class="line"><a name="l00139"></a><span class="lineno">  139</span>&#160;            <span class="comment">// updated by the command handler</span></div><div class="line"><a name="l00140"></a><span class="lineno">  140</span>&#160;</div><div class="line"><a name="l00141"></a><span class="lineno">  141</span>&#160;            <span class="comment">// Prepare a StreamMetadata packet and write it to the Counter Stream buffer</span></div><div class="line"><a name="l00142"></a><span class="lineno">  142</span>&#160;            m_SendCounterPacket.<a class="code" href="classarmnn_1_1profiling_1_1_i_send_counter_packet.xhtml#a14e9efe48e3d4ed05396f8a856bfaeea">SendStreamMetaDataPacket</a>();</div><div class="line"><a name="l00143"></a><span class="lineno">  143</span>&#160;</div><div class="line"><a name="l00144"></a><span class="lineno">  144</span>&#160;             <span class="comment">// Flush the buffer manually to send the packet</span></div><div class="line"><a name="l00145"></a><span class="lineno">  145</span>&#160;            FlushBuffer(profilingConnection);</div><div class="line"><a name="l00146"></a><span class="lineno">  146</span>&#160;</div><div class="line"><a name="l00147"></a><span class="lineno">  147</span>&#160;            <span class="comment">// Wait for a connection ack from the remote server. We should expect a response within timeout value.</span></div><div class="line"><a name="l00148"></a><span class="lineno">  148</span>&#160;            <span class="comment">// If not, drop back to the start of the loop and detect somebody closing the thread. Then send the</span></div><div class="line"><a name="l00149"></a><span class="lineno">  149</span>&#160;            <span class="comment">// StreamMetadata again.</span></div><div class="line"><a name="l00150"></a><span class="lineno">  150</span>&#160;</div><div class="line"><a name="l00151"></a><span class="lineno">  151</span>&#160;            <span class="comment">// Wait condition lock scope - Begin</span></div><div class="line"><a name="l00152"></a><span class="lineno">  152</span>&#160;            {</div><div class="line"><a name="l00153"></a><span class="lineno">  153</span>&#160;                std::unique_lock&lt;std::mutex&gt; lock(m_WaitMutex);</div><div class="line"><a name="l00154"></a><span class="lineno">  154</span>&#160;</div><div class="line"><a name="l00155"></a><span class="lineno">  155</span>&#160;                <span class="keywordtype">bool</span> timeout = m_WaitCondition.wait_for(lock,</div><div class="line"><a name="l00156"></a><span class="lineno">  156</span>&#160;                                                        std::chrono::milliseconds(std::max(m_Timeout, 1000)),</div><div class="line"><a name="l00157"></a><span class="lineno">  157</span>&#160;                                                        [&amp;]{ <span class="keywordflow">return</span> m_ReadyToRead; });</div><div class="line"><a name="l00158"></a><span class="lineno">  158</span>&#160;                <span class="comment">// If we get notified we need to flush the buffer again</span></div><div class="line"><a name="l00159"></a><span class="lineno">  159</span>&#160;                <span class="keywordflow">if</span>(timeout)</div><div class="line"><a name="l00160"></a><span class="lineno">  160</span>&#160;                {</div><div class="line"><a name="l00161"></a><span class="lineno">  161</span>&#160;                    <span class="comment">// Otherwise if we just timed out don&#39;t flush the buffer</span></div><div class="line"><a name="l00162"></a><span class="lineno">  162</span>&#160;                    <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00163"></a><span class="lineno">  163</span>&#160;                }</div><div class="line"><a name="l00164"></a><span class="lineno">  164</span>&#160;                <span class="comment">//reset condition variable predicate for next use</span></div><div class="line"><a name="l00165"></a><span class="lineno">  165</span>&#160;                m_ReadyToRead = <span class="keyword">false</span>;</div><div class="line"><a name="l00166"></a><span class="lineno">  166</span>&#160;            }</div><div class="line"><a name="l00167"></a><span class="lineno">  167</span>&#160;            <span class="comment">// Wait condition lock scope - End</span></div><div class="line"><a name="l00168"></a><span class="lineno">  168</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l00169"></a><span class="lineno">  169</span>&#160;        <span class="keywordflow">case</span> <a class="code" href="namespacearmnn_1_1profiling.xhtml#acb0c054138599582d5a5f537e9798806a4d3d769b812b6faa6b76e1a8abaece2d">ProfilingState::Active</a>:</div><div class="line"><a name="l00170"></a><span class="lineno">  170</span>&#160;        <span class="keywordflow">default</span>:</div><div class="line"><a name="l00171"></a><span class="lineno">  171</span>&#160;            <span class="comment">// Wait condition lock scope - Begin</span></div><div class="line"><a name="l00172"></a><span class="lineno">  172</span>&#160;            {</div><div class="line"><a name="l00173"></a><span class="lineno">  173</span>&#160;                std::unique_lock&lt;std::mutex&gt; lock(m_WaitMutex);</div><div class="line"><a name="l00174"></a><span class="lineno">  174</span>&#160;</div><div class="line"><a name="l00175"></a><span class="lineno">  175</span>&#160;                <span class="comment">// Normal working state for the send thread</span></div><div class="line"><a name="l00176"></a><span class="lineno">  176</span>&#160;                <span class="comment">// Check if the send thread is required to enforce a timeout wait policy</span></div><div class="line"><a name="l00177"></a><span class="lineno">  177</span>&#160;                <span class="keywordflow">if</span> (m_Timeout &lt; 0)</div><div class="line"><a name="l00178"></a><span class="lineno">  178</span>&#160;                {</div><div class="line"><a name="l00179"></a><span class="lineno">  179</span>&#160;                    <span class="comment">// Wait indefinitely until notified that something to read has become available in the buffer</span></div><div class="line"><a name="l00180"></a><span class="lineno">  180</span>&#160;                    m_WaitCondition.wait(lock, [&amp;] { <span class="keywordflow">return</span> m_ReadyToRead; });</div><div class="line"><a name="l00181"></a><span class="lineno">  181</span>&#160;                }</div><div class="line"><a name="l00182"></a><span class="lineno">  182</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l00183"></a><span class="lineno">  183</span>&#160;                {</div><div class="line"><a name="l00184"></a><span class="lineno">  184</span>&#160;                    <span class="comment">// Wait until the thread is notified of something to read from the buffer,</span></div><div class="line"><a name="l00185"></a><span class="lineno">  185</span>&#160;                    <span class="comment">// or check anyway after the specified number of milliseconds</span></div><div class="line"><a name="l00186"></a><span class="lineno">  186</span>&#160;                    m_WaitCondition.wait_for(lock, std::chrono::milliseconds(m_Timeout), [&amp;] { <span class="keywordflow">return</span> m_ReadyToRead; });</div><div class="line"><a name="l00187"></a><span class="lineno">  187</span>&#160;                }</div><div class="line"><a name="l00188"></a><span class="lineno">  188</span>&#160;</div><div class="line"><a name="l00189"></a><span class="lineno">  189</span>&#160;                <span class="comment">//reset condition variable predicate for next use</span></div><div class="line"><a name="l00190"></a><span class="lineno">  190</span>&#160;                m_ReadyToRead = <span class="keyword">false</span>;</div><div class="line"><a name="l00191"></a><span class="lineno">  191</span>&#160;            }</div><div class="line"><a name="l00192"></a><span class="lineno">  192</span>&#160;            <span class="comment">// Wait condition lock scope - End</span></div><div class="line"><a name="l00193"></a><span class="lineno">  193</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l00194"></a><span class="lineno">  194</span>&#160;        }</div><div class="line"><a name="l00195"></a><span class="lineno">  195</span>&#160;</div><div class="line"><a name="l00196"></a><span class="lineno">  196</span>&#160;        <span class="comment">// Send all the available packets in the buffer</span></div><div class="line"><a name="l00197"></a><span class="lineno">  197</span>&#160;        FlushBuffer(profilingConnection);</div><div class="line"><a name="l00198"></a><span class="lineno">  198</span>&#160;    } <span class="keywordflow">while</span> (m_KeepRunning.load());</div><div class="line"><a name="l00199"></a><span class="lineno">  199</span>&#160;</div><div class="line"><a name="l00200"></a><span class="lineno">  200</span>&#160;    <span class="comment">// Ensure that all readable data got written to the profiling connection before the thread is stopped</span></div><div class="line"><a name="l00201"></a><span class="lineno">  201</span>&#160;    <span class="comment">// (do not notify any watcher in this case, as this is just to wrap up things before shutting down the send thread)</span></div><div class="line"><a name="l00202"></a><span class="lineno">  202</span>&#160;    FlushBuffer(profilingConnection, <span class="keyword">false</span>);</div><div class="line"><a name="l00203"></a><span class="lineno">  203</span>&#160;</div><div class="line"><a name="l00204"></a><span class="lineno">  204</span>&#160;    <span class="comment">// Mark the send thread as not running</span></div><div class="line"><a name="l00205"></a><span class="lineno">  205</span>&#160;    m_IsRunning.store(<span class="keyword">false</span>);</div><div class="line"><a name="l00206"></a><span class="lineno">  206</span>&#160;}</div><div class="line"><a name="l00207"></a><span class="lineno">  207</span>&#160;</div><div class="line"><a name="l00208"></a><span class="lineno">  208</span>&#160;<span class="keywordtype">void</span> SendThread::FlushBuffer(<a class="code" href="classarmnn_1_1profiling_1_1_i_profiling_connection.xhtml">IProfilingConnection</a>&amp; profilingConnection, <span class="keywordtype">bool</span> notifyWatchers)</div><div class="line"><a name="l00209"></a><span class="lineno">  209</span>&#160;{</div><div class="line"><a name="l00210"></a><span class="lineno">  210</span>&#160;    <span class="comment">// Get the first available readable buffer</span></div><div class="line"><a name="l00211"></a><span class="lineno">  211</span>&#160;    <a class="code" href="namespacearmnn_1_1profiling.xhtml#a14328d977cec3abadcfd5935f04f3409">IPacketBufferPtr</a> packetBuffer = m_BufferManager.<a class="code" href="classarmnn_1_1profiling_1_1_i_buffer_manager.xhtml#acc2e97eddda6324261ba202634cc8ef8">GetReadableBuffer</a>();</div><div class="line"><a name="l00212"></a><span class="lineno">  212</span>&#160;</div><div class="line"><a name="l00213"></a><span class="lineno">  213</span>&#160;    <span class="comment">// Initialize the flag that indicates whether at least a packet has been sent</span></div><div class="line"><a name="l00214"></a><span class="lineno">  214</span>&#160;    <span class="keywordtype">bool</span> packetsSent = <span class="keyword">false</span>;</div><div class="line"><a name="l00215"></a><span class="lineno">  215</span>&#160;</div><div class="line"><a name="l00216"></a><span class="lineno">  216</span>&#160;    <span class="keywordflow">while</span> (packetBuffer != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00217"></a><span class="lineno">  217</span>&#160;    {</div><div class="line"><a name="l00218"></a><span class="lineno">  218</span>&#160;        <span class="comment">// Get the data to send from the buffer</span></div><div class="line"><a name="l00219"></a><span class="lineno">  219</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>* readBuffer = packetBuffer-&gt;GetReadableData();</div><div class="line"><a name="l00220"></a><span class="lineno">  220</span>&#160;        <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> readBufferSize = packetBuffer-&gt;GetSize();</div><div class="line"><a name="l00221"></a><span class="lineno">  221</span>&#160;</div><div class="line"><a name="l00222"></a><span class="lineno">  222</span>&#160;        <span class="keywordflow">if</span> (readBuffer == <span class="keyword">nullptr</span> || readBufferSize == 0)</div><div class="line"><a name="l00223"></a><span class="lineno">  223</span>&#160;        {</div><div class="line"><a name="l00224"></a><span class="lineno">  224</span>&#160;            <span class="comment">// Nothing to send, get the next available readable buffer and continue</span></div><div class="line"><a name="l00225"></a><span class="lineno">  225</span>&#160;            m_BufferManager.<a class="code" href="classarmnn_1_1profiling_1_1_i_buffer_manager.xhtml#a033cae4e6d00fc1958f79f09216a3437">MarkRead</a>(packetBuffer);</div><div class="line"><a name="l00226"></a><span class="lineno">  226</span>&#160;            packetBuffer = m_BufferManager.<a class="code" href="classarmnn_1_1profiling_1_1_i_buffer_manager.xhtml#acc2e97eddda6324261ba202634cc8ef8">GetReadableBuffer</a>();</div><div class="line"><a name="l00227"></a><span class="lineno">  227</span>&#160;</div><div class="line"><a name="l00228"></a><span class="lineno">  228</span>&#160;            <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00229"></a><span class="lineno">  229</span>&#160;        }</div><div class="line"><a name="l00230"></a><span class="lineno">  230</span>&#160;</div><div class="line"><a name="l00231"></a><span class="lineno">  231</span>&#160;        <span class="comment">// Check that the profiling connection is open, silently drop the data and continue if it&#39;s closed</span></div><div class="line"><a name="l00232"></a><span class="lineno">  232</span>&#160;        <span class="keywordflow">if</span> (profilingConnection.<a class="code" href="classarmnn_1_1profiling_1_1_i_profiling_connection.xhtml#a8a3511046982c64efa3e3833d749e5ef">IsOpen</a>())</div><div class="line"><a name="l00233"></a><span class="lineno">  233</span>&#160;        {</div><div class="line"><a name="l00234"></a><span class="lineno">  234</span>&#160;            <span class="comment">// Write a packet to the profiling connection. Silently ignore any write error and continue</span></div><div class="line"><a name="l00235"></a><span class="lineno">  235</span>&#160;            profilingConnection.<a class="code" href="classarmnn_1_1profiling_1_1_i_profiling_connection.xhtml#ac78c6bd1a545934a805c88194214b09d">WritePacket</a>(readBuffer, armnn::numeric_cast&lt;uint32_t&gt;(readBufferSize));</div><div class="line"><a name="l00236"></a><span class="lineno">  236</span>&#160;</div><div class="line"><a name="l00237"></a><span class="lineno">  237</span>&#160;            <span class="comment">// Set the flag that indicates whether at least a packet has been sent</span></div><div class="line"><a name="l00238"></a><span class="lineno">  238</span>&#160;            packetsSent = <span class="keyword">true</span>;</div><div class="line"><a name="l00239"></a><span class="lineno">  239</span>&#160;        }</div><div class="line"><a name="l00240"></a><span class="lineno">  240</span>&#160;</div><div class="line"><a name="l00241"></a><span class="lineno">  241</span>&#160;        <span class="comment">// Mark the packet buffer as read</span></div><div class="line"><a name="l00242"></a><span class="lineno">  242</span>&#160;        m_BufferManager.<a class="code" href="classarmnn_1_1profiling_1_1_i_buffer_manager.xhtml#a033cae4e6d00fc1958f79f09216a3437">MarkRead</a>(packetBuffer);</div><div class="line"><a name="l00243"></a><span class="lineno">  243</span>&#160;</div><div class="line"><a name="l00244"></a><span class="lineno">  244</span>&#160;        <span class="comment">// Get the next available readable buffer</span></div><div class="line"><a name="l00245"></a><span class="lineno">  245</span>&#160;        packetBuffer = m_BufferManager.<a class="code" href="classarmnn_1_1profiling_1_1_i_buffer_manager.xhtml#acc2e97eddda6324261ba202634cc8ef8">GetReadableBuffer</a>();</div><div class="line"><a name="l00246"></a><span class="lineno">  246</span>&#160;    }</div><div class="line"><a name="l00247"></a><span class="lineno">  247</span>&#160;    <span class="comment">// Check whether at least a packet has been sent</span></div><div class="line"><a name="l00248"></a><span class="lineno">  248</span>&#160;    <span class="keywordflow">if</span> (packetsSent &amp;&amp; notifyWatchers)</div><div class="line"><a name="l00249"></a><span class="lineno">  249</span>&#160;    {</div><div class="line"><a name="l00250"></a><span class="lineno">  250</span>&#160;        <span class="comment">// Wait for the parent thread to release its mutex if necessary</span></div><div class="line"><a name="l00251"></a><span class="lineno">  251</span>&#160;        {</div><div class="line"><a name="l00252"></a><span class="lineno">  252</span>&#160;            std::lock_guard&lt;std::mutex&gt; lck(m_PacketSentWaitMutex);</div><div class="line"><a name="l00253"></a><span class="lineno">  253</span>&#160;            m_PacketSent = <span class="keyword">true</span>;</div><div class="line"><a name="l00254"></a><span class="lineno">  254</span>&#160;        }</div><div class="line"><a name="l00255"></a><span class="lineno">  255</span>&#160;        <span class="comment">// Notify to any watcher that something has been sent</span></div><div class="line"><a name="l00256"></a><span class="lineno">  256</span>&#160;        m_PacketSentWaitCondition.notify_one();</div><div class="line"><a name="l00257"></a><span class="lineno">  257</span>&#160;    }</div><div class="line"><a name="l00258"></a><span class="lineno">  258</span>&#160;}</div><div class="line"><a name="l00259"></a><span class="lineno">  259</span>&#160;</div><div class="line"><a name="l00260"></a><span class="lineno"><a class="line" href="classarmnn_1_1profiling_1_1_send_thread.xhtml#aca1be8cb336582dbbdc9dae32475cfea">  260</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classarmnn_1_1profiling_1_1_send_thread.xhtml#aca1be8cb336582dbbdc9dae32475cfea">SendThread::WaitForPacketSent</a>(uint32_t timeout = 1000)</div><div class="line"><a name="l00261"></a><span class="lineno">  261</span>&#160;{</div><div class="line"><a name="l00262"></a><span class="lineno">  262</span>&#160;    std::unique_lock&lt;std::mutex&gt; lock(m_PacketSentWaitMutex);</div><div class="line"><a name="l00263"></a><span class="lineno">  263</span>&#160;    <span class="comment">// Blocks until notified that at least a packet has been sent or until timeout expires.</span></div><div class="line"><a name="l00264"></a><span class="lineno">  264</span>&#160;    <span class="keywordtype">bool</span> timedOut = m_PacketSentWaitCondition.wait_for(lock,</div><div class="line"><a name="l00265"></a><span class="lineno">  265</span>&#160;                                                       std::chrono::milliseconds(timeout),</div><div class="line"><a name="l00266"></a><span class="lineno">  266</span>&#160;                                                       [&amp;] { <span class="keywordflow">return</span> m_PacketSent; });</div><div class="line"><a name="l00267"></a><span class="lineno">  267</span>&#160;</div><div class="line"><a name="l00268"></a><span class="lineno">  268</span>&#160;    m_PacketSent = <span class="keyword">false</span>;</div><div class="line"><a name="l00269"></a><span class="lineno">  269</span>&#160;</div><div class="line"><a name="l00270"></a><span class="lineno">  270</span>&#160;    <span class="keywordflow">return</span> timedOut;</div><div class="line"><a name="l00271"></a><span class="lineno">  271</span>&#160;}</div><div class="line"><a name="l00272"></a><span class="lineno">  272</span>&#160;</div><div class="line"><a name="l00273"></a><span class="lineno">  273</span>&#160;} <span class="comment">// namespace profiling</span></div><div class="line"><a name="l00274"></a><span class="lineno">  274</span>&#160;</div><div class="line"><a name="l00275"></a><span class="lineno">  275</span>&#160;} <span class="comment">// namespace armnn</span></div><div class="ttc" id="classarmnn_1_1profiling_1_1_profiling_state_machine_xhtml_ad8d263669817cf577760710ff6c96bb9"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_profiling_state_machine.xhtml#ad8d263669817cf577760710ff6c96bb9">armnn::profiling::ProfilingStateMachine::GetCurrentState</a></div><div class="ttdeci">ProfilingState GetCurrentState() const</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_state_machine_8cpp_source.xhtml#l00031">ProfilingStateMachine.cpp:31</a></div></div>
<div class="ttc" id="classarmnn_1_1profiling_1_1_profiling_state_machine_xhtml"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_profiling_state_machine.xhtml">armnn::profiling::ProfilingStateMachine</a></div><div class="ttdef"><b>Definition:</b> <a href="_profiling_state_machine_8hpp_source.xhtml#l00026">ProfilingStateMachine.hpp:26</a></div></div>
<div class="ttc" id="classarmnn_1_1profiling_1_1_i_buffer_manager_xhtml_acc2e97eddda6324261ba202634cc8ef8"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_i_buffer_manager.xhtml#acc2e97eddda6324261ba202634cc8ef8">armnn::profiling::IBufferManager::GetReadableBuffer</a></div><div class="ttdeci">virtual IPacketBufferPtr GetReadableBuffer()=0</div></div>
<div class="ttc" id="_cl_layer_tests_8cpp_xhtml_a2289f9e7fac0ce47801448e873b04303"><div class="ttname"><a href="_cl_layer_tests_8cpp.xhtml#a2289f9e7fac0ce47801448e873b04303">false</a></div><div class="ttdeci">DataLayout::NCHW false</div><div class="ttdef"><b>Definition:</b> <a href="_cl_layer_tests_8cpp_source.xhtml#l00135">ClLayerTests.cpp:135</a></div></div>
<div class="ttc" id="_send_thread_8hpp_xhtml"><div class="ttname"><a href="_send_thread_8hpp.xhtml">SendThread.hpp</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml"><div class="ttname"><a href="namespacearmnn.xhtml">armnn</a></div><div class="ttdoc">Copyright (c) 2021 ARM Limited and Contributors. </div><div class="ttdef"><b>Definition:</b> <a href="01__00__software__tools_8dox_source.xhtml#l00006">01_00_software_tools.dox:6</a></div></div>
<div class="ttc" id="_processes_8hpp_xhtml"><div class="ttname"><a href="_processes_8hpp.xhtml">Processes.hpp</a></div></div>
<div class="ttc" id="classarmnn_1_1profiling_1_1_i_buffer_manager_xhtml_a033cae4e6d00fc1958f79f09216a3437"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_i_buffer_manager.xhtml#a033cae4e6d00fc1958f79f09216a3437">armnn::profiling::IBufferManager::MarkRead</a></div><div class="ttdeci">virtual void MarkRead(IPacketBufferPtr &amp;packetBuffer)=0</div></div>
<div class="ttc" id="_numeric_cast_8hpp_xhtml"><div class="ttname"><a href="_numeric_cast_8hpp.xhtml">NumericCast.hpp</a></div></div>
<div class="ttc" id="classarmnn_1_1profiling_1_1_send_thread_xhtml_aca1be8cb336582dbbdc9dae32475cfea"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_send_thread.xhtml#aca1be8cb336582dbbdc9dae32475cfea">armnn::profiling::SendThread::WaitForPacketSent</a></div><div class="ttdeci">bool WaitForPacketSent(uint32_t timeout)</div><div class="ttdef"><b>Definition:</b> <a href="_send_thread_8cpp_source.xhtml#l00260">SendThread.cpp:260</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_acb0c054138599582d5a5f537e9798806a4075072d219e061ca0f3124f8fbef463"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#acb0c054138599582d5a5f537e9798806a4075072d219e061ca0f3124f8fbef463">armnn::profiling::ProfilingState::NotConnected</a></div></div>
<div class="ttc" id="classarmnn_1_1profiling_1_1_send_thread_xhtml_ad02c2666a109b2b56624295ffae06d6e"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_send_thread.xhtml#ad02c2666a109b2b56624295ffae06d6e">armnn::profiling::SendThread::SendThread</a></div><div class="ttdeci">SendThread(ProfilingStateMachine &amp;profilingStateMachine, IBufferManager &amp;buffer, ISendCounterPacket &amp;sendCounterPacket, int timeout=1000)</div><div class="ttdef"><b>Definition:</b> <a href="_send_thread_8cpp_source.xhtml#l00023">SendThread.cpp:23</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_acb0c054138599582d5a5f537e9798806a4d3d769b812b6faa6b76e1a8abaece2d"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#acb0c054138599582d5a5f537e9798806a4d3d769b812b6faa6b76e1a8abaece2d">armnn::profiling::ProfilingState::Active</a></div></div>
<div class="ttc" id="classarmnn_1_1_runtime_exception_xhtml"><div class="ttname"><a href="classarmnn_1_1_runtime_exception.xhtml">armnn::RuntimeException</a></div><div class="ttdef"><b>Definition:</b> <a href="_exceptions_8hpp_source.xhtml#l00120">Exceptions.hpp:120</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_acb0c054138599582d5a5f537e9798806a1dc1edc76d5b3c0325f00002f4c841f5"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#acb0c054138599582d5a5f537e9798806a1dc1edc76d5b3c0325f00002f4c841f5">armnn::profiling::ProfilingState::WaitingForAck</a></div></div>
<div class="ttc" id="classarmnn_1_1profiling_1_1_i_send_counter_packet_xhtml"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_i_send_counter_packet.xhtml">armnn::profiling::ISendCounterPacket</a></div><div class="ttdef"><b>Definition:</b> <a href="_i_send_counter_packet_8hpp_source.xhtml#l00017">ISendCounterPacket.hpp:17</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_acb0c054138599582d5a5f537e9798806a962074a9de1cf3d6d7b6f955a0a94820"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#acb0c054138599582d5a5f537e9798806a962074a9de1cf3d6d7b6f955a0a94820">armnn::profiling::ProfilingState::Uninitialised</a></div></div>
<div class="ttc" id="classarmnn_1_1profiling_1_1_send_thread_xhtml_ad2d0b47c9cfacb7abdb524878b07c9a7"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_send_thread.xhtml#ad2d0b47c9cfacb7abdb524878b07c9a7">armnn::profiling::SendThread::SetReadyToRead</a></div><div class="ttdeci">void SetReadyToRead() override</div><div class="ttdoc">Set a &quot;ready to read&quot; flag in the buffer to notify the reading thread to start reading it...</div><div class="ttdef"><b>Definition:</b> <a href="_send_thread_8cpp_source.xhtml#l00038">SendThread.cpp:38</a></div></div>
<div class="ttc" id="classarmnn_1_1profiling_1_1_i_profiling_connection_xhtml"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_i_profiling_connection.xhtml">armnn::profiling::IProfilingConnection</a></div><div class="ttdef"><b>Definition:</b> <a href="_i_profiling_connection_8hpp_source.xhtml#l00020">IProfilingConnection.hpp:20</a></div></div>
<div class="ttc" id="_exceptions_8hpp_xhtml"><div class="ttname"><a href="_exceptions_8hpp.xhtml">Exceptions.hpp</a></div></div>
<div class="ttc" id="classarmnn_1_1profiling_1_1_i_send_counter_packet_xhtml_a14e9efe48e3d4ed05396f8a856bfaeea"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_i_send_counter_packet.xhtml#a14e9efe48e3d4ed05396f8a856bfaeea">armnn::profiling::ISendCounterPacket::SendStreamMetaDataPacket</a></div><div class="ttdeci">virtual void SendStreamMetaDataPacket()=0</div><div class="ttdoc">Create and write a StreamMetaDataPacket in the buffer. </div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_acb0c054138599582d5a5f537e9798806"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#acb0c054138599582d5a5f537e9798806">armnn::profiling::ProfilingState</a></div><div class="ttdeci">ProfilingState</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_state_machine_8hpp_source.xhtml#l00018">ProfilingStateMachine.hpp:18</a></div></div>
<div class="ttc" id="classarmnn_1_1profiling_1_1_i_buffer_manager_xhtml"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_i_buffer_manager.xhtml">armnn::profiling::IBufferManager</a></div><div class="ttdef"><b>Definition:</b> <a href="_i_buffer_manager_8hpp_source.xhtml#l00021">IBufferManager.hpp:21</a></div></div>
<div class="ttc" id="classarmnn_1_1profiling_1_1_i_buffer_manager_xhtml_a2d5f60e55b59ae8667ff593b5bfc5deb"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_i_buffer_manager.xhtml#a2d5f60e55b59ae8667ff593b5bfc5deb">armnn::profiling::IBufferManager::SetConsumer</a></div><div class="ttdeci">virtual void SetConsumer(IConsumer *consumer)=0</div></div>
<div class="ttc" id="classarmnn_1_1profiling_1_1_i_profiling_connection_xhtml_a8a3511046982c64efa3e3833d749e5ef"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_i_profiling_connection.xhtml#a8a3511046982c64efa3e3833d749e5ef">armnn::profiling::IProfilingConnection::IsOpen</a></div><div class="ttdeci">virtual bool IsOpen() const =0</div></div>
<div class="ttc" id="_conversion_8hpp_xhtml"><div class="ttname"><a href="_conversion_8hpp.xhtml">Conversion.hpp</a></div></div>
<div class="ttc" id="classarmnn_1_1profiling_1_1_send_thread_xhtml_a32e1e5f33658343e4a480d37329cff38"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_send_thread.xhtml#a32e1e5f33658343e4a480d37329cff38">armnn::profiling::SendThread::Stop</a></div><div class="ttdeci">void Stop(bool rethrowSendThreadExceptions=true) override</div><div class="ttdoc">Stop the thread. </div><div class="ttdef"><b>Definition:</b> <a href="_send_thread_8cpp_source.xhtml#l00079">SendThread.cpp:79</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_a14328d977cec3abadcfd5935f04f3409"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#a14328d977cec3abadcfd5935f04f3409">armnn::profiling::IPacketBufferPtr</a></div><div class="ttdeci">std::unique_ptr&lt; IPacketBuffer &gt; IPacketBufferPtr</div><div class="ttdef"><b>Definition:</b> <a href="_i_packet_buffer_8hpp_source.xhtml#l00044">IPacketBuffer.hpp:44</a></div></div>
<div class="ttc" id="classarmnn_1_1profiling_1_1_send_thread_xhtml_a160847691cc1341520cf16c11c1ec724"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_send_thread.xhtml#a160847691cc1341520cf16c11c1ec724">armnn::profiling::SendThread::Start</a></div><div class="ttdeci">void Start(IProfilingConnection &amp;profilingConnection) override</div><div class="ttdoc">Start the thread. </div><div class="ttdef"><b>Definition:</b> <a href="_send_thread_8cpp_source.xhtml#l00049">SendThread.cpp:49</a></div></div>
<div class="ttc" id="classarmnn_1_1profiling_1_1_i_profiling_connection_xhtml_ac78c6bd1a545934a805c88194214b09d"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_i_profiling_connection.xhtml#ac78c6bd1a545934a805c88194214b09d">armnn::profiling::IProfilingConnection::WritePacket</a></div><div class="ttdeci">virtual bool WritePacket(const unsigned char *buffer, uint32_t length)=0</div></div>
<div class="ttc" id="_profiling_utils_8hpp_xhtml"><div class="ttname"><a href="_profiling_utils_8hpp.xhtml">ProfilingUtils.hpp</a></div></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
  <ul>
    <li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.xhtml">src</a></li><li class="navelem"><a class="el" href="dir_637c692f14729569dd2eac0c18e2a54a.xhtml">profiling</a></li><li class="navelem"><a class="el" href="_send_thread_8cpp.xhtml">SendThread.cpp</a></li>
    <li class="footer">Generated on Fri Mar 19 2021 15:26:04 for ArmNN by
    <a href="http://www.doxygen.org/index.html">
    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
  </ul>
</div>
</body>
</html>