blob: ee52fea30a0ad2703dc4fc86a3e3611c8f311374 [file] [log] [blame]
<!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.5"/>
<title>Apache Mesos: 3rdparty/stout/include/stout/synchronized.hpp File 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="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">Apache Mesos
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.5 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
<li><a href="namespaces.html"><span>Namespaces</span></a></li>
<li><a href="annotated.html"><span>Classes</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
<li><a href="examples.html"><span>Examples</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File&#160;List</span></a></li>
<li><a href="globals.html"><span>File&#160;Members</span></a></li>
</ul>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_8cab8f464681f7cc51cee77e79a434cd.html">3rdparty</a></li><li class="navelem"><a class="el" href="dir_aa547de1d719d14adccfca1dfb1735b3.html">stout</a></li><li class="navelem"><a class="el" href="dir_1a1b923d951dd999d43396870333fc33.html">include</a></li><li class="navelem"><a class="el" href="dir_dbd52553d038069c1ed93e3477ea333d.html">stout</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="summary">
<a href="#nested-classes">Classes</a> &#124;
<a href="#define-members">Macros</a> &#124;
<a href="#func-members">Functions</a> </div>
<div class="headertitle">
<div class="title">synchronized.hpp File Reference</div> </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><code>#include &lt;atomic&gt;</code><br/>
<code>#include &lt;condition_variable&gt;</code><br/>
<code>#include &lt;mutex&gt;</code><br/>
<code>#include &lt;type_traits&gt;</code><br/>
<code>#include &lt;glog/logging.h&gt;</code><br/>
<code>#include &lt;<a class="el" href="preprocessor_8hpp_source.html">stout/preprocessor.hpp</a>&gt;</code><br/>
</div>
<p><a href="synchronized_8hpp_source.html">Go to the source code of this file.</a></p>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
Classes</h2></td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classSynchronized.html">Synchronized&lt; T &gt;</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
Macros</h2></td></tr>
<tr class="memitem:ab321ce868d1f56a473a4bc3fac9a45da"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="synchronized_8hpp.html#ab321ce868d1f56a473a4bc3fac9a45da">SYNCHRONIZED_PREFIX</a>&#160;&#160;&#160;<a class="el" href="preprocessor_8hpp.html#a90e1b5ab607f3428668e5dd9a014ecb0">CAT</a>(__synchronizer_, __LINE__)</td></tr>
<tr class="separator:ab321ce868d1f56a473a4bc3fac9a45da"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a7c5f22c44193503d21cedd6e433aa697"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="synchronized_8hpp.html#a7c5f22c44193503d21cedd6e433aa697">SYNCHRONIZED_VAR</a>&#160;&#160;&#160;<a class="el" href="preprocessor_8hpp.html#a90e1b5ab607f3428668e5dd9a014ecb0">CAT</a>(<a class="el" href="synchronized_8hpp.html#ab321ce868d1f56a473a4bc3fac9a45da">SYNCHRONIZED_PREFIX</a>, _var__)</td></tr>
<tr class="separator:a7c5f22c44193503d21cedd6e433aa697"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:af611e06d6b072b3b4eb0dae282676143"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="synchronized_8hpp.html#af611e06d6b072b3b4eb0dae282676143">SYNCHRONIZED_LABEL</a>&#160;&#160;&#160;<a class="el" href="preprocessor_8hpp.html#a90e1b5ab607f3428668e5dd9a014ecb0">CAT</a>(<a class="el" href="synchronized_8hpp.html#ab321ce868d1f56a473a4bc3fac9a45da">SYNCHRONIZED_PREFIX</a>, _label__)</td></tr>
<tr class="separator:af611e06d6b072b3b4eb0dae282676143"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a3038464a289ad3d8957a761b1795b37b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="synchronized_8hpp.html#a3038464a289ad3d8957a761b1795b37b">synchronized</a>(m)</td></tr>
<tr class="separator:a3038464a289ad3d8957a761b1795b37b"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
Functions</h2></td></tr>
<tr class="memitem:ab47019f16d58f080f2b323b5b586e55d"><td class="memTemplParams" colspan="2">template&lt;typename T &gt; </td></tr>
<tr class="memitem:ab47019f16d58f080f2b323b5b586e55d"><td class="memTemplItemLeft" align="right" valign="top"><a class="el" href="classSynchronized.html">Synchronized</a>&lt; T &gt;&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="synchronized_8hpp.html#ab47019f16d58f080f2b323b5b586e55d">synchronize</a> (T *t)</td></tr>
<tr class="separator:ab47019f16d58f080f2b323b5b586e55d"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a4811b9eee17fd0e658196b48663462b8"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classSynchronized.html">Synchronized</a>&lt; std::atomic_flag &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="synchronized_8hpp.html#a4811b9eee17fd0e658196b48663462b8">synchronize</a> (std::atomic_flag *lock)</td></tr>
<tr class="separator:a4811b9eee17fd0e658196b48663462b8"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a4ec79edd13ce87b72eae3ba83b34ad14"><td class="memTemplParams" colspan="2">template&lt;typename T &gt; </td></tr>
<tr class="memitem:a4ec79edd13ce87b72eae3ba83b34ad14"><td class="memTemplItemLeft" align="right" valign="top">T *&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="synchronized_8hpp.html#a4ec79edd13ce87b72eae3ba83b34ad14">synchronized_get_pointer</a> (T **t)</td></tr>
<tr class="separator:a4ec79edd13ce87b72eae3ba83b34ad14"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a7b170182b10e3e723c5411e390766518"><td class="memTemplParams" colspan="2">template&lt;typename T &gt; </td></tr>
<tr class="memitem:a7b170182b10e3e723c5411e390766518"><td class="memTemplItemLeft" align="right" valign="top">T *&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="synchronized_8hpp.html#a7b170182b10e3e723c5411e390766518">synchronized_get_pointer</a> (T *t)</td></tr>
<tr class="separator:a7b170182b10e3e723c5411e390766518"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a9d854e5436a64744a231418cde397b05"><td class="memTemplParams" colspan="2">template&lt;typename CV , typename Lock &gt; </td></tr>
<tr class="memitem:a9d854e5436a64744a231418cde397b05"><td class="memTemplItemLeft" align="right" valign="top">void&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="synchronized_8hpp.html#a9d854e5436a64744a231418cde397b05">synchronized_wait</a> (CV *cv, Lock *lock)</td></tr>
<tr class="memdesc:a9d854e5436a64744a231418cde397b05"><td class="mdescLeft">&#160;</td><td class="mdescRight">Waits on the condition variable associated with 'lock' which has already been synchronized. <a href="#a9d854e5436a64744a231418cde397b05">More...</a><br/></td></tr>
<tr class="separator:a9d854e5436a64744a231418cde397b05"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aad5d742a7c6da3c4583b0bbda035e091"><td class="memTemplParams" colspan="2">template&lt;&gt; </td></tr>
<tr class="memitem:aad5d742a7c6da3c4583b0bbda035e091"><td class="memTemplItemLeft" align="right" valign="top">void&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="synchronized_8hpp.html#aad5d742a7c6da3c4583b0bbda035e091">synchronized_wait</a> (std::condition_variable *cv, std::mutex *mutex)</td></tr>
<tr class="separator:aad5d742a7c6da3c4583b0bbda035e091"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a08dea5013e555acfa773b936df5d4e16"><td class="memTemplParams" colspan="2">template&lt;typename Lock &gt; </td></tr>
<tr class="memitem:a08dea5013e555acfa773b936df5d4e16"><td class="memTemplItemLeft" align="right" valign="top">void&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="synchronized_8hpp.html#a08dea5013e555acfa773b936df5d4e16">synchronized_wait</a> (std::condition_variable_any *cv, Lock *lock)=delete</td></tr>
<tr class="memdesc:a08dea5013e555acfa773b936df5d4e16"><td class="mdescLeft">&#160;</td><td class="mdescRight">There is a known bug around 'std::condition_variable_any' in 'libstdc++' distributed 'devtoolset-2', and also general issues around the use of 'std::condition_variable_any' with 'std::recursive_mutex'. <a href="#a08dea5013e555acfa773b936df5d4e16">More...</a><br/></td></tr>
<tr class="separator:a08dea5013e555acfa773b936df5d4e16"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<h2 class="groupheader">Macro Definition Documentation</h2>
<a class="anchor" id="a3038464a289ad3d8957a761b1795b37b"></a>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">#define synchronized</td>
<td>(</td>
<td class="paramtype">&#160;</td>
<td class="paramname">m</td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<b>Value:</b><div class="fragment"><div class="line"><span class="keywordflow">if</span> (<a class="code" href="classSynchronized.html">Synchronized</a>&lt;<span class="keyword">typename</span> std::remove_pointer&lt;decltype(m)&gt;::<a class="code" href="namespacemesos_1_1internal_1_1fs.html#a2343e2642db514496ba8380776487fba">type</a>&gt; \</div>
<div class="line"> <a class="code" href="synchronized_8hpp.html#a7c5f22c44193503d21cedd6e433aa697">SYNCHRONIZED_VAR</a> = ::<a class="code" href="synchronized_8hpp.html#ab47019f16d58f080f2b323b5b586e55d">synchronize</a>(::<a class="code" href="synchronized_8hpp.html#a4ec79edd13ce87b72eae3ba83b34ad14">synchronized_get_pointer</a>(&amp;m))) { \</div>
<div class="line"> goto <a class="code" href="synchronized_8hpp.html#af611e06d6b072b3b4eb0dae282676143">SYNCHRONIZED_LABEL</a>; \</div>
<div class="line"> } <span class="keywordflow">else</span> <a class="code" href="synchronized_8hpp.html#af611e06d6b072b3b4eb0dae282676143">SYNCHRONIZED_LABEL</a>:</div>
<div class="ttc" id="synchronized_8hpp_html_ab47019f16d58f080f2b323b5b586e55d"><div class="ttname"><a href="synchronized_8hpp.html#ab47019f16d58f080f2b323b5b586e55d">synchronize</a></div><div class="ttdeci">Synchronized&lt; T &gt; synchronize(T *t)</div><div class="ttdef"><b>Definition:</b> synchronized.hpp:52</div></div>
<div class="ttc" id="synchronized_8hpp_html_a7c5f22c44193503d21cedd6e433aa697"><div class="ttname"><a href="synchronized_8hpp.html#a7c5f22c44193503d21cedd6e433aa697">SYNCHRONIZED_VAR</a></div><div class="ttdeci">#define SYNCHRONIZED_VAR</div><div class="ttdef"><b>Definition:</b> synchronized.hpp:97</div></div>
<div class="ttc" id="classSynchronized_html"><div class="ttname"><a href="classSynchronized.html">Synchronized</a></div><div class="ttdef"><b>Definition:</b> synchronized.hpp:27</div></div>
<div class="ttc" id="namespacemesos_1_1internal_1_1fs_html_a2343e2642db514496ba8380776487fba"><div class="ttname"><a href="namespacemesos_1_1internal_1_1fs.html#a2343e2642db514496ba8380776487fba">mesos::internal::fs::type</a></div><div class="ttdeci">Try&lt; uint32_t &gt; type(const std::string &amp;path)</div></div>
<div class="ttc" id="synchronized_8hpp_html_a4ec79edd13ce87b72eae3ba83b34ad14"><div class="ttname"><a href="synchronized_8hpp.html#a4ec79edd13ce87b72eae3ba83b34ad14">synchronized_get_pointer</a></div><div class="ttdeci">T * synchronized_get_pointer(T **t)</div><div class="ttdef"><b>Definition:</b> synchronized.hpp:78</div></div>
<div class="ttc" id="synchronized_8hpp_html_af611e06d6b072b3b4eb0dae282676143"><div class="ttname"><a href="synchronized_8hpp.html#af611e06d6b072b3b4eb0dae282676143">SYNCHRONIZED_LABEL</a></div><div class="ttdeci">#define SYNCHRONIZED_LABEL</div><div class="ttdef"><b>Definition:</b> synchronized.hpp:98</div></div>
</div><!-- fragment -->
</div>
</div>
<a class="anchor" id="af611e06d6b072b3b4eb0dae282676143"></a>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">#define SYNCHRONIZED_LABEL&#160;&#160;&#160;<a class="el" href="preprocessor_8hpp.html#a90e1b5ab607f3428668e5dd9a014ecb0">CAT</a>(<a class="el" href="synchronized_8hpp.html#ab321ce868d1f56a473a4bc3fac9a45da">SYNCHRONIZED_PREFIX</a>, _label__)</td>
</tr>
</table>
</div><div class="memdoc">
</div>
</div>
<a class="anchor" id="ab321ce868d1f56a473a4bc3fac9a45da"></a>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">#define SYNCHRONIZED_PREFIX&#160;&#160;&#160;<a class="el" href="preprocessor_8hpp.html#a90e1b5ab607f3428668e5dd9a014ecb0">CAT</a>(__synchronizer_, __LINE__)</td>
</tr>
</table>
</div><div class="memdoc">
</div>
</div>
<a class="anchor" id="a7c5f22c44193503d21cedd6e433aa697"></a>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">#define SYNCHRONIZED_VAR&#160;&#160;&#160;<a class="el" href="preprocessor_8hpp.html#a90e1b5ab607f3428668e5dd9a014ecb0">CAT</a>(<a class="el" href="synchronized_8hpp.html#ab321ce868d1f56a473a4bc3fac9a45da">SYNCHRONIZED_PREFIX</a>, _var__)</td>
</tr>
</table>
</div><div class="memdoc">
</div>
</div>
<h2 class="groupheader">Function Documentation</h2>
<a class="anchor" id="ab47019f16d58f080f2b323b5b586e55d"></a>
<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;typename T &gt; </div>
<table class="memname">
<tr>
<td class="memname"><a class="el" href="classSynchronized.html">Synchronized</a>&lt;T&gt; synchronize </td>
<td>(</td>
<td class="paramtype">T *&#160;</td>
<td class="paramname"><em>t</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
</div>
</div>
<a class="anchor" id="a4811b9eee17fd0e658196b48663462b8"></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="classSynchronized.html">Synchronized</a>&lt;std::atomic_flag&gt; synchronize </td>
<td>(</td>
<td class="paramtype">std::atomic_flag *&#160;</td>
<td class="paramname"><em>lock</em></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">
</div>
</div>
<a class="anchor" id="a4ec79edd13ce87b72eae3ba83b34ad14"></a>
<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;typename T &gt; </div>
<table class="memname">
<tr>
<td class="memname">T* synchronized_get_pointer </td>
<td>(</td>
<td class="paramtype">T **&#160;</td>
<td class="paramname"><em>t</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
</div>
</div>
<a class="anchor" id="a7b170182b10e3e723c5411e390766518"></a>
<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;typename T &gt; </div>
<table class="memname">
<tr>
<td class="memname">T* synchronized_get_pointer </td>
<td>(</td>
<td class="paramtype">T *&#160;</td>
<td class="paramname"><em>t</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
</div>
</div>
<a class="anchor" id="a9d854e5436a64744a231418cde397b05"></a>
<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;typename CV , typename Lock &gt; </div>
<table class="memname">
<tr>
<td class="memname">void synchronized_wait </td>
<td>(</td>
<td class="paramtype">CV *&#160;</td>
<td class="paramname"><em>cv</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">Lock *&#160;</td>
<td class="paramname"><em>lock</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Waits on the condition variable associated with 'lock' which has already been synchronized. </p>
<p>Currently, the only supported implementation is for 'std::condition_variable' associated with a 'std::mutex'.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">cv</td><td>The condition variable. </td></tr>
<tr><td class="paramname">lock</td><td>The lock associated with the condition variable.</td></tr>
</table>
</dd>
</dl>
<dl class="section pre"><dt>Precondition</dt><dd>'lock' is already owned by the calling thread. </dd></dl>
<dl class="section post"><dt>Postcondition</dt><dd>'lock' is still owned by the calling thread.</dd></dl>
<dl class="section return"><dt>Returns</dt><dd><a class="el" href="structNothing.html">Nothing</a>. </dd></dl>
</div>
</div>
<a class="anchor" id="aad5d742a7c6da3c4583b0bbda035e091"></a>
<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;&gt; </div>
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">void synchronized_wait </td>
<td>(</td>
<td class="paramtype">std::condition_variable *&#160;</td>
<td class="paramname"><em>cv</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">std::mutex *&#160;</td>
<td class="paramname"><em>mutex</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</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">
</div>
</div>
<a class="anchor" id="a08dea5013e555acfa773b936df5d4e16"></a>
<div class="memitem">
<div class="memproto">
<div class="memtemplate">
template&lt;typename Lock &gt; </div>
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">void synchronized_wait </td>
<td>(</td>
<td class="paramtype">std::condition_variable_any *&#160;</td>
<td class="paramname"><em>cv</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">Lock *&#160;</td>
<td class="paramname"><em>lock</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">delete</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>There is a known bug around 'std::condition_variable_any' in 'libstdc++' distributed 'devtoolset-2', and also general issues around the use of 'std::condition_variable_any' with 'std::recursive_mutex'. </p>
<p>Hence, this function is currently deleted until both issues are resolved.</p>
<dl class="section see"><dt>See Also</dt><dd><a href="https://rhn.redhat.com/errata/RHBA-2014-1035.html">https://rhn.redhat.com/errata/RHBA-2014-1035.html</a> </dd>
<dd>
<a href="http://stackoverflow.com/questions/11752155/behavior-of-condition-variable-any-when-used-with-a-recursive-mutex">http://stackoverflow.com/questions/11752155/behavior-of-condition-variable-any-when-used-with-a-recursive-mutex</a> </dd></dl>
</div>
</div>
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.5
</small></address>
</body>
</html>