58
58
<div class="refsynopsisdiv" title="Synopsis">
59
59
<a name="glib-Memory-Slices.synopsis"></a><h2>Synopsis</h2>
60
60
<pre class="synopsis">
62
61
#include <glib.h>
64
<a class="link" href="glib-Basic-Types.html#gpointer" title="gpointer">gpointer</a> <a class="link" href="glib-Memory-Slices.html#g-slice-alloc" title="g_slice_alloc ()">g_slice_alloc</a> (<a class="link" href="glib-Basic-Types.html#gsize" title="gsize">gsize</a> block_size);
65
<a class="link" href="glib-Basic-Types.html#gpointer" title="gpointer">gpointer</a> <a class="link" href="glib-Memory-Slices.html#g-slice-alloc0" title="g_slice_alloc0 ()">g_slice_alloc0</a> (<a class="link" href="glib-Basic-Types.html#gsize" title="gsize">gsize</a> block_size);
66
<a class="link" href="glib-Basic-Types.html#gpointer" title="gpointer">gpointer</a> <a class="link" href="glib-Memory-Slices.html#g-slice-copy" title="g_slice_copy ()">g_slice_copy</a> (<a class="link" href="glib-Basic-Types.html#gsize" title="gsize">gsize</a> block_size,
67
<a class="link" href="glib-Basic-Types.html#gconstpointer" title="gconstpointer">gconstpointer</a> mem_block);
68
void <a class="link" href="glib-Memory-Slices.html#g-slice-free1" title="g_slice_free1 ()">g_slice_free1</a> (<a class="link" href="glib-Basic-Types.html#gsize" title="gsize">gsize</a> block_size,
69
<a class="link" href="glib-Basic-Types.html#gpointer" title="gpointer">gpointer</a> mem_block);
70
void <a class="link" href="glib-Memory-Slices.html#g-slice-free-chain-with-offset" title="g_slice_free_chain_with_offset ()">g_slice_free_chain_with_offset</a> (<a class="link" href="glib-Basic-Types.html#gsize" title="gsize">gsize</a> block_size,
71
<a class="link" href="glib-Basic-Types.html#gpointer" title="gpointer">gpointer</a> mem_chain,
72
<a class="link" href="glib-Basic-Types.html#gsize" title="gsize">gsize</a> next_offset);
63
<a class="link" href="glib-Basic-Types.html#gpointer" title="gpointer"><span class="returnvalue">gpointer</span></a> <a class="link" href="glib-Memory-Slices.html#g-slice-alloc" title="g_slice_alloc ()">g_slice_alloc</a> (<a class="link" href="glib-Basic-Types.html#gsize" title="gsize"><span class="returnvalue">gsize</span></a> block_size);
64
<a class="link" href="glib-Basic-Types.html#gpointer" title="gpointer"><span class="returnvalue">gpointer</span></a> <a class="link" href="glib-Memory-Slices.html#g-slice-alloc0" title="g_slice_alloc0 ()">g_slice_alloc0</a> (<a class="link" href="glib-Basic-Types.html#gsize" title="gsize"><span class="returnvalue">gsize</span></a> block_size);
65
<a class="link" href="glib-Basic-Types.html#gpointer" title="gpointer"><span class="returnvalue">gpointer</span></a> <a class="link" href="glib-Memory-Slices.html#g-slice-copy" title="g_slice_copy ()">g_slice_copy</a> (<a class="link" href="glib-Basic-Types.html#gsize" title="gsize"><span class="returnvalue">gsize</span></a> block_size,
66
<a class="link" href="glib-Basic-Types.html#gconstpointer" title="gconstpointer"><span class="returnvalue">gconstpointer</span></a> mem_block);
67
<span class="returnvalue">void</span> <a class="link" href="glib-Memory-Slices.html#g-slice-free1" title="g_slice_free1 ()">g_slice_free1</a> (<a class="link" href="glib-Basic-Types.html#gsize" title="gsize"><span class="returnvalue">gsize</span></a> block_size,
68
<a class="link" href="glib-Basic-Types.html#gpointer" title="gpointer"><span class="returnvalue">gpointer</span></a> mem_block);
69
<span class="returnvalue">void</span> <a class="link" href="glib-Memory-Slices.html#g-slice-free-chain-with-offset" title="g_slice_free_chain_with_offset ()">g_slice_free_chain_with_offset</a> (<a class="link" href="glib-Basic-Types.html#gsize" title="gsize"><span class="returnvalue">gsize</span></a> block_size,
70
<a class="link" href="glib-Basic-Types.html#gpointer" title="gpointer"><span class="returnvalue">gpointer</span></a> mem_chain,
71
<a class="link" href="glib-Basic-Types.html#gsize" title="gsize"><span class="returnvalue">gsize</span></a> next_offset);
74
73
#define <a class="link" href="glib-Memory-Slices.html#g-slice-new" title="g_slice_new()">g_slice_new</a> (type)
75
74
#define <a class="link" href="glib-Memory-Slices.html#g-slice-new0" title="g_slice_new0()">g_slice_new0</a> (type)
84
83
Memory slices provide a space-efficient and multi-processing scalable
85
84
way to allocate equal-sized pieces of memory, just like the original
86
<span class="type">GMemChunks</span> (from GLib <= 2.8), while avoiding their excessive
85
<a href="glib-Memory-Chunks.html#GMemChunk"><span class="type">GMemChunks</span></a> (from GLib <= 2.8), while avoiding their excessive
87
86
memory-waste, scalability and performance problems.
90
89
To achieve these goals, the slice allocator uses a sophisticated,
91
90
layered design that has been inspired by Bonwick's slab allocator
92
<sup>[<a name="id536590" href="#ftn.id536590" class="footnote">6</a>]</sup>.
91
<sup>[<a name="id756836" href="#ftn.id756836" class="footnote">6</a>]</sup>.
93
92
It uses <code class="function">posix_memalign()</code> to optimize allocations of many equally-sized
94
93
chunks, and has per-thread free lists (the so-called magazine layer)
95
94
to quickly satisfy allocation requests of already known structure sizes.
110
109
object size used at allocation time is still available when freeing.
112
111
<div class="example">
113
<a name="id547634"></a><p class="title"><b>Example 15. Using the slice allocator</b></p>
114
<div class="example-contents"><pre class="programlisting">
117
/* Allocate 10000 blocks. */
118
for (i = 0; i < 10000; i++)
120
mem[i] = g_slice_alloc (50);
121
/* Fill in the memory with some junk. */
122
for (j = 0; j < 50; j++)
125
/* Now free all of the blocks. */
126
for (i = 0; i < 10000; i++)
128
g_slice_free1 (50, mem[i]);
112
<a name="id756412"></a><p class="title"><b>Example 15. Using the slice allocator</b></p>
113
<div class="example-contents">
114
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
117
<td class="listing_lines" align="right"><pre>1
132
<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>
133
<span class="usertype">gint</span><span class="normal"> i</span><span class="symbol">;</span>
134
<span class="comment">/* Allocate 10000 blocks. */</span>
135
<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>
136
<span class="normal"> </span><span class="cbracket">{</span>
137
<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>
138
<span class="normal"> </span><span class="comment">/* Fill in the memory with some junk. */</span>
139
<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>
140
<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>
141
<span class="normal"> </span><span class="cbracket">}</span>
142
<span class="comment">/* Now free all of the blocks. */</span>
143
<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>
144
<span class="normal"> </span><span class="cbracket">{</span>
145
<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>
146
<span class="normal"> </span><span class="cbracket">}</span></pre></td>
132
153
<br class="example-break"><div class="example">
133
<a name="id765861"></a><p class="title"><b>Example 16. Using the slice allocator with data structures</b></p>
134
<div class="example-contents"><pre class="programlisting">
136
/* Allocate one block, using the g_slice_new() macro. */
137
array = g_slice_new (GRealArray);
138
/* We can now use array just like a normal pointer to a structure. */
139
array->data = NULL;
142
array->zero_terminated = (zero_terminated ? 1 : 0);
143
array->clear = (clear ? 1 : 0);
144
array->elt_size = elt_size;
145
/* We can free the block, so it can be reused. */
146
g_slice_free (GRealArray, array);
154
<a name="id729439"></a><p class="title"><b>Example 16. Using the slice allocator with data structures</b></p>
155
<div class="example-contents">
156
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
159
<td class="listing_lines" align="right"><pre>1
171
<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>
172
<span class="comment">/* Allocate one block, using the g_slice_new() macro. */</span>
173
<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>
174
<span class="comment">/* We can now use array just like a normal pointer to a structure. */</span>
175
<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>
176
<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>
177
<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>
178
<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>
179
<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>
180
<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>
181
<span class="comment">/* We can free the block, so it can be reused. */</span>
182
<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>
149
189
<br class="example-break">
274
314
<div class="refsect2" title="g_slice_free_chain_with_offset ()">
275
315
<a name="g-slice-free-chain-with-offset"></a><h3>g_slice_free_chain_with_offset ()</h3>
276
<pre class="programlisting">void g_slice_free_chain_with_offset (<a class="link" href="glib-Basic-Types.html#gsize" title="gsize">gsize</a> block_size,
277
<a class="link" href="glib-Basic-Types.html#gpointer" title="gpointer">gpointer</a> mem_chain,
278
<a class="link" href="glib-Basic-Types.html#gsize" title="gsize">gsize</a> next_offset);</pre>
316
<pre class="programlisting"><span class="returnvalue">void</span> g_slice_free_chain_with_offset (<a class="link" href="glib-Basic-Types.html#gsize" title="gsize"><span class="returnvalue">gsize</span></a> block_size,
317
<a class="link" href="glib-Basic-Types.html#gpointer" title="gpointer"><span class="returnvalue">gpointer</span></a> mem_chain,
318
<a class="link" href="glib-Basic-Types.html#gsize" title="gsize"><span class="returnvalue">gsize</span></a> next_offset);</pre>
280
320
Frees a linked list of memory blocks of structure type <em class="parameter"><code>type</code></em>.
281
321
The memory blocks must be equal-sized, allocated via