Welcome to mirror list, hosted at ThFree Co, Russian Federation.

classllfio__v2__xxx_1_1dynamic__thread__pool__group_1_1io__aware__work__item.html - github.com/windirstat/llfio.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: a655390988a005da7d4a780e0e77c3eae41601e5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
<!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>LLFIO: llfio_v2_xxx::dynamic_thread_pool_group::io_aware_work_item 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="navtreedata.js"></script>
<script type="text/javascript" src="navtree.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">LLFIO
   &#160;<span id="projectnumber">v2.00 late beta</span>
   </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>
</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">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(document).ready(function(){initNavTree('classllfio__v2__xxx_1_1dynamic__thread__pool__group_1_1io__aware__work__item.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div class="header">
  <div class="summary">
<a href="#nested-classes">Classes</a> &#124;
<a href="#pub-methods">Public Member Functions</a> &#124;
<a href="#pub-attribs">Public Attributes</a> &#124;
<a href="#pro-methods">Protected Member Functions</a> &#124;
<a href="classllfio__v2__xxx_1_1dynamic__thread__pool__group_1_1io__aware__work__item-members.html">List of all members</a>  </div>
  <div class="headertitle">
<div class="title">llfio_v2_xxx::dynamic_thread_pool_group::io_aware_work_item Class Reference<span class="mlabels"><span class="mlabel">abstract</span></span></div>  </div>
</div><!--header-->
<div class="contents">

<p>A work item which paces when it next executes according to i/o congestion.  
 <a href="classllfio__v2__xxx_1_1dynamic__thread__pool__group_1_1io__aware__work__item.html#details">More...</a></p>

<p><code>#include &quot;dynamic_thread_pool_group.hpp&quot;</code></p>
<div class="dynheader">
Inheritance diagram for llfio_v2_xxx::dynamic_thread_pool_group::io_aware_work_item:</div>
<div class="dyncontent">
 <div class="center">
  <img src="classllfio__v2__xxx_1_1dynamic__thread__pool__group_1_1io__aware__work__item.png" usemap="#llfio_5Fv2_5Fxxx::dynamic_5Fthread_5Fpool_5Fgroup::io_5Faware_5Fwork_5Fitem_map" alt=""/>
  <map id="llfio_5Fv2_5Fxxx::dynamic_5Fthread_5Fpool_5Fgroup::io_5Faware_5Fwork_5Fitem_map" name="llfio_5Fv2_5Fxxx::dynamic_5Fthread_5Fpool_5Fgroup::io_5Faware_5Fwork_5Fitem_map">
<area href="classllfio__v2__xxx_1_1dynamic__thread__pool__group_1_1work__item.html" title="An individual item of work within the work group." alt="llfio_v2_xxx::dynamic_thread_pool_group::work_item" shape="rect" coords="0,0,366,24"/>
  </map>
