• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<html>
2<head>
3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
4<title>Stack allocation</title>
5<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css">
6<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
7<link rel="home" href="../index.html" title="Chapter 1. Fiber">
8<link rel="up" href="../index.html" title="Chapter 1. Fiber">
9<link rel="prev" href="scheduling.html" title="Scheduling">
10<link rel="next" href="stack/valgrind.html" title="Support for valgrind">
11</head>
12<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
13<table cellpadding="2" width="100%"><tr>
14<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td>
15<td align="center"><a href="../../../../../index.html">Home</a></td>
16<td align="center"><a href="../../../../../libs/libraries.htm">Libraries</a></td>
17<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
18<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
19<td align="center"><a href="../../../../../more/index.htm">More</a></td>
20</tr></table>
21<hr>
22<div class="spirit-nav">
23<a accesskey="p" href="scheduling.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="stack/valgrind.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
24</div>
25<div class="section">
26<div class="titlepage"><div><div><h2 class="title" style="clear: both">
27<a name="fiber.stack"></a><a name="stack"></a><a class="link" href="stack.html" title="Stack allocation">Stack allocation</a>
28</h2></div></div></div>
29<div class="toc"><dl class="toc">
30<dt><span class="section"><a href="stack/valgrind.html">Support for valgrind</a></span></dt>
31<dt><span class="section"><a href="stack/sanitizers.html">Support for sanitizers</a></span></dt>
32</dl></div>
33<p>
34      A <a class="link" href="fiber_mgmt/fiber.html#class_fiber"><code class="computeroutput">fiber</code></a> uses internally an __econtext__ which manages a set of registers
35      and a stack. The memory used by the stack is allocated/deallocated via a <span class="emphasis"><em>stack_allocator</em></span>
36      which is required to model a <a class="link" href="stack.html#stack_allocator_concept"><span class="emphasis"><em>stack-allocator
37      concept</em></span></a>.
38    </p>
39<p>
40      A <span class="emphasis"><em>stack_allocator</em></span> can be passed to <a class="link" href="fiber_mgmt/fiber.html#fiber_fiber"><code class="computeroutput"><span class="identifier">fiber</span><span class="special">::</span><span class="identifier">fiber</span><span class="special">()</span></code></a> or to <a class="link" href="synchronization/futures/future.html#fibers_async"><code class="computeroutput">fibers::async()</code></a>.
41    </p>
42<a name="stack_allocator_concept"></a><h4>
43<a name="fiber.stack.h0"></a>
44      <span class="phrase"><a name="fiber.stack.stack_allocator_concept"></a></span><a class="link" href="stack.html#fiber.stack.stack_allocator_concept">stack-allocator
45      concept</a>
46    </h4>
47<p>
48      A <span class="emphasis"><em>stack_allocator</em></span> must satisfy the <span class="emphasis"><em>stack-allocator
49      concept</em></span> requirements shown in the following table, in which <code class="computeroutput"><span class="identifier">a</span></code> is an object of a <span class="emphasis"><em>stack_allocator</em></span>
50      type, <code class="computeroutput"><span class="identifier">sctx</span></code> is a <a href="http://www.boost.org/doc/libs/release/libs/context/doc/html/context/stack/stack_context.html" target="_top"><code class="computeroutput"><span class="identifier">stack_context</span></code></a>, and <code class="computeroutput"><span class="identifier">size</span></code> is a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span></code>:
51    </p>
52<div class="informaltable"><table class="table">
53<colgroup>
54<col>
55<col>
56<col>
57</colgroup>
58<thead><tr>
59<th>
60              <p>
61                expression
62              </p>
63            </th>
64<th>
65              <p>
66                return type
67              </p>
68            </th>
69<th>
70              <p>
71                notes
72              </p>
73            </th>
74</tr></thead>
75<tbody>
76<tr>
77<td>
78              <p>
79                <code class="computeroutput"><span class="identifier">a</span><span class="special">(</span><span class="identifier">size</span><span class="special">)</span></code>
80              </p>
81            </td>
82<td>
83            </td>
84<td>
85              <p>
86                creates a stack allocator
87              </p>
88            </td>
89</tr>
90<tr>
91<td>
92              <p>
93                <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">allocate</span><span class="special">()</span></code>
94              </p>
95            </td>
96<td>
97              <p>
98                <a href="http://www.boost.org/doc/libs/release/libs/context/doc/html/context/stack/stack_context.html" target="_top"><code class="computeroutput"><span class="identifier">stack_context</span></code></a>
99              </p>
100            </td>
101<td>
102              <p>
103                creates a stack
104              </p>
105            </td>
106</tr>
107<tr>
108<td>
109              <p>
110                <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">deallocate</span><span class="special">(</span>
111                <span class="identifier">sctx</span><span class="special">)</span></code>
112              </p>
113            </td>
114<td>
115              <p>
116                <code class="computeroutput"><span class="keyword">void</span></code>
117              </p>
118            </td>
119<td>
120              <p>
121                deallocates the stack created by <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">allocate</span><span class="special">()</span></code>
122              </p>
123            </td>
124</tr>
125</tbody>
126</table></div>
127<div class="important"><table border="0" summary="Important">
128<tr>
129<td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../../../doc/src/images/important.png"></td>
130<th align="left">Important</th>
131</tr>
132<tr><td align="left" valign="top"><p>
133        The implementation of <code class="computeroutput"><span class="identifier">allocate</span><span class="special">()</span></code> might include logic to protect against
134        exceeding the context's available stack size rather than leaving it as undefined
135        behaviour.
136      </p></td></tr>
137</table></div>
138<div class="important"><table border="0" summary="Important">
139<tr>
140<td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../../../doc/src/images/important.png"></td>
141<th align="left">Important</th>
142</tr>
143<tr><td align="left" valign="top"><p>
144        Calling <code class="computeroutput"><span class="identifier">deallocate</span><span class="special">()</span></code>
145        with a <a href="http://www.boost.org/doc/libs/release/libs/context/doc/html/context/stack/stack_context.html" target="_top"><code class="computeroutput"><span class="identifier">stack_context</span></code></a> not obtained from
146        <code class="computeroutput"><span class="identifier">allocate</span><span class="special">()</span></code>
147        results in undefined behaviour.
148      </p></td></tr>
149</table></div>
150<div class="note"><table border="0" summary="Note">
151<tr>
152<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td>
153<th align="left">Note</th>
154</tr>
155<tr><td align="left" valign="top"><p>
156        The memory for the stack is not required to be aligned; alignment takes place
157        inside __econtext__.
158      </p></td></tr>
159</table></div>
160<p>
161      See also <a href="http://www.boost.org/doc/libs/release/libs/context/doc/html/context/stack.html" target="_top">Boost.Context
162      stack allocation</a>. In particular, <code class="computeroutput"><span class="identifier">traits_type</span></code>
163      methods are as described for <a href="http://www.boost.org/doc/libs/release/libs/context/doc/html/context/stack/stack_traits.html" target="_top"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">context</span><span class="special">::</span><span class="identifier">stack_traits</span></code></a>.
164    </p>
165<p>
166      </p>
167<h5>
168<a name="class_protected_fixedsize_stack_bridgehead"></a>
169  <span class="phrase"><a name="class_protected_fixedsize_stack"></a></span>
170  <a class="link" href="stack.html#class_protected_fixedsize_stack">Class
171      <code class="computeroutput">protected_fixedsize_stack</code></a>
172</h5>
173<p>
174    </p>
175<p>
176      <span class="bold"><strong>Boost.Fiber</strong></span> provides the class <a class="link" href="stack.html#class_protected_fixedsize_stack"><code class="computeroutput">protected_fixedsize_stack</code></a> which
177      models the <a class="link" href="stack.html#stack_allocator_concept"><span class="emphasis"><em>stack-allocator
178      concept</em></span></a>. It appends a guard page at the end of each stack
179      to protect against exceeding the stack. If the guard page is accessed (read
180      or write operation) a segmentation fault/access violation is generated by the
181      operating system.
182    </p>
183<div class="important"><table border="0" summary="Important">
184<tr>
185<td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../../../doc/src/images/important.png"></td>
186<th align="left">Important</th>
187</tr>
188<tr><td align="left" valign="top"><p>
189        Using <a class="link" href="stack.html#class_protected_fixedsize_stack"><code class="computeroutput">protected_fixedsize_stack</code></a> is expensive.
190        Launching a new fiber with a stack of this type incurs the overhead of setting
191        the memory protection; once allocated, this stack is just as efficient to
192        use as <a class="link" href="stack.html#class_fixedsize_stack"><code class="computeroutput">fixedsize_stack</code></a>.
193      </p></td></tr>
194</table></div>
195<div class="note"><table border="0" summary="Note">
196<tr>
197<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td>
198<th align="left">Note</th>
199</tr>
200<tr><td align="left" valign="top"><p>
201        The appended <code class="computeroutput"><span class="identifier">guard</span> <span class="identifier">page</span></code>
202        is <span class="bold"><strong>not</strong></span> mapped to physical memory, only virtual
203        addresses are used.
204      </p></td></tr>
205</table></div>
206<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">fiber</span><span class="special">/</span><span class="identifier">protected_fixedsize</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
207
208<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
209<span class="keyword">namespace</span> <span class="identifier">fibers</span> <span class="special">{</span>
210
211<span class="keyword">struct</span> <span class="identifier">protected_fixedsize</span> <span class="special">{</span>
212    <span class="identifier">protected_fixesize</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">size</span> <span class="special">=</span> <span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">default_size</span><span class="special">());</span>
213
214    <span class="identifier">stack_context</span> <span class="identifier">allocate</span><span class="special">();</span>
215
216    <span class="keyword">void</span> <span class="identifier">deallocate</span><span class="special">(</span> <span class="identifier">stack_context</span> <span class="special">&amp;);</span>
217<span class="special">}</span>
218
219<span class="special">}}</span>
220</pre>
221<p>
222      </p>
223<h5>
224<a name="protected_fixedsize_allocate_bridgehead"></a>
225  <span class="phrase"><a name="protected_fixedsize_allocate"></a></span>
226  <a class="link" href="stack.html#protected_fixedsize_allocate">Member
227      function <code class="computeroutput">allocate</code>()</a>
228</h5>
229<p>
230    </p>
231<pre class="programlisting"><span class="identifier">stack_context</span> <span class="identifier">allocate</span><span class="special">();</span>
232</pre>
233<div class="variablelist">
234<p class="title"><b></b></p>
235<dl class="variablelist">
236<dt><span class="term">Preconditions:</span></dt>
237<dd><p>
238            <code class="computeroutput"><span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">minimum_size</span><span class="special">()</span>
239            <span class="special">&lt;=</span> <span class="identifier">size</span></code>
240            and <code class="computeroutput"><span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">is_unbounded</span><span class="special">()</span>
241            <span class="special">||</span> <span class="special">(</span>
242            <span class="identifier">size</span> <span class="special">&lt;=</span>
243            <span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">maximum_size</span><span class="special">()</span>
244            <span class="special">)</span></code>.
245          </p></dd>
246<dt><span class="term">Effects:</span></dt>
247<dd><p>
248            Allocates memory of at least <code class="computeroutput"><span class="identifier">size</span></code>
249            bytes and stores a pointer to the stack and its actual size in <code class="computeroutput"><span class="identifier">sctx</span></code>. Depending on the architecture
250            (the stack grows downwards/upwards) the stored address is the highest/lowest
251            address of the stack.
252          </p></dd>
253</dl>
254</div>
255<p>
256      </p>
257<h5>
258<a name="protected_fixesize_deallocate_bridgehead"></a>
259  <span class="phrase"><a name="protected_fixesize_deallocate"></a></span>
260  <a class="link" href="stack.html#protected_fixesize_deallocate">Member
261      function <code class="computeroutput">deallocate</code>()</a>
262</h5>
263<p>
264    </p>
265<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">deallocate</span><span class="special">(</span> <span class="identifier">stack_context</span> <span class="special">&amp;</span> <span class="identifier">sctx</span><span class="special">);</span>
266</pre>
267<div class="variablelist">
268<p class="title"><b></b></p>
269<dl class="variablelist">
270<dt><span class="term">Preconditions:</span></dt>
271<dd><p>
272            <code class="computeroutput"><span class="identifier">sctx</span><span class="special">.</span><span class="identifier">sp</span></code> is valid, <code class="computeroutput"><span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">minimum_size</span><span class="special">()</span> <span class="special">&lt;=</span> <span class="identifier">sctx</span><span class="special">.</span><span class="identifier">size</span></code> and <code class="computeroutput"><span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">is_unbounded</span><span class="special">()</span> <span class="special">||</span> <span class="special">(</span> <span class="identifier">sctx</span><span class="special">.</span><span class="identifier">size</span> <span class="special">&lt;=</span> <span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">maximum_size</span><span class="special">()</span> <span class="special">)</span></code>.
273          </p></dd>
274<dt><span class="term">Effects:</span></dt>
275<dd><p>
276            Deallocates the stack space.
277          </p></dd>
278</dl>
279</div>
280<p>
281      </p>
282<h5>
283<a name="class_pooled_fixedsize_stack_bridgehead"></a>
284  <span class="phrase"><a name="class_pooled_fixedsize_stack"></a></span>
285  <a class="link" href="stack.html#class_pooled_fixedsize_stack">Class
286      <code class="computeroutput">pooled_fixedsize_stack</code></a>
287</h5>
288<p>
289    </p>
290<p>
291      <span class="bold"><strong>Boost.Fiber</strong></span> provides the class <a class="link" href="stack.html#class_pooled_fixedsize_stack"><code class="computeroutput">pooled_fixedsize_stack</code></a> which
292      models the <a class="link" href="stack.html#stack_allocator_concept"><span class="emphasis"><em>stack-allocator
293      concept</em></span></a>. In contrast to <a class="link" href="stack.html#class_protected_fixedsize_stack"><code class="computeroutput">protected_fixedsize_stack</code></a> it
294      does not append a guard page at the end of each stack. The memory is managed
295      internally by <a href="http://www.boost.org/doc/libs/release/libs/pool/doc/html/boost/pool.html" target="_top"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">pool</span><span class="special">&lt;&gt;</span></code></a>.
296    </p>
297<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">fiber</span><span class="special">/</span><span class="identifier">pooled_fixedsize_stack</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
298
299<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
300<span class="keyword">namespace</span> <span class="identifier">fibers</span> <span class="special">{</span>
301
302<span class="keyword">struct</span> <span class="identifier">pooled_fixedsize_stack</span> <span class="special">{</span>
303    <span class="identifier">pooled_fixedsize_stack</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">stack_size</span> <span class="special">=</span> <span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">default_size</span><span class="special">(),</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">next_size</span> <span class="special">=</span> <span class="number">32</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">max_size</span> <span class="special">=</span> <span class="number">0</span><span class="special">);</span>
304
305    <span class="identifier">stack_context</span> <span class="identifier">allocate</span><span class="special">();</span>
306
307    <span class="keyword">void</span> <span class="identifier">deallocate</span><span class="special">(</span> <span class="identifier">stack_context</span> <span class="special">&amp;);</span>
308<span class="special">}</span>
309
310<span class="special">}}</span>
311</pre>
312<p>
313      </p>
314<h5>
315<a name="pooled_fixedsize_bridgehead"></a>
316  <span class="phrase"><a name="pooled_fixedsize"></a></span>
317  <a class="link" href="stack.html#pooled_fixedsize">Constructor</a>
318</h5>
319<p>
320    </p>
321<pre class="programlisting"><span class="identifier">pooled_fixedsize_stack</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">stack_size</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">next_size</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">max_size</span><span class="special">);</span>
322</pre>
323<div class="variablelist">
324<p class="title"><b></b></p>
325<dl class="variablelist">
326<dt><span class="term">Preconditions:</span></dt>
327<dd><p>
328            <code class="computeroutput"><span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">is_unbounded</span><span class="special">()</span>
329            <span class="special">||</span> <span class="special">(</span>
330            <span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">maximum_size</span><span class="special">()</span>
331            <span class="special">&gt;=</span> <span class="identifier">stack_size</span><span class="special">)</span></code> and <code class="computeroutput"><span class="number">0</span>
332            <span class="special">&lt;</span> <span class="identifier">next_size</span></code>.
333          </p></dd>
334<dt><span class="term">Effects:</span></dt>
335<dd><p>
336            Allocates memory of at least <code class="computeroutput"><span class="identifier">stack_size</span></code>
337            bytes and stores a pointer to the stack and its actual size in <code class="computeroutput"><span class="identifier">sctx</span></code>. Depending on the architecture
338            (the stack grows downwards/upwards) the stored address is the highest/lowest
339            address of the stack. Argument <code class="computeroutput"><span class="identifier">next_size</span></code>
340            determines the number of stacks to request from the system the first
341            time that <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
342            needs to allocate system memory. The third argument <code class="computeroutput"><span class="identifier">max_size</span></code>
343            controls how much memory might be allocated for stacks — a value of zero
344            means no upper limit.
345          </p></dd>
346</dl>
347</div>
348<p>
349      </p>
350<h5>
351<a name="pooled_fixedsize_allocate_bridgehead"></a>
352  <span class="phrase"><a name="pooled_fixedsize_allocate"></a></span>
353  <a class="link" href="stack.html#pooled_fixedsize_allocate">Member
354      function <code class="computeroutput">allocate</code>()</a>
355</h5>
356<p>
357    </p>
358<pre class="programlisting"><span class="identifier">stack_context</span> <span class="identifier">allocate</span><span class="special">();</span>
359</pre>
360<div class="variablelist">
361<p class="title"><b></b></p>
362<dl class="variablelist">
363<dt><span class="term">Preconditions:</span></dt>
364<dd><p>
365            <code class="computeroutput"><span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">is_unbounded</span><span class="special">()</span>
366            <span class="special">||</span> <span class="special">(</span>
367            <span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">maximum_size</span><span class="special">()</span>
368            <span class="special">&gt;=</span> <span class="identifier">stack_size</span><span class="special">)</span></code>.
369          </p></dd>
370<dt><span class="term">Effects:</span></dt>
371<dd><p>
372            Allocates memory of at least <code class="computeroutput"><span class="identifier">stack_size</span></code>
373            bytes and stores a pointer to the stack and its actual size in <code class="computeroutput"><span class="identifier">sctx</span></code>. Depending on the architecture
374            (the stack grows downwards/upwards) the stored address is the highest/lowest
375            address of the stack.
376          </p></dd>
377</dl>
378</div>
379<p>
380      </p>
381<h5>
382<a name="pooled_fixesize_deallocate_bridgehead"></a>
383  <span class="phrase"><a name="pooled_fixesize_deallocate"></a></span>
384  <a class="link" href="stack.html#pooled_fixesize_deallocate">Member
385      function <code class="computeroutput">deallocate</code>()</a>
386</h5>
387<p>
388    </p>
389<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">deallocate</span><span class="special">(</span> <span class="identifier">stack_context</span> <span class="special">&amp;</span> <span class="identifier">sctx</span><span class="special">);</span>
390</pre>
391<div class="variablelist">
392<p class="title"><b></b></p>
393<dl class="variablelist">
394<dt><span class="term">Preconditions:</span></dt>
395<dd><p>
396            <code class="computeroutput"><span class="identifier">sctx</span><span class="special">.</span><span class="identifier">sp</span></code> is valid, <code class="computeroutput"><span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">is_unbounded</span><span class="special">()</span> <span class="special">||</span> <span class="special">(</span> <span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">maximum_size</span><span class="special">()</span> <span class="special">&gt;=</span> <span class="identifier">sctx</span><span class="special">.</span><span class="identifier">size</span><span class="special">)</span></code>.
397          </p></dd>
398<dt><span class="term">Effects:</span></dt>
399<dd><p>
400            Deallocates the stack space.
401          </p></dd>
402</dl>
403</div>
404<div class="note"><table border="0" summary="Note">
405<tr>
406<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td>
407<th align="left">Note</th>
408</tr>
409<tr><td align="left" valign="top"><p>
410        This stack allocator is not thread safe.
411      </p></td></tr>
412</table></div>
413<p>
414      </p>
415<h5>
416<a name="class_fixedsize_stack_bridgehead"></a>
417  <span class="phrase"><a name="class_fixedsize_stack"></a></span>
418  <a class="link" href="stack.html#class_fixedsize_stack">Class
419      <code class="computeroutput">fixedsize_stack</code></a>
420</h5>
421<p>
422    </p>
423<p>
424      <span class="bold"><strong>Boost.Fiber</strong></span> provides the class <a class="link" href="stack.html#class_fixedsize_stack"><code class="computeroutput">fixedsize_stack</code></a> which
425      models the <a class="link" href="stack.html#stack_allocator_concept"><span class="emphasis"><em>stack-allocator
426      concept</em></span></a>. In contrast to <a class="link" href="stack.html#class_protected_fixedsize_stack"><code class="computeroutput">protected_fixedsize_stack</code></a> it
427      does not append a guard page at the end of each stack. The memory is simply
428      managed by <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">malloc</span><span class="special">()</span></code>
429      and <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">free</span><span class="special">()</span></code>.
430    </p>
431<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">context</span><span class="special">/</span><span class="identifier">fixedsize_stack</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
432
433<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
434<span class="keyword">namespace</span> <span class="identifier">fibers</span> <span class="special">{</span>
435
436<span class="keyword">struct</span> <span class="identifier">fixedsize_stack</span> <span class="special">{</span>
437    <span class="identifier">fixedsize_stack</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">size</span> <span class="special">=</span> <span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">default_size</span><span class="special">());</span>
438
439    <span class="identifier">stack_context</span> <span class="identifier">allocate</span><span class="special">();</span>
440
441    <span class="keyword">void</span> <span class="identifier">deallocate</span><span class="special">(</span> <span class="identifier">stack_context</span> <span class="special">&amp;);</span>
442<span class="special">}</span>
443
444<span class="special">}}</span>
445</pre>
446<p>
447      </p>
448<h5>
449<a name="fixedsize_allocate_bridgehead"></a>
450  <span class="phrase"><a name="fixedsize_allocate"></a></span>
451  <a class="link" href="stack.html#fixedsize_allocate">Member function
452      <code class="computeroutput">allocate</code>()</a>
453</h5>
454<p>
455    </p>
456<pre class="programlisting"><span class="identifier">stack_context</span> <span class="identifier">allocate</span><span class="special">();</span>
457</pre>
458<div class="variablelist">
459<p class="title"><b></b></p>
460<dl class="variablelist">
461<dt><span class="term">Preconditions:</span></dt>
462<dd><p>
463            <code class="computeroutput"><span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">minimum_size</span><span class="special">()</span>
464            <span class="special">&lt;=</span> <span class="identifier">size</span></code>
465            and <code class="computeroutput"><span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">is_unbounded</span><span class="special">()</span>
466            <span class="special">||</span> <span class="special">(</span>
467            <span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">maximum_size</span><span class="special">()</span>
468            <span class="special">&gt;=</span> <span class="identifier">size</span><span class="special">)</span></code>.
469          </p></dd>
470<dt><span class="term">Effects:</span></dt>
471<dd><p>
472            Allocates memory of at least <code class="computeroutput"><span class="identifier">size</span></code>
473            bytes and stores a pointer to the stack and its actual size in <code class="computeroutput"><span class="identifier">sctx</span></code>. Depending on the architecture
474            (the stack grows downwards/upwards) the stored address is the highest/lowest
475            address of the stack.
476          </p></dd>
477</dl>
478</div>
479<p>
480      </p>
481<h5>
482<a name="fixesize_deallocate_bridgehead"></a>
483  <span class="phrase"><a name="fixesize_deallocate"></a></span>
484  <a class="link" href="stack.html#fixesize_deallocate">Member
485      function <code class="computeroutput">deallocate</code>()</a>
486</h5>
487<p>
488    </p>
489<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">deallocate</span><span class="special">(</span> <span class="identifier">stack_context</span> <span class="special">&amp;</span> <span class="identifier">sctx</span><span class="special">);</span>
490</pre>
491<div class="variablelist">
492<p class="title"><b></b></p>
493<dl class="variablelist">
494<dt><span class="term">Preconditions:</span></dt>
495<dd><p>
496            <code class="computeroutput"><span class="identifier">sctx</span><span class="special">.</span><span class="identifier">sp</span></code> is valid, <code class="computeroutput"><span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">minimum_size</span><span class="special">()</span> <span class="special">&lt;=</span> <span class="identifier">sctx</span><span class="special">.</span><span class="identifier">size</span></code> and <code class="computeroutput"><span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">is_unbounded</span><span class="special">()</span> <span class="special">||</span> <span class="special">(</span> <span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">maximum_size</span><span class="special">()</span> <span class="special">&gt;=</span> <span class="identifier">sctx</span><span class="special">.</span><span class="identifier">size</span><span class="special">)</span></code>.
497          </p></dd>
498<dt><span class="term">Effects:</span></dt>
499<dd><p>
500            Deallocates the stack space.
501          </p></dd>
502</dl>
503</div>
504<p>
505      <a name="segmented"></a></p>
506<h5>
507<a name="class_segmented_stack_bridgehead"></a>
508  <span class="phrase"><a name="class_segmented_stack"></a></span>
509  <a class="link" href="stack.html#class_segmented_stack">Class
510      <code class="computeroutput">segmented_stack</code></a>
511</h5>
512<p>
513    </p>
514<p>
515      <span class="bold"><strong>Boost.Fiber</strong></span> supports usage of a <a class="link" href="stack.html#class_segmented_stack"><code class="computeroutput">segmented_stack</code></a>,
516      i.e. the stack grows on demand. The fiber is created with a minimal stack size
517      which will be increased as required. Class <a class="link" href="stack.html#class_segmented_stack"><code class="computeroutput">segmented_stack</code></a> models
518      the <a class="link" href="stack.html#stack_allocator_concept"><span class="emphasis"><em>stack-allocator concept</em></span></a>.
519      In contrast to <a class="link" href="stack.html#class_protected_fixedsize_stack"><code class="computeroutput">protected_fixedsize_stack</code></a> and
520      <a class="link" href="stack.html#class_fixedsize_stack"><code class="computeroutput">fixedsize_stack</code></a> it creates a stack which grows on demand.
521    </p>
522<div class="note"><table border="0" summary="Note">
523<tr>
524<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td>
525<th align="left">Note</th>
526</tr>
527<tr><td align="left" valign="top"><p>
528        Segmented stacks are currently only supported by <span class="bold"><strong>gcc</strong></span>
529        from version <span class="bold"><strong>4.7</strong></span> and <span class="bold"><strong>clang</strong></span>
530        from version <span class="bold"><strong>3.4</strong></span> onwards. In order to use
531        a <a class="link" href="stack.html#class_segmented_stack"><code class="computeroutput">segmented_stack</code></a> <span class="bold"><strong>Boost.Fiber</strong></span>
532        must be built with property <code class="computeroutput"><span class="identifier">segmented</span><span class="special">-</span><span class="identifier">stacks</span></code>,
533        e.g. <span class="bold"><strong>toolset=gcc segmented-stacks=on</strong></span> and
534        applying BOOST_USE_SEGMENTED_STACKS at b2/bjam command line.
535      </p></td></tr>
536</table></div>
537<div class="note"><table border="0" summary="Note">
538<tr>
539<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td>
540<th align="left">Note</th>
541</tr>
542<tr><td align="left" valign="top"><p>
543        Segmented stacks can only be used with callcc() using property <code class="computeroutput"><span class="identifier">context</span><span class="special">-</span><span class="identifier">impl</span><span class="special">=</span><span class="identifier">ucontext</span></code>.
544      </p></td></tr>
545</table></div>
546<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">fiber</span><span class="special">/</span><span class="identifier">segmented_stack</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
547
548<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
549<span class="keyword">namespace</span> <span class="identifier">fibers</span> <span class="special">{</span>
550
551<span class="keyword">struct</span> <span class="identifier">segmented_stack</span> <span class="special">{</span>
552    <span class="identifier">segmented_stack</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">stack_size</span> <span class="special">=</span> <span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">default_size</span><span class="special">());</span>
553
554    <span class="identifier">stack_context</span> <span class="identifier">allocate</span><span class="special">();</span>
555
556    <span class="keyword">void</span> <span class="identifier">deallocate</span><span class="special">(</span> <span class="identifier">stack_context</span> <span class="special">&amp;);</span>
557<span class="special">}</span>
558
559<span class="special">}}</span>
560</pre>
561<p>
562      </p>
563<h5>
564<a name="segmented_allocate_bridgehead"></a>
565  <span class="phrase"><a name="segmented_allocate"></a></span>
566  <a class="link" href="stack.html#segmented_allocate">Member function
567      <code class="computeroutput">allocate</code>()</a>
568</h5>
569<p>
570    </p>
571<pre class="programlisting"><span class="identifier">stack_context</span> <span class="identifier">allocate</span><span class="special">();</span>
572</pre>
573<div class="variablelist">
574<p class="title"><b></b></p>
575<dl class="variablelist">
576<dt><span class="term">Preconditions:</span></dt>
577<dd><p>
578            <code class="computeroutput"><span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">minimum_size</span><span class="special">()</span>
579            <span class="special">&lt;=</span> <span class="identifier">size</span></code>
580            and <code class="computeroutput"><span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">is_unbounded</span><span class="special">()</span>
581            <span class="special">||</span> <span class="special">(</span>
582            <span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">maximum_size</span><span class="special">()</span>
583            <span class="special">&gt;=</span> <span class="identifier">size</span><span class="special">)</span></code>.
584          </p></dd>
585<dt><span class="term">Effects:</span></dt>
586<dd><p>
587            Allocates memory of at least <code class="computeroutput"><span class="identifier">size</span></code>
588            bytes and stores a pointer to the stack and its actual size in <code class="computeroutput"><span class="identifier">sctx</span></code>. Depending on the architecture
589            (the stack grows downwards/upwards) the stored address is the highest/lowest
590            address of the stack.
591          </p></dd>
592</dl>
593</div>
594<p>
595      </p>
596<h5>
597<a name="segmented_deallocate_bridgehead"></a>
598  <span class="phrase"><a name="segmented_deallocate"></a></span>
599  <a class="link" href="stack.html#segmented_deallocate">Member
600      function <code class="computeroutput">deallocate</code>()</a>
601</h5>
602<p>
603    </p>
604<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">deallocate</span><span class="special">(</span> <span class="identifier">stack_context</span> <span class="special">&amp;</span> <span class="identifier">sctx</span><span class="special">);</span>
605</pre>
606<div class="variablelist">
607<p class="title"><b></b></p>
608<dl class="variablelist">
609<dt><span class="term">Preconditions:</span></dt>
610<dd><p>
611            <code class="computeroutput"><span class="identifier">sctx</span><span class="special">.</span><span class="identifier">sp</span></code> is valid, <code class="computeroutput"><span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">minimum_size</span><span class="special">()</span> <span class="special">&lt;=</span> <span class="identifier">sctx</span><span class="special">.</span><span class="identifier">size</span></code> and <code class="computeroutput"><span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">is_unbounded</span><span class="special">()</span> <span class="special">||</span> <span class="special">(</span> <span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">maximum_size</span><span class="special">()</span> <span class="special">&gt;=</span> <span class="identifier">sctx</span><span class="special">.</span><span class="identifier">size</span><span class="special">)</span></code>.
612          </p></dd>
613<dt><span class="term">Effects:</span></dt>
614<dd><p>
615            Deallocates the stack space.
616          </p></dd>
617</dl>
618</div>
619<div class="note"><table border="0" summary="Note">
620<tr>
621<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td>
622<th align="left">Note</th>
623</tr>
624<tr><td align="left" valign="top"><p>
625        If the library is compiled for segmented stacks, <a class="link" href="stack.html#class_segmented_stack"><code class="computeroutput">segmented_stack</code></a> is
626        the only available stack allocator.
627      </p></td></tr>
628</table></div>
629</div>
630<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
631<td align="left"></td>
632<td align="right"><div class="copyright-footer">Copyright © 2013 Oliver Kowalke<p>
633        Distributed under the Boost Software License, Version 1.0. (See accompanying
634        file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
635      </p>
636</div></td>
637</tr></table>
638<hr>
639<div class="spirit-nav">
640<a accesskey="p" href="scheduling.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="stack/valgrind.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
641</div>
642</body>
643</html>
644