mirror of
https://github.com/XRPLF/rippled.git
synced 2025-12-06 17:27:55 +00:00
346 lines
18 KiB
HTML
346 lines
18 KiB
HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
|
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
|
|
<meta name="generator" content="Doxygen 1.8.17"/>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
|
<title>rippled: ripple::packed_spinlock< T > Class Template 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="search/search.css" rel="stylesheet" type="text/css"/>
|
|
<script type="text/javascript" src="search/searchdata.js"></script>
|
|
<script type="text/javascript" src="search/search.js"></script>
|
|
<link href="doxygen.css" rel="stylesheet" type="text/css" />
|
|
</head>
|
|
<body>
|
|
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
|
|
<div id="titlearea">
|
|
<table cellspacing="0" cellpadding="0">
|
|
<tbody>
|
|
<tr style="height: 56px;">
|
|
<td id="projectalign" style="padding-left: 0.5em;">
|
|
<div id="projectname">rippled
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<!-- end header part -->
|
|
<!-- Generated by Doxygen 1.8.17 -->
|
|
<script type="text/javascript">
|
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
|
var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
|
/* @license-end */
|
|
</script>
|
|
<script type="text/javascript" src="menudata.js"></script>
|
|
<script type="text/javascript" src="menu.js"></script>
|
|
<script type="text/javascript">
|
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
|
$(function() {
|
|
initMenu('',true,false,'search.php','Search');
|
|
$(document).ready(function() { init_search(); });
|
|
});
|
|
/* @license-end */</script>
|
|
<div id="main-nav"></div>
|
|
<!-- window showing the filter options -->
|
|
<div id="MSearchSelectWindow"
|
|
onmouseover="return searchBox.OnSearchSelectShow()"
|
|
onmouseout="return searchBox.OnSearchSelectHide()"
|
|
onkeydown="return searchBox.OnSearchSelectKey(event)">
|
|
</div>
|
|
|
|
<!-- iframe showing the search results (closed by default) -->
|
|
<div id="MSearchResultsWindow">
|
|
<iframe src="javascript:void(0)" frameborder="0"
|
|
name="MSearchResults" id="MSearchResults">
|
|
</iframe>
|
|
</div>
|
|
|
|
<div id="nav-path" class="navpath">
|
|
<ul>
|
|
<li class="navelem"><a class="el" href="namespaceripple.html">ripple</a></li><li class="navelem"><a class="el" href="classripple_1_1packed__spinlock.html">packed_spinlock</a></li> </ul>
|
|
</div>
|
|
</div><!-- top -->
|
|
<div class="header">
|
|
<div class="summary">
|
|
<a href="#pub-methods">Public Member Functions</a> |
|
|
<a href="#pri-attribs">Private Attributes</a> |
|
|
<a href="classripple_1_1packed__spinlock-members.html">List of all members</a> </div>
|
|
<div class="headertitle">
|
|
<div class="title">ripple::packed_spinlock< T > Class Template Reference</div> </div>
|
|
</div><!--header-->
|
|
<div class="contents">
|
|
|
|
<p>Classes to handle arrays of spinlocks packed into a single atomic integer:
|
|
<a href="classripple_1_1packed__spinlock.html#details">More...</a></p>
|
|
<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:a9b50344098f14a88e3cf3bf75f9eca45"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="classripple_1_1packed__spinlock.html#a9b50344098f14a88e3cf3bf75f9eca45">packed_spinlock</a> (<a class="el" href="classripple_1_1packed__spinlock.html">packed_spinlock</a> const &)=delete</td></tr>
|
|
<tr class="separator:a9b50344098f14a88e3cf3bf75f9eca45"><td class="memSeparator" colspan="2"> </td></tr>
|
|
<tr class="memitem:a02dd3a51a505ba7bf9e913314549773d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classripple_1_1packed__spinlock.html">packed_spinlock</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="classripple_1_1packed__spinlock.html#a02dd3a51a505ba7bf9e913314549773d">operator=</a> (<a class="el" href="classripple_1_1packed__spinlock.html">packed_spinlock</a> const &)=delete</td></tr>
|
|
<tr class="separator:a02dd3a51a505ba7bf9e913314549773d"><td class="memSeparator" colspan="2"> </td></tr>
|
|
<tr class="memitem:a6b795f06719bc2d90ed4f6a6007fb5fe"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="classripple_1_1packed__spinlock.html#a6b795f06719bc2d90ed4f6a6007fb5fe">packed_spinlock</a> (<a class="elRef" href="http://en.cppreference.com/w/cpp/atomic/atomic.html">std::atomic</a>< T > &<a class="el" href="classripple_1_1packed__spinlock.html#a8d885a8f4e6fc078869345131e76be63">lock</a>, int index)</td></tr>
|
|
<tr class="memdesc:a6b795f06719bc2d90ed4f6a6007fb5fe"><td class="mdescLeft"> </td><td class="mdescRight">A single spinlock packed inside the specified atomic. <a href="classripple_1_1packed__spinlock.html#a6b795f06719bc2d90ed4f6a6007fb5fe">More...</a><br /></td></tr>
|
|
<tr class="separator:a6b795f06719bc2d90ed4f6a6007fb5fe"><td class="memSeparator" colspan="2"> </td></tr>
|
|
<tr class="memitem:ad544b64b85215e6adcf96a37f7b14503"><td class="memItemLeft" align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="classripple_1_1packed__spinlock.html#ad544b64b85215e6adcf96a37f7b14503">try_lock</a> ()</td></tr>
|
|
<tr class="separator:ad544b64b85215e6adcf96a37f7b14503"><td class="memSeparator" colspan="2"> </td></tr>
|
|
<tr class="memitem:a8d885a8f4e6fc078869345131e76be63"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classripple_1_1packed__spinlock.html#a8d885a8f4e6fc078869345131e76be63">lock</a> ()</td></tr>
|
|
<tr class="separator:a8d885a8f4e6fc078869345131e76be63"><td class="memSeparator" colspan="2"> </td></tr>
|
|
<tr class="memitem:a54ab44d231a3a27eda752596b3f69e11"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classripple_1_1packed__spinlock.html#a54ab44d231a3a27eda752596b3f69e11">unlock</a> ()</td></tr>
|
|
<tr class="separator:a54ab44d231a3a27eda752596b3f69e11"><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:a1f775dfb309d7f877b5075c05a29d857"><td class="memItemLeft" align="right" valign="top"><a class="elRef" href="http://en.cppreference.com/w/cpp/atomic/atomic.html">std::atomic</a>< T > & </td><td class="memItemRight" valign="bottom"><a class="el" href="classripple_1_1packed__spinlock.html#a1f775dfb309d7f877b5075c05a29d857">bits_</a></td></tr>
|
|
<tr class="separator:a1f775dfb309d7f877b5075c05a29d857"><td class="memSeparator" colspan="2"> </td></tr>
|
|
<tr class="memitem:add775fd5d7375664092b675670d5ca6b"><td class="memItemLeft" align="right" valign="top">const T </td><td class="memItemRight" valign="bottom"><a class="el" href="classripple_1_1packed__spinlock.html#add775fd5d7375664092b675670d5ca6b">mask_</a></td></tr>
|
|
<tr class="separator:add775fd5d7375664092b675670d5ca6b"><td class="memSeparator" colspan="2"> </td></tr>
|
|
</table>
|
|
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
|
|
<div class="textblock"><h3>template<class T><br />
|
|
class ripple::packed_spinlock< T ></h3>
|
|
|
|
<p>Classes to handle arrays of spinlocks packed into a single atomic integer: </p>
|
|
<p>Packed spinlocks allow for tremendously space-efficient lock-sharding but they come at a cost.</p>
|
|
<p>First, the implementation is necessarily low-level and uses advanced features like memory ordering and highly platform-specific tricks to maximize performance. This imposes a significant and ongoing cost to developers.</p>
|
|
<p>Second, and perhaps most important, is that the packing of multiple locks into a single integer which, albeit space-efficient, also has performance implications stemming from data dependencies, increased cache-coherency traffic between processors and heavier loads on the processor's load/store units.</p>
|
|
<p>To be sure, these locks can have advantages but they are definitely not general purpose locks and should not be thought of or used that way. The use cases for them are likely few and far between; without a compelling reason to use them, backed by profiling data, it might be best to use one of the standard locking primitives instead. Note that in most common platforms, <code><a class="elRef" href="http://en.cppreference.com/w/cpp/thread/mutex.html" title="STL class.">std::mutex</a></code> is so heavily optimized that it can, usually, outperform spinlocks.</p>
|
|
<dl class="tparams"><dt>Template Parameters</dt><dd>
|
|
<table class="tparams">
|
|
<tr><td class="paramname">T</td><td>An unsigned integral type (e.g. <a class="elRef" href="http://en.cppreference.com/w/cpp/types/integer.html">std::uint16_t</a>) A class that grabs a single packed spinlock from an atomic integer.</td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
<p>This class meets the requirements of Lockable: <a href="https://en.cppreference.com/w/cpp/named_req/Lockable">https://en.cppreference.com/w/cpp/named_req/Lockable</a> </p>
|
|
|
|
<p class="definition">Definition at line <a class="el" href="spinlock_8h_source.html#l00089">89</a> of file <a class="el" href="spinlock_8h_source.html">spinlock.h</a>.</p>
|
|
</div><h2 class="groupheader">Constructor & Destructor Documentation</h2>
|
|
<a id="a9b50344098f14a88e3cf3bf75f9eca45"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#a9b50344098f14a88e3cf3bf75f9eca45">◆ </a></span>packed_spinlock() <span class="overload">[1/2]</span></h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<div class="memtemplate">
|
|
template<class T > </div>
|
|
<table class="mlabels">
|
|
<tr>
|
|
<td class="mlabels-left">
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname"><a class="el" href="classripple_1_1packed__spinlock.html">ripple::packed_spinlock</a>< T >::<a class="el" href="classripple_1_1packed__spinlock.html">packed_spinlock</a> </td>
|
|
<td>(</td>
|
|
<td class="paramtype"><a class="el" href="classripple_1_1packed__spinlock.html">packed_spinlock</a>< T > const & </td>
|
|
<td class="paramname"></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">
|
|
|
|
</div>
|
|
</div>
|
|
<a id="a6b795f06719bc2d90ed4f6a6007fb5fe"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#a6b795f06719bc2d90ed4f6a6007fb5fe">◆ </a></span>packed_spinlock() <span class="overload">[2/2]</span></h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<div class="memtemplate">
|
|
template<class T > </div>
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname"><a class="el" href="classripple_1_1packed__spinlock.html">ripple::packed_spinlock</a>< T >::<a class="el" href="classripple_1_1packed__spinlock.html">packed_spinlock</a> </td>
|
|
<td>(</td>
|
|
<td class="paramtype"><a class="elRef" href="http://en.cppreference.com/w/cpp/atomic/atomic.html">std::atomic</a>< T > & </td>
|
|
<td class="paramname"><em>lock</em>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype">int </td>
|
|
<td class="paramname"><em>index</em> </td>
|
|
</tr>
|
|
<tr>
|
|
<td></td>
|
|
<td>)</td>
|
|
<td></td><td></td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
|
|
<p>A single spinlock packed inside the specified atomic. </p>
|
|
<dl class="params"><dt>Parameters</dt><dd>
|
|
<table class="params">
|
|
<tr><td class="paramname">lock</td><td>The atomic integer inside which the spinlock is packed. </td></tr>
|
|
<tr><td class="paramname">index</td><td>The index of the spinlock this object acquires.</td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
<dl class="section note"><dt>Note</dt><dd>For performance reasons, you should strive to have <code>lock</code> be on a cacheline by itself. </dd></dl>
|
|
|
|
<p class="definition">Definition at line <a class="el" href="spinlock_8h_source.html#l00117">117</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 id="a02dd3a51a505ba7bf9e913314549773d"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#a02dd3a51a505ba7bf9e913314549773d">◆ </a></span>operator=()</h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<div class="memtemplate">
|
|
template<class T > </div>
|
|
<table class="mlabels">
|
|
<tr>
|
|
<td class="mlabels-left">
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname"><a class="el" href="classripple_1_1packed__spinlock.html">packed_spinlock</a>& <a class="el" href="classripple_1_1packed__spinlock.html">ripple::packed_spinlock</a>< T >::operator= </td>
|
|
<td>(</td>
|
|
<td class="paramtype"><a class="el" href="classripple_1_1packed__spinlock.html">packed_spinlock</a>< T > const & </td>
|
|
<td class="paramname"></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">
|
|
|
|
</div>
|
|
</div>
|
|
<a id="ad544b64b85215e6adcf96a37f7b14503"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#ad544b64b85215e6adcf96a37f7b14503">◆ </a></span>try_lock()</h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<div class="memtemplate">
|
|
template<class T > </div>
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname">bool <a class="el" href="classripple_1_1packed__spinlock.html">ripple::packed_spinlock</a>< T >::try_lock </td>
|
|
<td>(</td>
|
|
<td class="paramname"></td><td>)</td>
|
|
<td></td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
|
|
<p class="definition">Definition at line <a class="el" href="spinlock_8h_source.html#l00124">124</a> of file <a class="el" href="spinlock_8h_source.html">spinlock.h</a>.</p>
|
|
|
|
</div>
|
|
</div>
|
|
<a id="a8d885a8f4e6fc078869345131e76be63"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#a8d885a8f4e6fc078869345131e76be63">◆ </a></span>lock()</h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<div class="memtemplate">
|
|
template<class T > </div>
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname">void <a class="el" href="classripple_1_1packed__spinlock.html">ripple::packed_spinlock</a>< T >::lock </td>
|
|
<td>(</td>
|
|
<td class="paramname"></td><td>)</td>
|
|
<td></td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
|
|
<p class="definition">Definition at line <a class="el" href="spinlock_8h_source.html#l00130">130</a> of file <a class="el" href="spinlock_8h_source.html">spinlock.h</a>.</p>
|
|
|
|
</div>
|
|
</div>
|
|
<a id="a54ab44d231a3a27eda752596b3f69e11"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#a54ab44d231a3a27eda752596b3f69e11">◆ </a></span>unlock()</h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<div class="memtemplate">
|
|
template<class T > </div>
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname">void <a class="el" href="classripple_1_1packed__spinlock.html">ripple::packed_spinlock</a>< T >::unlock </td>
|
|
<td>(</td>
|
|
<td class="paramname"></td><td>)</td>
|
|
<td></td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
|
|
<p class="definition">Definition at line <a class="el" href="spinlock_8h_source.html#l00144">144</a> of file <a class="el" href="spinlock_8h_source.html">spinlock.h</a>.</p>
|
|
|
|
</div>
|
|
</div>
|
|
<h2 class="groupheader">Member Data Documentation</h2>
|
|
<a id="a1f775dfb309d7f877b5075c05a29d857"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#a1f775dfb309d7f877b5075c05a29d857">◆ </a></span>bits_</h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<div class="memtemplate">
|
|
template<class T > </div>
|
|
<table class="mlabels">
|
|
<tr>
|
|
<td class="mlabels-left">
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname"><a class="elRef" href="http://en.cppreference.com/w/cpp/atomic/atomic.html">std::atomic</a><T>& <a class="el" href="classripple_1_1packed__spinlock.html">ripple::packed_spinlock</a>< T >::bits_</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 class="definition">Definition at line <a class="el" href="spinlock_8h_source.html#l00092">92</a> of file <a class="el" href="spinlock_8h_source.html">spinlock.h</a>.</p>
|
|
|
|
</div>
|
|
</div>
|
|
<a id="add775fd5d7375664092b675670d5ca6b"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#add775fd5d7375664092b675670d5ca6b">◆ </a></span>mask_</h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<div class="memtemplate">
|
|
template<class T > </div>
|
|
<table class="mlabels">
|
|
<tr>
|
|
<td class="mlabels-left">
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname">const T <a class="el" href="classripple_1_1packed__spinlock.html">ripple::packed_spinlock</a>< T >::mask_</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 class="definition">Definition at line <a class="el" href="spinlock_8h_source.html#l00102">102</a> of file <a class="el" href="spinlock_8h_source.html">spinlock.h</a>.</p>
|
|
|
|
</div>
|
|
</div>
|
|
</div><!-- contents -->
|
|
<!-- start footer part -->
|
|
<hr class="footer"/><address class="footer"><small>
|
|
Generated by  <a href="http://www.doxygen.org/index.html">
|
|
<img class="footer" src="doxygen.png" alt="doxygen"/>
|
|
</a> 1.8.17
|
|
</small></address>
|
|
</body>
|
|
</html>
|