</div></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="structllfio__v2__xxx_1_1dynamic__thread__pool__group_1_1io__aware__work__item_1_1io__handle__awareness.html">io_handle_awareness</a></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Information about an i/o handle this work item will use.  <a href="structllfio__v2__xxx_1_1dynamic__thread__pool__group_1_1io__aware__work__item_1_1io__handle__awareness.html#details">More...</a><br /></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:a9df0ab84dd9f69b40b9117a79c8eca78"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classllfio__v2__xxx_1_1dynamic__thread__pool__group_1_1io__aware__work__item.html#a9df0ab84dd9f69b40b9117a79c8eca78">io_aware_work_item</a> (span&lt; <a class="el" href="structllfio__v2__xxx_1_1dynamic__thread__pool__group_1_1io__aware__work__item_1_1io__handle__awareness.html">io_handle_awareness</a> &gt; hs)</td></tr>
<tr class="memdesc:a9df0ab84dd9f69b40b9117a79c8eca78"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructs a work item aware of i/o done to the handles in <code>hs</code>.  <a href="classllfio__v2__xxx_1_1dynamic__thread__pool__group_1_1io__aware__work__item.html#a9df0ab84dd9f69b40b9117a79c8eca78">More...</a><br /></td></tr>
<tr class="separator:a9df0ab84dd9f69b40b9117a79c8eca78"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aa090c92e4adf339d8092465934b82f03"><td class="memItemLeft" align="right" valign="top"><a id="aa090c92e4adf339d8092465934b82f03"></a>
&#160;</td><td class="memItemRight" valign="bottom"><b>io_aware_work_item</b> (<a class="el" href="classllfio__v2__xxx_1_1dynamic__thread__pool__group_1_1io__aware__work__item.html">io_aware_work_item</a> &amp;&amp;o) noexcept</td></tr>
<tr class="separator:aa090c92e4adf339d8092465934b82f03"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a0d45637f8c603e9f132f99d7c539ee22"><td class="memItemLeft" align="right" valign="top"><a id="a0d45637f8c603e9f132f99d7c539ee22"></a>
span&lt; <a class="el" href="structllfio__v2__xxx_1_1dynamic__thread__pool__group_1_1io__aware__work__item_1_1io__handle__awareness.html">io_handle_awareness</a> &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classllfio__v2__xxx_1_1dynamic__thread__pool__group_1_1io__aware__work__item.html#a0d45637f8c603e9f132f99d7c539ee22">handles</a> () const noexcept</td></tr>
<tr class="memdesc:a0d45637f8c603e9f132f99d7c539ee22"><td class="mdescLeft">&#160;</td><td class="mdescRight">The handles originally registered during construction. <br /></td></tr>
<tr class="separator:a0d45637f8c603e9f132f99d7c539ee22"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ab92cec481e76ed36075100c0bf9f8821"><td class="memItemLeft" align="right" valign="top"><a id="ab92cec481e76ed36075100c0bf9f8821"></a>
virtual intptr_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classllfio__v2__xxx_1_1dynamic__thread__pool__group_1_1io__aware__work__item.html#ab92cec481e76ed36075100c0bf9f8821">io_aware_next</a> (<a class="el" href="structllfio__v2__xxx_1_1deadline.html">deadline</a> &amp;d) noexcept=0</td></tr>
<tr class="memdesc:ab92cec481e76ed36075100c0bf9f8821"><td class="mdescLeft">&#160;</td><td class="mdescRight">As for <code>work_item::next()</code>, but deadline may be extended to reduce i/o congestion on the hardware devices to which the handles refer. <br /></td></tr>
<tr class="separator:ab92cec481e76ed36075100c0bf9f8821"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aee890b7a94a8d7a24e9b55aef8177c49"><td class="memItemLeft" align="right" valign="top"><a id="aee890b7a94a8d7a24e9b55aef8177c49"></a>
<a class="el" href="classllfio__v2__xxx_1_1dynamic__thread__pool__group.html">dynamic_thread_pool_group</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classllfio__v2__xxx_1_1dynamic__thread__pool__group_1_1work__item.html#aee890b7a94a8d7a24e9b55aef8177c49">parent</a> () const noexcept</td></tr>
<tr class="memdesc:aee890b7a94a8d7a24e9b55aef8177c49"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the parent work group between successful submission and just before <code>group_complete()</code>. <br /></td></tr>
<tr class="separator:aee890b7a94a8d7a24e9b55aef8177c49"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a68e317002adf480e0a4c076410e35e8e"><td class="memItemLeft" align="right" valign="top">virtual result&lt; void &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classllfio__v2__xxx_1_1dynamic__thread__pool__group_1_1work__item.html#a68e317002adf480e0a4c076410e35e8e">operator()</a> (intptr_t work) noexcept=0</td></tr>
<tr class="separator:a68e317002adf480e0a4c076410e35e8e"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ae8d6ba54f52e216edd37474f19731fd8"><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classllfio__v2__xxx_1_1dynamic__thread__pool__group_1_1work__item.html#ae8d6ba54f52e216edd37474f19731fd8">group_complete</a> (const result&lt; void &gt; &amp;cancelled) noexcept</td></tr>
<tr class="separator:ae8d6ba54f52e216edd37474f19731fd8"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
Public Attributes</h2></td></tr>
<tr class="memitem:a5860206701c43b7035475dc3f62a23ef"><td class="memItemLeft" align="right" valign="top"><a id="a5860206701c43b7035475dc3f62a23ef"></a>
float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classllfio__v2__xxx_1_1dynamic__thread__pool__group_1_1io__aware__work__item.html#a5860206701c43b7035475dc3f62a23ef">max_iosbusytime</a> {0.95f}</td></tr>
<tr class="memdesc:a5860206701c43b7035475dc3f62a23ef"><td class="mdescLeft">&#160;</td><td class="mdescRight">Maximum i/o busyness above which throttling is to begin. <br /></td></tr>
<tr class="separator:a5860206701c43b7035475dc3f62a23ef"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a81540923522973756560e20c44a0e948"><td class="memItemLeft" align="right" valign="top"><a id="a81540923522973756560e20c44a0e948"></a>
uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classllfio__v2__xxx_1_1dynamic__thread__pool__group_1_1io__aware__work__item.html#a81540923522973756560e20c44a0e948">min_iosinprogress</a> {16}</td></tr>
<tr class="memdesc:a81540923522973756560e20c44a0e948"><td class="mdescLeft">&#160;</td><td class="mdescRight">Minimum i/o in progress to target if <code>iosbusytime</code> exceeded. The default of 16 suits SSDs, you want around 4 for spinning rust or NV-RAM. <br /></td></tr>
<tr class="separator:a81540923522973756560e20c44a0e948"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a240b9e4d3d0ee510c46347e735185688"><td class="memItemLeft" align="right" valign="top"><a id="a240b9e4d3d0ee510c46347e735185688"></a>
uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classllfio__v2__xxx_1_1dynamic__thread__pool__group_1_1io__aware__work__item.html#a240b9e4d3d0ee510c46347e735185688">max_iosinprogress</a> {32}</td></tr>
<tr class="memdesc:a240b9e4d3d0ee510c46347e735185688"><td class="mdescLeft">&#160;</td><td class="mdescRight">Maximum i/o in progress to target if <code>iosbusytime</code> exceeded. The default of 32 suits SSDs, you want around 8 for spinning rust or NV-RAM. <br /></td></tr>
<tr class="separator:a240b9e4d3d0ee510c46347e735185688"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pro-methods"></a>
Protected Member Functions</h2></td></tr>
<tr class="memitem:aa6641deb837cc77540b1a9bdf41afa6f"><td class="memItemLeft" align="right" valign="top"><a id="aa6641deb837cc77540b1a9bdf41afa6f"></a>
constexpr bool&#160;</td><td class="memItemRight" valign="bottom"><b>_has_timer_set_relative</b> () const noexcept</td></tr>
<tr class="separator:aa6641deb837cc77540b1a9bdf41afa6f"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a1c2850bf3778d32c335eace1f05ea3b7"><td class="memItemLeft" align="right" valign="top"><a id="a1c2850bf3778d32c335eace1f05ea3b7"></a>
constexpr bool&#160;</td><td class="memItemRight" valign="bottom"><b>_has_timer_set_absolute</b> () const noexcept</td></tr>
<tr class="separator:a1c2850bf3778d32c335eace1f05ea3b7"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a2c49153ff193f7b3d948eec37b5509f7"><td class="memItemLeft" align="right" valign="top"><a id="a2c49153ff193f7b3d948eec37b5509f7"></a>
constexpr bool&#160;</td><td class="memItemRight" valign="bottom"><b>_has_timer_set</b> () const noexcept</td></tr>
<tr class="separator:a2c49153ff193f7b3d948eec37b5509f7"><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>A work item which paces when it next executes according to i/o congestion. </p>
<p>Currently there is only a working implementation of this for the Microsoft Windows and Linux platforms, due to lack of working <code>statfs_t::f_iosinprogress</code> on other platforms. If retrieving that for a seekable handle does not work, the constructor throws an exception.</p>
<p>For seekable handles, currently <code>reads</code>, <code>writes</code> and <code>barriers</code> are ignored. We simply retrieve, periodically, <code>statfs_t::f_iosinprogress</code> and <code>statfs_t::f_iosbusytime</code> for the storage devices backing the seekable handle. If the recent averaged i/o wait time exceeds <code>max_iosbusytime</code> and the i/o in progress &gt; <code>max_iosinprogress</code>, <code>next()</code> will start setting the default deadline passed to <code>io_aware_next()</code>. Thereafter, every 1/10th of a second, if <code>statfs_t::f_iosinprogress</code> is above <code>max_iosinprogress</code>, it will increase the deadline by 1/16th, whereas if it is below <code>min_iosinprogress</code>, it will decrease the deadline by 1/16th. The default deadline chosen is always the worst of all the storage devices of all the handles. This will reduce concurrency within the kernel thread pool in order to reduce congestion on the storage devices. If at any point <code>statfs_t::f_iosbusytime</code> drops below <code>max_iosbusytime</code> as averaged across one second, and <code>statfs_t::f_iosinprogress</code> drops below <code>min_iosinprogress</code>, the additional throttling is completely removed. <code>io_aware_next()</code> can ignore the default deadline passed into it, and can set any other deadline.</p>
<p>For non-seekable handles, the handle must have an i/o multiplexer set upon it, and on Microsoft Windows, that i/o multiplexer must be utilising the IOCP instance of the global Win32 thread pool. For each <code>reads</code>, <code>writes</code> and <code>barriers</code> which is non-zero, a corresponding zero length i/o is constructed and initiated. When the i/o completes, and all readable handles in the work item's set have data waiting to be read, and all writable handles in the work item's set have space to allow writes, only then is the work item invoked with the next piece of work.</p>
<dl class="section note"><dt>Note</dt><dd>Non-seekable handle support is not implemented yet. </dd></dl>
</div><h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
<a id="a9df0ab84dd9f69b40b9117a79c8eca78"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a9df0ab84dd9f69b40b9117a79c8eca78">&#9670;&nbsp;</a></span>io_aware_work_item()</h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname">llfio_v2_xxx::dynamic_thread_pool_group::io_aware_work_item::io_aware_work_item </td>
          <td>(</td>
          <td class="paramtype">span&lt; <a class="el" href="structllfio__v2__xxx_1_1dynamic__thread__pool__group_1_1io__aware__work__item_1_1io__handle__awareness.html">io_handle_awareness</a> &gt;&#160;</td>
          <td class="paramname"><em>hs</em></td><td>)</td>
          <td></td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">explicit</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">

