<p>
To achieve these goals, the slice allocator uses a sophisticated,
layered design that has been inspired by Bonwick's slab allocator
-<sup>[<a name="id569578" href="#ftn.id569578" class="footnote">1</a>]</sup>.
+<sup>[<a name="idp8623840" href="#ftn.idp8623840" class="footnote">1</a>]</sup>.
It uses <code class="function">posix_memalign()</code> to optimize allocations of many equally-sized
chunks, and has per-thread free lists (the so-called magazine layer)
to quickly satisfy allocation requests of already known structure sizes.
<p>
</p>
<div class="example">
-<a name="id610691"></a><p class="title"><b>Example 8. Using the slice allocator</b></p>
-<div class="example-contents">
- <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
- <tbody>
- <tr>
- <td class="listing_lines" align="right"><pre>1
-2
-3
-4
-5
-6
-7
-8
-9
-10
-11
-12
-13
-14
-15
-16
-17
-18</pre></td>
- <td class="listing_code"><pre class="programlisting"><span class="usertype">gchar</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">mem</span><span class="symbol">[</span><span class="number">10000</span><span class="symbol">];</span>
-<span class="usertype">gint</span><span class="normal"> i</span><span class="symbol">;</span>
+<a name="idp6851744"></a><p class="title"><b>Example 8. Using the slice allocator</b></p>
+<div class="example-contents"><pre class="programlisting">
+gchar *mem[10000];
+gint i;
-<span class="comment">/* Allocate 10000 blocks. */</span>
-<span class="keyword">for</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">i </span><span class="symbol">=</span><span class="normal"> </span><span class="number">0</span><span class="symbol">;</span><span class="normal"> i </span><span class="symbol"><</span><span class="normal"> </span><span class="number">10000</span><span class="symbol">;</span><span class="normal"> i</span><span class="symbol">++)</span>
-<span class="normal"> </span><span class="cbracket">{</span>
-<span class="normal"> mem</span><span class="symbol">[</span><span class="normal">i</span><span class="symbol">]</span><span class="normal"> </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="glib-Memory-Slices.html#g-slice-alloc">g_slice_alloc</a></span><span class="normal"> </span><span class="symbol">(</span><span class="number">50</span><span class="symbol">);</span>
+/* Allocate 10000 blocks. */
+for (i = 0; i < 10000; i++)
+ {
+ mem[i] = g_slice_alloc (50);
-<span class="normal"> </span><span class="comment">/* Fill in the memory with some junk. */</span>
-<span class="normal"> </span><span class="keyword">for</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">j </span><span class="symbol">=</span><span class="normal"> </span><span class="number">0</span><span class="symbol">;</span><span class="normal"> j </span><span class="symbol"><</span><span class="normal"> </span><span class="number">50</span><span class="symbol">;</span><span class="normal"> j</span><span class="symbol">++)</span>
-<span class="normal"> mem</span><span class="symbol">[</span><span class="normal">i</span><span class="symbol">][</span><span class="normal">j</span><span class="symbol">]</span><span class="normal"> </span><span class="symbol">=</span><span class="normal"> i </span><span class="symbol">*</span><span class="normal"> j</span><span class="symbol">;</span>
-<span class="normal"> </span><span class="cbracket">}</span>
-
-<span class="comment">/* Now free all of the blocks. */</span>
-<span class="keyword">for</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">i </span><span class="symbol">=</span><span class="normal"> </span><span class="number">0</span><span class="symbol">;</span><span class="normal"> i </span><span class="symbol"><</span><span class="normal"> </span><span class="number">10000</span><span class="symbol">;</span><span class="normal"> i</span><span class="symbol">++)</span>
-<span class="normal"> </span><span class="cbracket">{</span>
-<span class="normal"> </span><span class="function"><a href="glib-Memory-Slices.html#g-slice-free1">g_slice_free1</a></span><span class="normal"> </span><span class="symbol">(</span><span class="number">50</span><span class="symbol">,</span><span class="normal"> mem</span><span class="symbol">[</span><span class="normal">i</span><span class="symbol">]);</span>
-<span class="normal"> </span><span class="cbracket">}</span></pre></td>
- </tr>
- </tbody>
- </table>
-</div>
+ /* Fill in the memory with some junk. */
+ for (j = 0; j < 50; j++)
+ mem[i][j] = i * j;
+ }
+/* Now free all of the blocks. */
+for (i = 0; i < 10000; i++)
+ {
+ g_slice_free1 (50, mem[i]);
+ }
+</pre></div>
</div>
<p><br class="example-break">
</p>
<p>
</p>
<div class="example">
-<a name="id546533"></a><p class="title"><b>Example 9. Using the slice allocator with data structures</b></p>
-<div class="example-contents">
- <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
- <tbody>
- <tr>
- <td class="listing_lines" align="right"><pre>1
-2
-3
-4
-5
-6
-7
-8
-9
-10
-11
-12
-13
-14
-15</pre></td>
- <td class="listing_code"><pre class="programlisting"><span class="usertype">GRealArray</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">array</span><span class="symbol">;</span>
+<a name="idp10478048"></a><p class="title"><b>Example 9. Using the slice allocator with data structures</b></p>
+<div class="example-contents"><pre class="programlisting">
+GRealArray *array;
-<span class="comment">/* Allocate one block, using the g_slice_new() macro. */</span>
-<span class="normal">array </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="glib-Memory-Slices.html#g-slice-new">g_slice_new</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">GRealArray</span><span class="symbol">);</span>
+/* Allocate one block, using the g_slice_new() macro. */
+array = g_slice_new (GRealArray);
-<span class="comment">/* We can now use array just like a normal pointer to a structure. */</span>
-<span class="normal">array</span><span class="symbol">-></span><span class="normal">data </span><span class="symbol">=</span><span class="normal"> <a href="glib-Standard-Macros.html#NULL:CAPS">NULL</a></span><span class="symbol">;</span>
-<span class="normal">array</span><span class="symbol">-></span><span class="normal">len </span><span class="symbol">=</span><span class="normal"> </span><span class="number">0</span><span class="symbol">;</span>
-<span class="normal">array</span><span class="symbol">-></span><span class="normal">alloc </span><span class="symbol">=</span><span class="normal"> </span><span class="number">0</span><span class="symbol">;</span>
-<span class="normal">array</span><span class="symbol">-></span><span class="normal">zero_terminated </span><span class="symbol">=</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">zero_terminated </span><span class="symbol">?</span><span class="normal"> </span><span class="number">1</span><span class="normal"> </span><span class="symbol">:</span><span class="normal"> </span><span class="number">0</span><span class="symbol">);</span>
-<span class="normal">array</span><span class="symbol">-></span><span class="normal">clear </span><span class="symbol">=</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">clear </span><span class="symbol">?</span><span class="normal"> </span><span class="number">1</span><span class="normal"> </span><span class="symbol">:</span><span class="normal"> </span><span class="number">0</span><span class="symbol">);</span>
-<span class="normal">array</span><span class="symbol">-></span><span class="normal">elt_size </span><span class="symbol">=</span><span class="normal"> elt_size</span><span class="symbol">;</span>
-
-<span class="comment">/* We can free the block, so it can be reused. */</span>
-<span class="function"><a href="glib-Memory-Slices.html#g-slice-free">g_slice_free</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">GRealArray</span><span class="symbol">,</span><span class="normal"> array</span><span class="symbol">);</span></pre></td>
- </tr>
- </tbody>
- </table>
-</div>
+/* We can now use array just like a normal pointer to a structure. */
+array->data = NULL;
+array->len = 0;
+array->alloc = 0;
+array->zero_terminated = (zero_terminated ? 1 : 0);
+array->clear = (clear ? 1 : 0);
+array->elt_size = elt_size;
+/* We can free the block, so it can be reused. */
+g_slice_free (GRealArray, array);
+</pre></div>
</div>
<p><br class="example-break">
</p>
</div>
<div class="footnotes">
<br><hr width="100" align="left">
-<div class="footnote"><p><sup>[<a id="ftn.id569578" href="#id569578" class="para">1</a>] </sup>
+<div class="footnote"><p><sup>[<a id="ftn.idp8623840" href="#idp8623840" class="para">1</a>] </sup>
<a class="ulink" href="http://citeseer.ist.psu.edu/bonwick94slab.html" target="_top">[Bonwick94]</a> Jeff Bonwick, The slab allocator: An object-caching kernel
memory allocator. USENIX 1994, and
<a class="ulink" href="http://citeseer.ist.psu.edu/bonwick01magazines.html" target="_top">[Bonwick01]</a> Bonwick and Jonathan Adams, Magazines and vmem: Extending the