| <!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.6"/> |
| <title>Impala: impala::SpinLock Class Reference</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="navtree.js"></script> |
| <script type="text/javascript"> |
| $(document).ready(initResizable); |
| $(window).load(resizeHeight); |
| </script> |
| <link href="search/search.css" rel="stylesheet" type="text/css"/> |
| <script type="text/javascript" src="search/search.js"></script> |
| <script type="text/javascript"> |
| $(document).ready(function() { searchBox.OnSelectItem(0); }); |
| </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 style="padding-left: 0.5em;"> |
| <div id="projectname">Impala |
| </div> |
| <div id="projectbrief">Impalaistheopensource,nativeanalyticdatabaseforApacheHadoop.</div> |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| </div> |
| <!-- end header part --> |
| <!-- Generated by Doxygen 1.8.6 --> |
| <script type="text/javascript"> |
| var searchBox = new SearchBox("searchBox", "search",false,'Search'); |
| </script> |
| <div id="navrow1" class="tabs"> |
| <ul class="tablist"> |
| <li><a href="index.html"><span>Main Page</span></a></li> |
| <li><a href="namespaces.html"><span>Namespaces</span></a></li> |
| <li class="current"><a href="annotated.html"><span>Classes</span></a></li> |
| <li><a href="files.html"><span>Files</span></a></li> |
| <li> |
| <div id="MSearchBox" class="MSearchBoxInactive"> |
| <span class="left"> |
| <img id="MSearchSelect" src="search/mag_sel.png" |
| onmouseover="return searchBox.OnSearchSelectShow()" |
| onmouseout="return searchBox.OnSearchSelectHide()" |
| alt=""/> |
| <input type="text" id="MSearchField" value="Search" accesskey="S" |
| onfocus="searchBox.OnSearchFieldFocus(true)" |
| onblur="searchBox.OnSearchFieldFocus(false)" |
| onkeyup="searchBox.OnSearchFieldChange(event)"/> |
| </span><span class="right"> |
| <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a> |
| </span> |
| </div> |
| </li> |
| </ul> |
| </div> |
| <div id="navrow2" class="tabs2"> |
| <ul class="tablist"> |
| <li><a href="annotated.html"><span>Class List</span></a></li> |
| <li><a href="classes.html"><span>Class Index</span></a></li> |
| <li><a href="inherits.html"><span>Class Hierarchy</span></a></li> |
| <li><a href="functions.html"><span>Class Members</span></a></li> |
| </ul> |
| </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('classimpala_1_1SpinLock.html','');}); |
| </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)"> |
| <a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark"> </span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark"> </span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark"> </span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark"> </span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark"> </span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(8)"><span class="SelectionMark"> </span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(9)"><span class="SelectionMark"> </span>Friends</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(10)"><span class="SelectionMark"> </span>Macros</a></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="summary"> |
| <a href="#pub-methods">Public Member Functions</a> | |
| <a href="#pri-methods">Private Member Functions</a> | |
| <a href="#pri-attribs">Private Attributes</a> | |
| <a href="#pri-static-attribs">Static Private Attributes</a> | |
| <a href="classimpala_1_1SpinLock-members.html">List of all members</a> </div> |
| <div class="headertitle"> |
| <div class="title">impala::SpinLock Class Reference</div> </div> |
| </div><!--header--> |
| <div class="contents"> |
| |
| <p>Lightweight spinlock. |
| <a href="classimpala_1_1SpinLock.html#details">More...</a></p> |
| |
| <p><code>#include <<a class="el" href="spinlock_8h_source.html">spinlock.h</a>></code></p> |
| <div class="dynheader"> |
| Collaboration diagram for impala::SpinLock:</div> |
| <div class="dyncontent"> |
| <div class="center"><iframe scrolling="no" frameborder="0" src="classimpala_1_1SpinLock__coll__graph.svg" width="230" height="304"><p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p></iframe></div> |
| </div> |
| <table class="memberdecls"> |
| <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a> |
| Public Member Functions</h2></td></tr> |
| <tr class="memitem:afa0ac276aacd3f7d77c7b50b2428c22b"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="classimpala_1_1SpinLock.html#afa0ac276aacd3f7d77c7b50b2428c22b">SpinLock</a> ()</td></tr> |
| <tr class="separator:afa0ac276aacd3f7d77c7b50b2428c22b"><td class="memSeparator" colspan="2"> </td></tr> |
| <tr class="memitem:ad65f0b82396ed5c56cd62cddd337569a"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classimpala_1_1SpinLock.html#ad65f0b82396ed5c56cd62cddd337569a">lock</a> ()</td></tr> |
| <tr class="memdesc:ad65f0b82396ed5c56cd62cddd337569a"><td class="mdescLeft"> </td><td class="mdescRight">Acquires the lock, spins until the lock becomes available. <a href="#ad65f0b82396ed5c56cd62cddd337569a">More...</a><br/></td></tr> |
| <tr class="separator:ad65f0b82396ed5c56cd62cddd337569a"><td class="memSeparator" colspan="2"> </td></tr> |
| <tr class="memitem:a009af2b04936652a3ae3969452943ad5"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classimpala_1_1SpinLock.html#a009af2b04936652a3ae3969452943ad5">unlock</a> ()</td></tr> |
| <tr class="separator:a009af2b04936652a3ae3969452943ad5"><td class="memSeparator" colspan="2"> </td></tr> |
| <tr class="memitem:a364661c605091ab15a00e505cbfac67c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classbool.html">bool</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="classimpala_1_1SpinLock.html#a364661c605091ab15a00e505cbfac67c">try_lock</a> ()</td></tr> |
| <tr class="memdesc:a364661c605091ab15a00e505cbfac67c"><td class="mdescLeft"> </td><td class="mdescRight">Tries to acquire the lock. <a href="#a364661c605091ab15a00e505cbfac67c">More...</a><br/></td></tr> |
| <tr class="separator:a364661c605091ab15a00e505cbfac67c"><td class="memSeparator" colspan="2"> </td></tr> |
| <tr class="memitem:ace3db57e5ecd6110b31cd59a21fdeb95"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classimpala_1_1SpinLock.html#ace3db57e5ecd6110b31cd59a21fdeb95">DCheckLocked</a> ()</td></tr> |
| <tr class="separator:ace3db57e5ecd6110b31cd59a21fdeb95"><td class="memSeparator" colspan="2"> </td></tr> |
| </table><table class="memberdecls"> |
| <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pri-methods"></a> |
| Private Member Functions</h2></td></tr> |
| <tr class="memitem:a1a55557709a3a25c85f14959a30d2990"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classimpala_1_1SpinLock.html#a1a55557709a3a25c85f14959a30d2990">SlowAcquire</a> ()</td></tr> |
| <tr class="separator:a1a55557709a3a25c85f14959a30d2990"><td class="memSeparator" colspan="2"> </td></tr> |
| </table><table class="memberdecls"> |
| <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pri-attribs"></a> |
| Private Attributes</h2></td></tr> |
| <tr class="memitem:a1c02b8529e317aa7c0ea821efb154ea9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classbool.html">bool</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="classimpala_1_1SpinLock.html#a1c02b8529e317aa7c0ea821efb154ea9">locked_</a></td></tr> |
| <tr class="memdesc:a1c02b8529e317aa7c0ea821efb154ea9"><td class="mdescLeft"> </td><td class="mdescRight">TODO: pad this to be a cache line? <a href="#a1c02b8529e317aa7c0ea821efb154ea9">More...</a><br/></td></tr> |
| <tr class="separator:a1c02b8529e317aa7c0ea821efb154ea9"><td class="memSeparator" colspan="2"> </td></tr> |
| </table><table class="memberdecls"> |
| <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pri-static-attribs"></a> |
| Static Private Attributes</h2></td></tr> |
| <tr class="memitem:af55a180118b1af36d6f5a2ad37aedef8"><td class="memItemLeft" align="right" valign="top">static const int </td><td class="memItemRight" valign="bottom"><a class="el" href="classimpala_1_1SpinLock.html#af55a180118b1af36d6f5a2ad37aedef8">NUM_SPIN_CYCLES</a> = 70</td></tr> |
| <tr class="separator:af55a180118b1af36d6f5a2ad37aedef8"><td class="memSeparator" colspan="2"> </td></tr> |
| </table> |
| <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2> |
| <div class="textblock"><p>Lightweight spinlock. </p> |
| |
| <p>Definition at line <a class="el" href="spinlock_8h_source.html#l00024">24</a> of file <a class="el" href="spinlock_8h_source.html">spinlock.h</a>.</p> |
| </div><h2 class="groupheader">Constructor & Destructor Documentation</h2> |
| <a class="anchor" id="afa0ac276aacd3f7d77c7b50b2428c22b"></a> |
| <div class="memitem"> |
| <div class="memproto"> |
| <table class="mlabels"> |
| <tr> |
| <td class="mlabels-left"> |
| <table class="memname"> |
| <tr> |
| <td class="memname">impala::SpinLock::SpinLock </td> |
| <td>(</td> |
| <td class="paramname"></td><td>)</td> |
| <td></td> |
| </tr> |
| </table> |
| </td> |
| <td class="mlabels-right"> |
| <span class="mlabels"><span class="mlabel">inline</span></span> </td> |
| </tr> |
| </table> |
| </div><div class="memdoc"> |
| |
| <p>Definition at line <a class="el" href="spinlock_8h_source.html#l00026">26</a> of file <a class="el" href="spinlock_8h_source.html">spinlock.h</a>.</p> |
| |
| </div> |
| </div> |
| <h2 class="groupheader">Member Function Documentation</h2> |
| <a class="anchor" id="ace3db57e5ecd6110b31cd59a21fdeb95"></a> |
| <div class="memitem"> |
| <div class="memproto"> |
| <table class="mlabels"> |
| <tr> |
| <td class="mlabels-left"> |
| <table class="memname"> |
| <tr> |
| <td class="memname">void impala::SpinLock::DCheckLocked </td> |
| <td>(</td> |
| <td class="paramname"></td><td>)</td> |
| <td></td> |
| </tr> |
| </table> |
| </td> |
| <td class="mlabels-right"> |
| <span class="mlabels"><span class="mlabel">inline</span></span> </td> |
| </tr> |
| </table> |
| </div><div class="memdoc"> |
| |
| <p>Definition at line <a class="el" href="spinlock_8h_source.html#l00043">43</a> of file <a class="el" href="spinlock_8h_source.html">spinlock.h</a>.</p> |
| |
| <p>References <a class="el" href="spinlock_8h_source.html#l00067">locked_</a>.</p> |
| |
| <p>Referenced by <a class="el" href="coordinator_8h_source.html#l00173">impala::exec_summary()</a>.</p> |
| |
| </div> |
| </div> |
| <a class="anchor" id="ad65f0b82396ed5c56cd62cddd337569a"></a> |
| <div class="memitem"> |
| <div class="memproto"> |
| <table class="mlabels"> |
| <tr> |
| <td class="mlabels-left"> |
| <table class="memname"> |
| <tr> |
| <td class="memname">void impala::SpinLock::lock </td> |
| <td>(</td> |
| <td class="paramname"></td><td>)</td> |
| <td></td> |
| </tr> |
| </table> |
| </td> |
| <td class="mlabels-right"> |
| <span class="mlabels"><span class="mlabel">inline</span></span> </td> |
| </tr> |
| </table> |
| </div><div class="memdoc"> |
| |
| <p>Acquires the lock, spins until the lock becomes available. </p> |
| |
| <p>Definition at line <a class="el" href="spinlock_8h_source.html#l00029">29</a> of file <a class="el" href="spinlock_8h_source.html">spinlock.h</a>.</p> |
| |
| <p>References <a class="el" href="spinlock_8cc_source.html#l00018">SlowAcquire()</a>, and <a class="el" href="spinlock_8h_source.html#l00041">try_lock()</a>.</p> |
| |
| <p>Referenced by <a class="el" href="streaming-sampler_8h_source.html#l00088">impala::StreamingSampler< int64_t, 64 >::GetSamples()</a>.</p> |
| |
| </div> |
| </div> |
| <a class="anchor" id="a1a55557709a3a25c85f14959a30d2990"></a> |
| <div class="memitem"> |
| <div class="memproto"> |
| <table class="mlabels"> |
| <tr> |
| <td class="mlabels-left"> |
| <table class="memname"> |
| <tr> |
| <td class="memname">void impala::SpinLock::SlowAcquire </td> |
| <td>(</td> |
| <td class="paramname"></td><td>)</td> |
| <td></td> |
| </tr> |
| </table> |
| </td> |
| <td class="mlabels-right"> |
| <span class="mlabels"><span class="mlabel">private</span></span> </td> |
| </tr> |
| </table> |
| </div><div class="memdoc"> |
| <p>Out-of-line definition of the actual spin loop. The primary goal is to have the actual lock method as short as possible to avoid polluting the i-cache with unnecessary instructions in the non-contested case. </p> |
| |
| <p>Definition at line <a class="el" href="spinlock_8cc_source.html#l00018">18</a> of file <a class="el" href="spinlock_8cc_source.html">spinlock.cc</a>.</p> |
| |
| <p>References <a class="el" href="atomic_8h_source.html#l00032">impala::AtomicUtil::CpuWait()</a>, <a class="el" href="spinlock_8h_source.html#l00065">NUM_SPIN_CYCLES</a>, and <a class="el" href="spinlock_8h_source.html#l00041">try_lock()</a>.</p> |
| |
| <p>Referenced by <a class="el" href="spinlock_8h_source.html#l00029">lock()</a>.</p> |
| |
| </div> |
| </div> |
| <a class="anchor" id="a364661c605091ab15a00e505cbfac67c"></a> |
| <div class="memitem"> |
| <div class="memproto"> |
| <table class="mlabels"> |
| <tr> |
| <td class="mlabels-left"> |
| <table class="memname"> |
| <tr> |
| <td class="memname"><a class="el" href="classbool.html">bool</a> impala::SpinLock::try_lock </td> |
| <td>(</td> |
| <td class="paramname"></td><td>)</td> |
| <td></td> |
| </tr> |
| </table> |
| </td> |
| <td class="mlabels-right"> |
| <span class="mlabels"><span class="mlabel">inline</span></span> </td> |
| </tr> |
| </table> |
| </div><div class="memdoc"> |
| |
| <p>Tries to acquire the lock. </p> |
| |
| <p>Definition at line <a class="el" href="spinlock_8h_source.html#l00041">41</a> of file <a class="el" href="spinlock_8h_source.html">spinlock.h</a>.</p> |
| |
| <p>References <a class="el" href="spinlock_8h_source.html#l00067">locked_</a>.</p> |
| |
| <p>Referenced by <a class="el" href="spinlock_8h_source.html#l00029">lock()</a>, and <a class="el" href="spinlock_8cc_source.html#l00018">SlowAcquire()</a>.</p> |
| |
| </div> |
| </div> |
| <a class="anchor" id="a009af2b04936652a3ae3969452943ad5"></a> |
| <div class="memitem"> |
| <div class="memproto"> |
| <table class="mlabels"> |
| <tr> |
| <td class="mlabels-left"> |
| <table class="memname"> |
| <tr> |
| <td class="memname">void impala::SpinLock::unlock </td> |
| <td>(</td> |
| <td class="paramname"></td><td>)</td> |
| <td></td> |
| </tr> |
| </table> |
| </td> |
| <td class="mlabels-right"> |
| <span class="mlabels"><span class="mlabel">inline</span></span> </td> |
| </tr> |
| </table> |
| </div><div class="memdoc"> |
| |
| <p>Definition at line <a class="el" href="spinlock_8h_source.html#l00033">33</a> of file <a class="el" href="spinlock_8h_source.html">spinlock.h</a>.</p> |
| |
| <p>References <a class="el" href="spinlock_8h_source.html#l00067">locked_</a>.</p> |
| |
| <p>Referenced by <a class="el" href="runtime-profile_8cc_source.html#l00507">impala::RuntimeProfile::PrettyPrint()</a>, and <a class="el" href="runtime-profile_8cc_source.html#l00868">impala::RuntimeProfile::TimeSeriesCounter::ToThrift()</a>.</p> |
| |
| </div> |
| </div> |
| <h2 class="groupheader">Member Data Documentation</h2> |
| <a class="anchor" id="a1c02b8529e317aa7c0ea821efb154ea9"></a> |
| <div class="memitem"> |
| <div class="memproto"> |
| <table class="mlabels"> |
| <tr> |
| <td class="mlabels-left"> |
| <table class="memname"> |
| <tr> |
| <td class="memname"><a class="el" href="classbool.html">bool</a> impala::SpinLock::locked_</td> |
| </tr> |
| </table> |
| </td> |
| <td class="mlabels-right"> |
| <span class="mlabels"><span class="mlabel">private</span></span> </td> |
| </tr> |
| </table> |
| </div><div class="memdoc"> |
| |
| <p>TODO: pad this to be a cache line? </p> |
| |
| <p>Definition at line <a class="el" href="spinlock_8h_source.html#l00067">67</a> of file <a class="el" href="spinlock_8h_source.html">spinlock.h</a>.</p> |
| |
| <p>Referenced by <a class="el" href="spinlock_8h_source.html#l00043">DCheckLocked()</a>, <a class="el" href="spinlock_8h_source.html#l00041">try_lock()</a>, and <a class="el" href="spinlock_8h_source.html#l00033">unlock()</a>.</p> |
| |
| </div> |
| </div> |
| <a class="anchor" id="af55a180118b1af36d6f5a2ad37aedef8"></a> |
| <div class="memitem"> |
| <div class="memproto"> |
| <table class="mlabels"> |
| <tr> |
| <td class="mlabels-left"> |
| <table class="memname"> |
| <tr> |
| <td class="memname">const int impala::SpinLock::NUM_SPIN_CYCLES = 70</td> |
| </tr> |
| </table> |
| </td> |
| <td class="mlabels-right"> |
| <span class="mlabels"><span class="mlabel">static</span><span class="mlabel">private</span></span> </td> |
| </tr> |
| </table> |
| </div><div class="memdoc"> |
| <p>In typical spin lock implements, we want to spin (and keep the core fully busy), for some number of cycles before yielding. Consider these three cases: 1) lock is un-contended - spinning doesn't kick in and has no effect. 2) lock is taken by another thread and that thread finishes quickly. 3) lock is taken by another thread and that thread is slow (e.g. scheduled away).</p> |
| <p>In case 3), we'd want to yield so another thread can do work. This thread won't be able to do anything useful until the thread with the lock runs again. In case 2), we don't want to yield (and give up our scheduling time slice) since we will get to run soon after. To try to get the best of everything, we will busy spin for a while before yielding to another thread. TODO: how do we set this. </p> |
| |
| <p>Definition at line <a class="el" href="spinlock_8h_source.html#l00065">65</a> of file <a class="el" href="spinlock_8h_source.html">spinlock.h</a>.</p> |
| |
| <p>Referenced by <a class="el" href="spinlock_8cc_source.html#l00018">SlowAcquire()</a>.</p> |
| |
| </div> |
| </div> |
| <hr/>The documentation for this class was generated from the following files:<ul> |
| <li>be/src/util/<a class="el" href="spinlock_8h_source.html">spinlock.h</a></li> |
| <li>be/src/util/<a class="el" href="spinlock_8cc_source.html">spinlock.cc</a></li> |
| </ul> |
| </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="namespaceimpala.html">impala</a></li><li class="navelem"><a class="el" href="classimpala_1_1SpinLock.html">SpinLock</a></li> |
| <li class="footer">Generated on Thu May 7 2015 16:10:50 for Impala by |
| <a href="http://www.doxygen.org/index.html"> |
| <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.6 </li> |
| </ul> |
| </div> |
| </body> |
| </html> |