<p>Constructs a work item aware of i/o done to the handles in <code>hs</code>. </p>
<p>Note that the <code>reads</code>, <code>writes</code> and <code>barriers</code> are normalised to proportions out of <code>1.0</code> by this constructor, so if for example you had <code>reads/writes/barriers = 200/100/0</code>, after normalisation those become <code>0.66/0.33/0.0</code> such that the total is <code>1.0</code>. If <code>reads/writes/barriers = 0/0/0</code> on entry, they are replaced with <code>0.5/0.5/0.0</code>.</p>
<p>Note that normalisation is across <em>all</em> i/o handles in the set, so three handles each with <code>reads/writes/barriers = 200/100/0</code> on entry would have <code>0.22/0.11/0.0</code> each after construction. </p>

</div>
</div>
<h2 class="groupheader">Member Function Documentation</h2>
<a id="ae8d6ba54f52e216edd37474f19731fd8"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ae8d6ba54f52e216edd37474f19731fd8">&#9670;&nbsp;</a></span>group_complete()</h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname">virtual void llfio_v2_xxx::dynamic_thread_pool_group::work_item::group_complete </td>
          <td>(</td>
          <td class="paramtype">const result&lt; void &gt; &amp;&#160;</td>
          <td class="paramname"><em>cancelled</em></td><td>)</td>
          <td></td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">virtual</span><span class="mlabel">noexcept</span><span class="mlabel">inherited</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">
