Files
rippled/classripple_1_1Workers.html
2022-03-11 23:48:43 +00:00

738 lines
43 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::Workers 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="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&amp;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&amp;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_1Workers.html">Workers</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="summary">
<a href="#nested-classes">Classes</a> &#124;
<a href="#pub-methods">Public Member Functions</a> &#124;
<a href="#pri-static-methods">Static Private Member Functions</a> &#124;
<a href="#pri-attribs">Private Attributes</a> &#124;
<a href="classripple_1_1Workers-members.html">List of all members</a> </div>
<div class="headertitle">
<div class="title">ripple::Workers Class Reference</div> </div>
</div><!--header-->
<div class="contents">
<p><code><a class="el" href="classripple_1_1Workers.html" title="Workers is effectively a thread pool.">Workers</a></code> is effectively a thread pool.
<a href="classripple_1_1Workers.html#details">More...</a></p>
<div class="dynheader">
Collaboration diagram for ripple::Workers:</div>
<div class="dyncontent">
<div class="center"><img src="classripple_1_1Workers__coll__graph.png" border="0" usemap="#ripple_1_1Workers_coll__map" alt="Collaboration graph"/></div>
<map name="ripple_1_1Workers_coll__map" id="ripple_1_1Workers_coll__map">
<area shape="rect" title="Workers is effectively a thread pool." alt="" coords="991,308,1111,335"/>
<area shape="rect" href="http://en.cppreference.com/w/cpp/atomic/atomic.html" title=" " alt="" coords="627,44,769,71"/>
<area shape="rect" href="structripple_1_1Workers_1_1Callback.html" title="Called to perform tasks as needed." alt="" coords="606,95,790,121"/>
<area shape="rect" href="http://en.cppreference.com/w/cpp/thread/condition_variable.html" title=" " alt="" coords="295,161,466,188"/>
<area shape="rect" href="classripple_1_1basic__semaphore.html" title=" " alt="" coords="597,220,799,276"/>
<area shape="rect" href="classbeast_1_1LockFreeStack.html" title=" " alt="" coords="591,369,805,425"/>
<area shape="rect" href="classbeast_1_1LockFreeStack_1_1Node.html" title=" " alt="" coords="5,410,184,451"/>
<area shape="rect" href="http://en.cppreference.com/w/cpp/atomic/atomic.html" title=" " alt="" coords="285,419,476,461"/>
<area shape="rect" href="classbeast_1_1LockFreeStack.html" title=" " alt="" coords="596,450,800,491"/>
<area shape="rect" href="http://en.cppreference.com/w/cpp/thread/mutex.html" title="STL class." alt="" coords="335,291,427,317"/>
<area shape="rect" href="http://en.cppreference.com/w/cpp/types/size_t.html" title=" " alt="" coords="337,227,425,253"/>
<area shape="rect" href="http://en.cppreference.com/w/cpp/string/basic_string.html" title="STL class." alt="" coords="655,516,741,543"/>
<area shape="rect" href="classripple_1_1perf_1_1PerfLog.html" title="Singleton class that maintains performance counters and optionally writes Json&#45;formatted data to a di..." alt="" coords="623,567,773,593"/>
</map>
<center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
<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">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structripple_1_1Workers_1_1Callback.html">Callback</a></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Called to perform tasks as needed. <a href="structripple_1_1Workers_1_1Callback.html#details">More...</a><br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structripple_1_1Workers_1_1PausedTag.html">PausedTag</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classripple_1_1Workers_1_1Worker.html">Worker</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="pub-methods"></a>
Public Member Functions</h2></td></tr>
<tr class="memitem:a2b7128de479945e72fca6f1fb069466f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classripple_1_1Workers.html#a2b7128de479945e72fca6f1fb069466f">Workers</a> (<a class="el" href="structripple_1_1Workers_1_1Callback.html">Callback</a> &amp;callback, <a class="el" href="classripple_1_1perf_1_1PerfLog.html">perf::PerfLog</a> *perfLog, <a class="elRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> const &amp;threadNames=&quot;Worker&quot;, int numberOfThreads=static_cast&lt; int &gt;(<a class="elRef" href="http://en.cppreference.com/w/cpp/thread/thread/hardware_concurrency.html">std::thread::hardware_concurrency</a>()))</td></tr>
<tr class="memdesc:a2b7128de479945e72fca6f1fb069466f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Create the object. <a href="classripple_1_1Workers.html#a2b7128de479945e72fca6f1fb069466f">More...</a><br /></td></tr>
<tr class="separator:a2b7128de479945e72fca6f1fb069466f"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a780ec448fd8944839c8baec628db5560"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classripple_1_1Workers.html#a780ec448fd8944839c8baec628db5560">~Workers</a> ()</td></tr>
<tr class="separator:a780ec448fd8944839c8baec628db5560"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a483ede0aed8ed080be82fcb62d79dd19"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classripple_1_1Workers.html#a483ede0aed8ed080be82fcb62d79dd19">getNumberOfThreads</a> () const noexcept</td></tr>
<tr class="memdesc:a483ede0aed8ed080be82fcb62d79dd19"><td class="mdescLeft">&#160;</td><td class="mdescRight">Retrieve the desired number of threads. <a href="classripple_1_1Workers.html#a483ede0aed8ed080be82fcb62d79dd19">More...</a><br /></td></tr>
<tr class="separator:a483ede0aed8ed080be82fcb62d79dd19"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aeb667770c498316bc4611932c768141d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classripple_1_1Workers.html#aeb667770c498316bc4611932c768141d">setNumberOfThreads</a> (int numberOfThreads)</td></tr>
<tr class="memdesc:aeb667770c498316bc4611932c768141d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the desired number of threads. <a href="classripple_1_1Workers.html#aeb667770c498316bc4611932c768141d">More...</a><br /></td></tr>
<tr class="separator:aeb667770c498316bc4611932c768141d"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:adc599a454f17df95852e20139e98eea8"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classripple_1_1Workers.html#adc599a454f17df95852e20139e98eea8">stop</a> ()</td></tr>
<tr class="memdesc:adc599a454f17df95852e20139e98eea8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Pause all threads and wait until they are paused. <a href="classripple_1_1Workers.html#adc599a454f17df95852e20139e98eea8">More...</a><br /></td></tr>
<tr class="separator:adc599a454f17df95852e20139e98eea8"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aa65a05362bb7c77d7679cefce91a1514"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classripple_1_1Workers.html#aa65a05362bb7c77d7679cefce91a1514">addTask</a> ()</td></tr>
<tr class="memdesc:aa65a05362bb7c77d7679cefce91a1514"><td class="mdescLeft">&#160;</td><td class="mdescRight">Add a task to be performed. <a href="classripple_1_1Workers.html#aa65a05362bb7c77d7679cefce91a1514">More...</a><br /></td></tr>
<tr class="separator:aa65a05362bb7c77d7679cefce91a1514"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a8cb80967484f0d91c3125e364091d419"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classripple_1_1Workers.html#a8cb80967484f0d91c3125e364091d419">numberOfCurrentlyRunningTasks</a> () const noexcept</td></tr>
<tr class="memdesc:a8cb80967484f0d91c3125e364091d419"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the number of currently executing calls of <a class="el" href="structripple_1_1Workers_1_1Callback.html#aaf9d435c1413c9a7ac8f662518e16312" title="Perform a task.">Callback::processTask</a>. <a href="classripple_1_1Workers.html#a8cb80967484f0d91c3125e364091d419">More...</a><br /></td></tr>
<tr class="separator:a8cb80967484f0d91c3125e364091d419"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pri-static-methods"></a>
Static Private Member Functions</h2></td></tr>
<tr class="memitem:a5f6a6068ef793a580da7aa31a873a804"><td class="memItemLeft" align="right" valign="top">static void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classripple_1_1Workers.html#a5f6a6068ef793a580da7aa31a873a804">deleteWorkers</a> (<a class="el" href="classbeast_1_1LockFreeStack.html">beast::LockFreeStack</a>&lt; <a class="el" href="classripple_1_1Workers_1_1Worker.html">Worker</a> &gt; &amp;stack)</td></tr>
<tr class="separator:a5f6a6068ef793a580da7aa31a873a804"><td class="memSeparator" colspan="2">&#160;</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:a4e1c3aacc2ac4dd64b84075e5aeca0b2"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structripple_1_1Workers_1_1Callback.html">Callback</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classripple_1_1Workers.html#a4e1c3aacc2ac4dd64b84075e5aeca0b2">m_callback</a></td></tr>
<tr class="separator:a4e1c3aacc2ac4dd64b84075e5aeca0b2"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:addb401754309403bc8a604f1dd7cfdf3"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classripple_1_1perf_1_1PerfLog.html">perf::PerfLog</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classripple_1_1Workers.html#addb401754309403bc8a604f1dd7cfdf3">perfLog_</a></td></tr>
<tr class="separator:addb401754309403bc8a604f1dd7cfdf3"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ab5e3a1411baa39373e04b428629d06c2"><td class="memItemLeft" align="right" valign="top"><a class="elRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classripple_1_1Workers.html#ab5e3a1411baa39373e04b428629d06c2">m_threadNames</a></td></tr>
<tr class="separator:ab5e3a1411baa39373e04b428629d06c2"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a3e0b864f32dddc4e7680ae1b561eca2e"><td class="memItemLeft" align="right" valign="top"><a class="elRef" href="http://en.cppreference.com/w/cpp/thread/condition_variable.html">std::condition_variable</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classripple_1_1Workers.html#a3e0b864f32dddc4e7680ae1b561eca2e">m_cv</a></td></tr>
<tr class="separator:a3e0b864f32dddc4e7680ae1b561eca2e"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a2975bc9272963c0333b08d288adaca7a"><td class="memItemLeft" align="right" valign="top"><a class="elRef" href="http://en.cppreference.com/w/cpp/thread/mutex.html">std::mutex</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classripple_1_1Workers.html#a2975bc9272963c0333b08d288adaca7a">m_mut</a></td></tr>
<tr class="separator:a2975bc9272963c0333b08d288adaca7a"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aca7a8eb13cf442123f3a4189b27d83f1"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classripple_1_1Workers.html#aca7a8eb13cf442123f3a4189b27d83f1">m_allPaused</a></td></tr>
<tr class="separator:aca7a8eb13cf442123f3a4189b27d83f1"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ae595b0b93152d054b16d804066cc22bb"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespaceripple.html#a3d1073988f9cea389d752de1ffb8803d">semaphore</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classripple_1_1Workers.html#ae595b0b93152d054b16d804066cc22bb">m_semaphore</a></td></tr>
<tr class="separator:ae595b0b93152d054b16d804066cc22bb"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aac432fb6a913d937af37cff47de44bf3"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classripple_1_1Workers.html#aac432fb6a913d937af37cff47de44bf3">m_numberOfThreads</a></td></tr>
<tr class="separator:aac432fb6a913d937af37cff47de44bf3"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ad0266a1826d638d4d715ceb8b2441b76"><td class="memItemLeft" align="right" valign="top"><a class="elRef" href="http://en.cppreference.com/w/cpp/atomic/atomic.html">std::atomic</a>&lt; int &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classripple_1_1Workers.html#ad0266a1826d638d4d715ceb8b2441b76">m_activeCount</a></td></tr>
<tr class="separator:ad0266a1826d638d4d715ceb8b2441b76"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ad6f81ee7115e8654638dc5d73c4ffa6c"><td class="memItemLeft" align="right" valign="top"><a class="elRef" href="http://en.cppreference.com/w/cpp/atomic/atomic.html">std::atomic</a>&lt; int &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classripple_1_1Workers.html#ad6f81ee7115e8654638dc5d73c4ffa6c">m_pauseCount</a></td></tr>
<tr class="separator:ad6f81ee7115e8654638dc5d73c4ffa6c"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ae016b648511f4b8cb6fccf95b72dfc68"><td class="memItemLeft" align="right" valign="top"><a class="elRef" href="http://en.cppreference.com/w/cpp/atomic/atomic.html">std::atomic</a>&lt; int &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classripple_1_1Workers.html#ae016b648511f4b8cb6fccf95b72dfc68">m_runningTaskCount</a></td></tr>
<tr class="separator:ae016b648511f4b8cb6fccf95b72dfc68"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:abb1521ec9d4ec37ec9488c858e682f47"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classbeast_1_1LockFreeStack.html">beast::LockFreeStack</a>&lt; <a class="el" href="classripple_1_1Workers_1_1Worker.html">Worker</a> &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classripple_1_1Workers.html#abb1521ec9d4ec37ec9488c858e682f47">m_everyone</a></td></tr>
<tr class="separator:abb1521ec9d4ec37ec9488c858e682f47"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a7a1ec32f737f520240f0c07ac235cbb7"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classbeast_1_1LockFreeStack.html">beast::LockFreeStack</a>&lt; <a class="el" href="classripple_1_1Workers_1_1Worker.html">Worker</a>, <a class="el" href="structripple_1_1Workers_1_1PausedTag.html">PausedTag</a> &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classripple_1_1Workers.html#a7a1ec32f737f520240f0c07ac235cbb7">m_paused</a></td></tr>
<tr class="separator:a7a1ec32f737f520240f0c07ac235cbb7"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p><code><a class="el" href="classripple_1_1Workers.html" title="Workers is effectively a thread pool.">Workers</a></code> is effectively a thread pool. </p>
<p>The constructor takes a "callback" that has a <code>void processTask(int instance)</code> method, and a number of workers. It creates that many <code><a class="el" href="classripple_1_1Workers_1_1Worker.html">Worker</a></code>s and then waits for calls to <code><a class="el" href="classripple_1_1Workers.html#aa65a05362bb7c77d7679cefce91a1514" title="Add a task to be performed.">Workers::addTask()</a></code>. It holds a semaphore that counts the number of pending "tasks", and a condition variable for the event when the last worker pauses itself.</p>
<p>A "task" is just a call to the callback's <code>processTask</code> method. "Adding a task" means calling that method now, or remembering to call it in the future. This is implemented with a semaphore. If there are any workers waiting when a task is added, then one will be woken to claim the task. If not, then the next worker to wait on the semaphore will claim the task.</p>
<p>Creating a <code><a class="el" href="classripple_1_1Workers_1_1Worker.html">Worker</a></code> creates a thread that calls <code><a class="el" href="classripple_1_1Workers_1_1Worker.html#af22df5d3827a478181be99171dc05e45">Worker::run()</a></code>. When that thread enters <code><a class="el" href="classripple_1_1Workers_1_1Worker.html#af22df5d3827a478181be99171dc05e45">Worker::run</a></code>, it increments the count of active workers in the parent <code><a class="el" href="classripple_1_1Workers.html" title="Workers is effectively a thread pool.">Workers</a></code> object and then tries to claim a task, which blocks if there are none pending. It will be unblocked whenever the semaphore is notified (i.e. when the number of pending tasks is incremented). That only happens in two circumstances: (1) when <code><a class="el" href="classripple_1_1Workers.html#aa65a05362bb7c77d7679cefce91a1514" title="Add a task to be performed.">Workers::addTask</a></code> is called and (2) when <code><a class="el" href="classripple_1_1Workers.html" title="Workers is effectively a thread pool.">Workers</a></code> wants to pause some workers ("pause one worker" is considered one task), which happens when someone wants to stop the workers or shrink the threadpool. No worker threads are ever destroyed until <code><a class="el" href="classripple_1_1Workers.html" title="Workers is effectively a thread pool.">Workers</a></code> is destroyed; it merely pauses workers until then.</p>
<p>When a waiting worker is woken, it checks whether <code><a class="el" href="classripple_1_1Workers.html" title="Workers is effectively a thread pool.">Workers</a></code> is trying to pause workers. If so, it changes its status from active to paused and blocks on its own condition variable. If not, then it calls <code>processTask</code> on the "callback" held by <code><a class="el" href="classripple_1_1Workers.html" title="Workers is effectively a thread pool.">Workers</a></code>.</p>
<p>When a paused worker is woken, it checks whether it should exit. The signal to exit is only set in the destructor of <code><a class="el" href="classripple_1_1Workers_1_1Worker.html">Worker</a></code>, which unblocks the paused thread and waits for it to exit. A <code><a class="el" href="classripple_1_1Workers_1_1Worker.html#af22df5d3827a478181be99171dc05e45">Worker::run</a></code> thread checks whether it needs to exit only when it is woken from a pause (not when it is woken from waiting). This is why the destructor for <code><a class="el" href="classripple_1_1Workers.html" title="Workers is effectively a thread pool.">Workers</a></code> pauses all the workers before destroying them. </p>
<p class="definition">Definition at line <a class="el" href="Workers_8h_source.html#l00079">79</a> of file <a class="el" href="Workers_8h_source.html">Workers.h</a>.</p>
</div><h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
<a id="a2b7128de479945e72fca6f1fb069466f"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a2b7128de479945e72fca6f1fb069466f">&#9670;&nbsp;</a></span>Workers()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">ripple::Workers::Workers </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structripple_1_1Workers_1_1Callback.html">Callback</a> &amp;&#160;</td>
<td class="paramname"><em>callback</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="classripple_1_1perf_1_1PerfLog.html">perf::PerfLog</a> *&#160;</td>
<td class="paramname"><em>perfLog</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="elRef" href="http://en.cppreference.com/w/cpp/string/basic_string.html">std::string</a> const &amp;&#160;</td>
<td class="paramname"><em>threadNames</em> = <code>&quot;Worker&quot;</code>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>numberOfThreads</em> = <code>static_cast&lt;int&gt;(<a class="elRef" href="http://en.cppreference.com/w/cpp/thread/thread/hardware_concurrency.html">std::thread::hardware_concurrency</a>())</code>&#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">explicit</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Create the object. </p>
<p>A number of initial threads may be optionally specified. The default is to create one thread per CPU.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">threadNames</td><td>The name given to each created worker thread. </td></tr>
</table>
</dd>
</dl>
<p class="definition">Definition at line <a class="el" href="Workers_8cpp_source.html#l00027">27</a> of file <a class="el" href="Workers_8cpp_source.html">Workers.cpp</a>.</p>
</div>
</div>
<a id="a780ec448fd8944839c8baec628db5560"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a780ec448fd8944839c8baec628db5560">&#9670;&nbsp;</a></span>~Workers()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">ripple::Workers::~Workers </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="Workers_8cpp_source.html#l00045">45</a> of file <a class="el" href="Workers_8cpp_source.html">Workers.cpp</a>.</p>
</div>
</div>
<h2 class="groupheader">Member Function Documentation</h2>
<a id="a483ede0aed8ed080be82fcb62d79dd19"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a483ede0aed8ed080be82fcb62d79dd19">&#9670;&nbsp;</a></span>getNumberOfThreads()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">int ripple::Workers::getNumberOfThreads </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td> const</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">noexcept</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Retrieve the desired number of threads. </p>
<p>This just returns the number of active threads that were requested. If there was a recent call to setNumberOfThreads, the actual number of active threads may be temporarily different from what was last requested.</p>
<dl class="section note"><dt>Note</dt><dd>This function is not thread-safe. </dd></dl>
<p class="definition">Definition at line <a class="el" href="Workers_8cpp_source.html#l00053">53</a> of file <a class="el" href="Workers_8cpp_source.html">Workers.cpp</a>.</p>
</div>
</div>
<a id="aeb667770c498316bc4611932c768141d"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aeb667770c498316bc4611932c768141d">&#9670;&nbsp;</a></span>setNumberOfThreads()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void ripple::Workers::setNumberOfThreads </td>
<td>(</td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>numberOfThreads</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Set the desired number of threads. </p>
<dl class="section note"><dt>Note</dt><dd>This function is not thread-safe. </dd></dl>
<p class="definition">Definition at line <a class="el" href="Workers_8cpp_source.html#l00063">63</a> of file <a class="el" href="Workers_8cpp_source.html">Workers.cpp</a>.</p>
</div>
</div>
<a id="adc599a454f17df95852e20139e98eea8"></a>
<h2 class="memtitle"><span class="permalink"><a href="#adc599a454f17df95852e20139e98eea8">&#9670;&nbsp;</a></span>stop()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void ripple::Workers::stop </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Pause all threads and wait until they are paused. </p>
<p>If a thread is processing a task it will pause as soon as the task completes. There may still be tasks signaled even after all threads have paused.</p>
<dl class="section note"><dt>Note</dt><dd>This function is not thread-safe. </dd></dl>
<p class="definition">Definition at line <a class="el" href="Workers_8cpp_source.html#l00114">114</a> of file <a class="el" href="Workers_8cpp_source.html">Workers.cpp</a>.</p>
</div>
</div>
<a id="aa65a05362bb7c77d7679cefce91a1514"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aa65a05362bb7c77d7679cefce91a1514">&#9670;&nbsp;</a></span>addTask()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void ripple::Workers::addTask </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Add a task to be performed. </p>
<p>Every call to addTask will eventually result in a call to <a class="el" href="structripple_1_1Workers_1_1Callback.html#aaf9d435c1413c9a7ac8f662518e16312" title="Perform a task.">Callback::processTask</a> unless the <a class="el" href="classripple_1_1Workers.html" title="Workers is effectively a thread pool.">Workers</a> object is destroyed or the number of threads is never set above zero.</p>
<dl class="section note"><dt>Note</dt><dd>This function is thread-safe. </dd></dl>
<p class="definition">Definition at line <a class="el" href="Workers_8cpp_source.html#l00126">126</a> of file <a class="el" href="Workers_8cpp_source.html">Workers.cpp</a>.</p>
</div>
</div>
<a id="a8cb80967484f0d91c3125e364091d419"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a8cb80967484f0d91c3125e364091d419">&#9670;&nbsp;</a></span>numberOfCurrentlyRunningTasks()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">int ripple::Workers::numberOfCurrentlyRunningTasks </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td> const</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">noexcept</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Get the number of currently executing calls of <a class="el" href="structripple_1_1Workers_1_1Callback.html#aaf9d435c1413c9a7ac8f662518e16312" title="Perform a task.">Callback::processTask</a>. </p>
<p>While this function is thread-safe, the value may not stay accurate for very long. It's mainly for diagnostic purposes. </p>
<p class="definition">Definition at line <a class="el" href="Workers_8cpp_source.html#l00132">132</a> of file <a class="el" href="Workers_8cpp_source.html">Workers.cpp</a>.</p>
</div>
</div>
<a id="a5f6a6068ef793a580da7aa31a873a804"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a5f6a6068ef793a580da7aa31a873a804">&#9670;&nbsp;</a></span>deleteWorkers()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">void ripple::Workers::deleteWorkers </td>
<td>(</td>
<td class="paramtype"><a class="el" href="classbeast_1_1LockFreeStack.html">beast::LockFreeStack</a>&lt; <a class="el" href="classripple_1_1Workers_1_1Worker.html">Worker</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>stack</em></td><td>)</td>
<td></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 class="definition">Definition at line <a class="el" href="Workers_8cpp_source.html#l00138">138</a> of file <a class="el" href="Workers_8cpp_source.html">Workers.cpp</a>.</p>
</div>
</div>
<h2 class="groupheader">Member Data Documentation</h2>
<a id="a4e1c3aacc2ac4dd64b84075e5aeca0b2"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a4e1c3aacc2ac4dd64b84075e5aeca0b2">&#9670;&nbsp;</a></span>m_callback</h2>
<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="structripple_1_1Workers_1_1Callback.html">Callback</a>&amp; ripple::Workers::m_callback</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="Workers_8h_source.html#l00218">218</a> of file <a class="el" href="Workers_8h_source.html">Workers.h</a>.</p>
</div>
</div>
<a id="addb401754309403bc8a604f1dd7cfdf3"></a>
<h2 class="memtitle"><span class="permalink"><a href="#addb401754309403bc8a604f1dd7cfdf3">&#9670;&nbsp;</a></span>perfLog_</h2>
<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="classripple_1_1perf_1_1PerfLog.html">perf::PerfLog</a>* ripple::Workers::perfLog_</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="Workers_8h_source.html#l00219">219</a> of file <a class="el" href="Workers_8h_source.html">Workers.h</a>.</p>
</div>
</div>
<a id="ab5e3a1411baa39373e04b428629d06c2"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ab5e3a1411baa39373e04b428629d06c2">&#9670;&nbsp;</a></span>m_threadNames</h2>
<div class="memitem">
<div class="memproto">
<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/string/basic_string.html">std::string</a> ripple::Workers::m_threadNames</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="Workers_8h_source.html#l00220">220</a> of file <a class="el" href="Workers_8h_source.html">Workers.h</a>.</p>
</div>
</div>
<a id="a3e0b864f32dddc4e7680ae1b561eca2e"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a3e0b864f32dddc4e7680ae1b561eca2e">&#9670;&nbsp;</a></span>m_cv</h2>
<div class="memitem">
<div class="memproto">
<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/thread/condition_variable.html">std::condition_variable</a> ripple::Workers::m_cv</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="Workers_8h_source.html#l00221">221</a> of file <a class="el" href="Workers_8h_source.html">Workers.h</a>.</p>
</div>
</div>
<a id="a2975bc9272963c0333b08d288adaca7a"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a2975bc9272963c0333b08d288adaca7a">&#9670;&nbsp;</a></span>m_mut</h2>
<div class="memitem">
<div class="memproto">
<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/thread/mutex.html">std::mutex</a> ripple::Workers::m_mut</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="Workers_8h_source.html#l00222">222</a> of file <a class="el" href="Workers_8h_source.html">Workers.h</a>.</p>
</div>
</div>
<a id="aca7a8eb13cf442123f3a4189b27d83f1"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aca7a8eb13cf442123f3a4189b27d83f1">&#9670;&nbsp;</a></span>m_allPaused</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">bool ripple::Workers::m_allPaused</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="Workers_8h_source.html#l00223">223</a> of file <a class="el" href="Workers_8h_source.html">Workers.h</a>.</p>
</div>
</div>
<a id="ae595b0b93152d054b16d804066cc22bb"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ae595b0b93152d054b16d804066cc22bb">&#9670;&nbsp;</a></span>m_semaphore</h2>
<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="namespaceripple.html#a3d1073988f9cea389d752de1ffb8803d">semaphore</a> ripple::Workers::m_semaphore</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="Workers_8h_source.html#l00224">224</a> of file <a class="el" href="Workers_8h_source.html">Workers.h</a>.</p>
</div>
</div>
<a id="aac432fb6a913d937af37cff47de44bf3"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aac432fb6a913d937af37cff47de44bf3">&#9670;&nbsp;</a></span>m_numberOfThreads</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">int ripple::Workers::m_numberOfThreads</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="Workers_8h_source.html#l00225">225</a> of file <a class="el" href="Workers_8h_source.html">Workers.h</a>.</p>
</div>
</div>
<a id="ad0266a1826d638d4d715ceb8b2441b76"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad0266a1826d638d4d715ceb8b2441b76">&#9670;&nbsp;</a></span>m_activeCount</h2>
<div class="memitem">
<div class="memproto">
<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>&lt;int&gt; ripple::Workers::m_activeCount</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="Workers_8h_source.html#l00226">226</a> of file <a class="el" href="Workers_8h_source.html">Workers.h</a>.</p>
</div>
</div>
<a id="ad6f81ee7115e8654638dc5d73c4ffa6c"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad6f81ee7115e8654638dc5d73c4ffa6c">&#9670;&nbsp;</a></span>m_pauseCount</h2>
<div class="memitem">
<div class="memproto">
<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>&lt;int&gt; ripple::Workers::m_pauseCount</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="Workers_8h_source.html#l00227">227</a> of file <a class="el" href="Workers_8h_source.html">Workers.h</a>.</p>
</div>
</div>
<a id="ae016b648511f4b8cb6fccf95b72dfc68"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ae016b648511f4b8cb6fccf95b72dfc68">&#9670;&nbsp;</a></span>m_runningTaskCount</h2>
<div class="memitem">
<div class="memproto">
<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>&lt;int&gt; ripple::Workers::m_runningTaskCount</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="Workers_8h_source.html#l00229">229</a> of file <a class="el" href="Workers_8h_source.html">Workers.h</a>.</p>
</div>
</div>
<a id="abb1521ec9d4ec37ec9488c858e682f47"></a>
<h2 class="memtitle"><span class="permalink"><a href="#abb1521ec9d4ec37ec9488c858e682f47">&#9670;&nbsp;</a></span>m_everyone</h2>
<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="classbeast_1_1LockFreeStack.html">beast::LockFreeStack</a>&lt;<a class="el" href="classripple_1_1Workers_1_1Worker.html">Worker</a>&gt; ripple::Workers::m_everyone</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="Workers_8h_source.html#l00230">230</a> of file <a class="el" href="Workers_8h_source.html">Workers.h</a>.</p>
</div>
</div>
<a id="a7a1ec32f737f520240f0c07ac235cbb7"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a7a1ec32f737f520240f0c07ac235cbb7">&#9670;&nbsp;</a></span>m_paused</h2>
<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="classbeast_1_1LockFreeStack.html">beast::LockFreeStack</a>&lt;<a class="el" href="classripple_1_1Workers_1_1Worker.html">Worker</a>, <a class="el" href="structripple_1_1Workers_1_1PausedTag.html">PausedTag</a>&gt; ripple::Workers::m_paused</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="Workers_8h_source.html#l00232">232</a> of file <a class="el" href="Workers_8h_source.html">Workers.h</a>.</p>
</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.17
</small></address>
</body>
</html>