<p>Invoked by the i/o thread pool when all work in this thread pool group is complete.</p>
<p><code>cancelled</code> indicates if this is an abnormal completion. If its error compares equal to <code>errc::operation_cancelled</code>, then <code>stop()</code> was called.</p>
<p>Just before this is called for all work items submitted, the group becomes reset to fresh, and <code>parent()</code> becomes null. You can resubmit this work item, but do not submit other work items until their <code>group_complete()</code> has been invoked.</p>
<p>Note that this function is called from multiple kernel threads.</p>
<p><code>dynamic_thread_pool_group::current_work_item()</code> may have any value during this call. </p>
<div class="fragment"><div class="line"><a name="l00315"></a><span class="lineno">  315</span>&#160;{ (void) cancelled; }</div>
</div><!-- fragment -->
</div>
</div>
<a id="a68e317002adf480e0a4c076410e35e8e"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a68e317002adf480e0a4c076410e35e8e">&#9670;&nbsp;</a></span>operator()()</h2>

<div class="memitem">
<div class="memproto">
<table class="mlabels">
  <tr>
  <td class="mlabels-left">
      <table class="memname">
        <tr>
          <td class="memname">virtual result&lt;void&gt; llfio_v2_xxx::dynamic_thread_pool_group::work_item::operator() </td>
          <td>(</td>
          <td class="paramtype">intptr_t&#160;</td>
          <td class="paramname"><em>work</em></td><td>)</td>
          <td></td>
        </tr>
      </table>
  </td>
  <td class="mlabels-right">
<span class="mlabels"><span class="mlabel">pure virtual</span><span class="mlabel">noexcept</span><span class="mlabel">inherited</span></span>  </td>
  </tr>
</table>
</div><div class="memdoc">
<p>Invoked by the i/o thread pool to perform the next item of work.</p>
<dl class="section return"><dt>Returns</dt><dd>Any failure causes all remaining work in this group to be cancelled as soon as possible. </dd></dl>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">work</td><td>The value returned by <code>next()</code>.</td></tr>
  </table>
  </dd>
</dl>
<p>Note that this function is called from multiple kernel threads, and may not be the kernel thread from which <code>next()</code> was called.</p>
<p><code>dynamic_thread_pool_group::current_work_item()</code> will always be <code>this</code> during this call. </p>

</div>
</div>
<hr/>The documentation for this class was generated from the following file:<ul>
<li>include/llfio/v2.0/dynamic_thread_pool_group.hpp</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="namespacellfio__v2__xxx.html">llfio_v2_xxx</a></li><li class="navelem"><a class="el" href="classllfio__v2__xxx_1_1dynamic__thread__pool__group.html">dynamic_thread_pool_group</a></li><li class="navelem"><a class="el" href="classllfio__v2__xxx_1_1dynamic__thread__pool__group_1_1io__aware__work__item.html">io_aware_work_item</a></li>
    <li class="footer">Generated by
    <a href="http://www.doxygen.org/index.html">
    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.17 </li>
  </ul>
</div>
</body>
</html>