<p>
</p>
<div class="example">
-<a name="id615699"></a><p class="title"><b>Example 2. A function which will not work in a threaded environment</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</pre></td>
- <td class="listing_code"><pre class="programlisting"><span class="type">int</span>
-<span class="function">give_me_next_number</span><span class="normal"> </span><span class="symbol">(</span><span class="type">void</span><span class="symbol">)</span>
-<span class="cbracket">{</span>
-<span class="normal"> </span><span class="keyword">static</span><span class="normal"> </span><span class="type">int</span><span class="normal"> current_number </span><span class="symbol">=</span><span class="normal"> </span><span class="number">0</span><span class="symbol">;</span>
-
-<span class="normal"> </span><span class="comment">/* now do a very complicated calculation to calculate the new</span>
-<span class="comment"> * number, this might for example be a random number generator</span>
-<span class="comment"> */</span>
-<span class="normal"> current_number </span><span class="symbol">=</span><span class="normal"> </span><span class="function">calc_next_number</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">current_number</span><span class="symbol">);</span>
+<a name="idp16402720"></a><p class="title"><b>Example 2. A function which will not work in a threaded environment</b></p>
+<div class="example-contents"><pre class="programlisting">
+ int
+ give_me_next_number (void)
+ {
+ static int current_number = 0;
-<span class="normal"> </span><span class="keyword">return</span><span class="normal"> current_number</span><span class="symbol">;</span>
-<span class="cbracket">}</span></pre></td>
- </tr>
- </tbody>
- </table>
-</div>
+ /* now do a very complicated calculation to calculate the new
+ * number, this might for example be a random number generator
+ */
+ current_number = calc_next_number (current_number);
+ return current_number;
+ }
+ </pre></div>
</div>
<p><br class="example-break">
</p>
<p>
</p>
<div class="example">
-<a name="id615736"></a><p class="title"><b>Example 3. Using GMutex to protected a shared variable</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</pre></td>
- <td class="listing_code"><pre class="programlisting"><span class="type">int</span>
-<span class="function">give_me_next_number</span><span class="normal"> </span><span class="symbol">(</span><span class="type">void</span><span class="symbol">)</span>
-<span class="cbracket">{</span>
-<span class="normal"> </span><span class="keyword">static</span><span class="normal"> </span><span class="usertype">GMutex</span><span class="normal"> mutex</span><span class="symbol">;</span>
-<span class="normal"> </span><span class="keyword">static</span><span class="normal"> </span><span class="type">int</span><span class="normal"> current_number </span><span class="symbol">=</span><span class="normal"> </span><span class="number">0</span><span class="symbol">;</span>
-<span class="normal"> </span><span class="type">int</span><span class="normal"> ret_val</span><span class="symbol">;</span>
-
-<span class="normal"> </span><span class="function"><a href="glib-Threads.html#g-mutex-lock">g_mutex_lock</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">mutex</span><span class="symbol">);</span>
-<span class="normal"> ret_val </span><span class="symbol">=</span><span class="normal"> current_number </span><span class="symbol">=</span><span class="normal"> </span><span class="function">calc_next_number</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">current_number</span><span class="symbol">);</span>
-<span class="normal"> </span><span class="function"><a href="glib-Threads.html#g-mutex-unlock">g_mutex_unlock</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">mutex</span><span class="symbol">);</span>
+<a name="idp16407104"></a><p class="title"><b>Example 3. Using GMutex to protected a shared variable</b></p>
+<div class="example-contents"><pre class="programlisting">
+ int
+ give_me_next_number (void)
+ {
+ static GMutex mutex;
+ static int current_number = 0;
+ int ret_val;
-<span class="normal"> </span><span class="keyword">return</span><span class="normal"> ret_val</span><span class="symbol">;</span>
-<span class="cbracket">}</span></pre></td>
- </tr>
- </tbody>
- </table>
-</div>
+ g_mutex_lock (&mutex);
+ ret_val = current_number = calc_next_number (current_number);
+ g_mutex_unlock (&mutex);
+ return ret_val;
+ }
+ </pre></div>
</div>
<p><br class="example-break">
</p>
</p>
<p>
</p>
-<div class="informalexample">
- <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</pre></td>
- <td class="listing_code"><pre class="programlisting"><span class="keyword">typedef</span><span class="normal"> </span><span class="keyword">struct</span><span class="normal"> </span><span class="cbracket">{</span>
-<span class="normal"> </span><span class="usertype">GMutex</span><span class="normal"> m</span><span class="symbol">;</span>
-<span class="normal"> </span><span class="symbol">...</span>
-<span class="cbracket">}</span><span class="normal"> Blob</span><span class="symbol">;</span>
-
-<span class="usertype">Blob</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">b</span><span class="symbol">;</span>
+<div class="informalexample"><pre class="programlisting">
+ typedef struct {
+ GMutex m;
+ ...
+ } Blob;
-<span class="normal">b </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="glib-Memory-Allocation.html#g-new">g_new</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">Blob</span><span class="symbol">,</span><span class="normal"> </span><span class="number">1</span><span class="symbol">);</span>
-<span class="function"><a href="glib-Threads.html#g-mutex-init">g_mutex_init</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">b</span><span class="symbol">-></span><span class="normal">m</span><span class="symbol">);</span></pre></td>
- </tr>
- </tbody>
- </table>
-</div>
+Blob *b;
+b = g_new (Blob, 1);
+g_mutex_init (&b->m);
+</pre></div>
<p>
</p>
<p>
<p>
</p>
<div class="example">
-<a name="id616590"></a><p class="title"><b>Example 4. Using the <code class="literal">G_LOCK_*</code> convenience macros</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</pre></td>
- <td class="listing_code"><pre class="programlisting"><span class="function"><a href="glib-Threads.html#G-LOCK-DEFINE:CAPS">G_LOCK_DEFINE</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">current_number</span><span class="symbol">);</span>
-
-<span class="type">int</span>
-<span class="function">give_me_next_number</span><span class="normal"> </span><span class="symbol">(</span><span class="type">void</span><span class="symbol">)</span>
-<span class="cbracket">{</span>
-<span class="normal"> </span><span class="keyword">static</span><span class="normal"> </span><span class="type">int</span><span class="normal"> current_number </span><span class="symbol">=</span><span class="normal"> </span><span class="number">0</span><span class="symbol">;</span>
-<span class="normal"> </span><span class="type">int</span><span class="normal"> ret_val</span><span class="symbol">;</span>
+<a name="idp16509552"></a><p class="title"><b>Example 4. Using the <code class="literal">G_LOCK_*</code> convenience macros</b></p>
+<div class="example-contents"><pre class="programlisting">
+ G_LOCK_DEFINE (current_number);
-<span class="normal"> </span><span class="function"><a href="glib-Threads.html#G-LOCK:CAPS">G_LOCK</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">current_number</span><span class="symbol">);</span>
-<span class="normal"> ret_val </span><span class="symbol">=</span><span class="normal"> current_number </span><span class="symbol">=</span><span class="normal"> </span><span class="function">calc_next_number</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">current_number</span><span class="symbol">);</span>
-<span class="normal"> </span><span class="function"><a href="glib-Threads.html#G-UNLOCK:CAPS">G_UNLOCK</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">current_number</span><span class="symbol">);</span>
+ int
+ give_me_next_number (void)
+ {
+ static int current_number = 0;
+ int ret_val;
-<span class="normal"> </span><span class="keyword">return</span><span class="normal"> ret_val</span><span class="symbol">;</span>
-<span class="cbracket">}</span></pre></td>
- </tr>
- </tbody>
- </table>
-</div>
+ G_LOCK (current_number);
+ ret_val = current_number = calc_next_number (current_number);
+ G_UNLOCK (current_number);
+ return ret_val;
+ }
+ </pre></div>
</div>
<p><br class="example-break">
</p>
</p>
<p>
</p>
-<div class="informalexample">
- <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</pre></td>
- <td class="listing_code"><pre class="programlisting"><span class="keyword">typedef</span><span class="normal"> </span><span class="keyword">struct</span><span class="normal"> </span><span class="cbracket">{</span>
-<span class="normal"> </span><span class="usertype">GRecMutex</span><span class="normal"> m</span><span class="symbol">;</span>
-<span class="normal"> </span><span class="symbol">...</span>
-<span class="cbracket">}</span><span class="normal"> Blob</span><span class="symbol">;</span>
-
-<span class="usertype">Blob</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">b</span><span class="symbol">;</span>
+<div class="informalexample"><pre class="programlisting">
+ typedef struct {
+ GRecMutex m;
+ ...
+ } Blob;
-<span class="normal">b </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="glib-Memory-Allocation.html#g-new">g_new</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">Blob</span><span class="symbol">,</span><span class="normal"> </span><span class="number">1</span><span class="symbol">);</span>
-<span class="function"><a href="glib-Threads.html#g-rec-mutex-init">g_rec_mutex_init</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">b</span><span class="symbol">-></span><span class="normal">m</span><span class="symbol">);</span></pre></td>
- </tr>
- </tbody>
- </table>
-</div>
+Blob *b;
+b = g_new (Blob, 1);
+g_rec_mutex_init (&b->m);
+</pre></div>
<p>
</p>
<p>
<p>
</p>
<div class="example">
-<a name="id617831"></a><p class="title"><b>Example 5. An array with access functions</b></p>
+<a name="idp16658560"></a><p class="title"><b>Example 5. An array with access functions</b></p>
<div class="example-contents">
<pre class="programlisting">
GRWLock lock;
</p>
<p>
</p>
-<div class="informalexample">
- <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</pre></td>
- <td class="listing_code"><pre class="programlisting"><span class="keyword">typedef</span><span class="normal"> </span><span class="keyword">struct</span><span class="normal"> </span><span class="cbracket">{</span>
-<span class="normal"> </span><span class="usertype">GRWLock</span><span class="normal"> l</span><span class="symbol">;</span>
-<span class="normal"> </span><span class="symbol">...</span>
-<span class="cbracket">}</span><span class="normal"> Blob</span><span class="symbol">;</span>
-
-<span class="usertype">Blob</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">b</span><span class="symbol">;</span>
+<div class="informalexample"><pre class="programlisting">
+ typedef struct {
+ GRWLock l;
+ ...
+ } Blob;
-<span class="normal">b </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="glib-Memory-Allocation.html#g-new">g_new</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">Blob</span><span class="symbol">,</span><span class="normal"> </span><span class="number">1</span><span class="symbol">);</span>
-<span class="function"><a href="glib-Threads.html#g-rw-lock-init">g_rw_lock_init</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">b</span><span class="symbol">-></span><span class="normal">l</span><span class="symbol">);</span></pre></td>
- </tr>
- </tbody>
- </table>
-</div>
+Blob *b;
+b = g_new (Blob, 1);
+g_rw_lock_init (&b->l);
+</pre></div>
<p>
</p>
<p>
<p>
</p>
<div class="example">
-<a name="id618984"></a><p class="title"><b>Example 6.
+<a name="idp19280896"></a><p class="title"><b>Example 6.
Using GCond to block a thread until a condition is satisfied
</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
-19
-20
-21
-22
-23
-24
-25
-26
-27</pre></td>
- <td class="listing_code"><pre class="programlisting"><span class="usertype">gpointer</span><span class="normal"> current_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="usertype">GMutex</span><span class="normal"> data_mutex</span><span class="symbol">;</span>
-<span class="usertype">GCond</span><span class="normal"> data_cond</span><span class="symbol">;</span>
-
-<span class="type">void</span>
-<span class="function">push_data</span><span class="normal"> </span><span class="symbol">(</span><span class="usertype">gpointer</span><span class="normal"> data</span><span class="symbol">)</span>
-<span class="cbracket">{</span>
-<span class="normal"> </span><span class="function"><a href="glib-Threads.html#g-mutex-lock">g_mutex_lock</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">data_mutex</span><span class="symbol">);</span>
-<span class="normal"> current_data </span><span class="symbol">=</span><span class="normal"> data</span><span class="symbol">;</span>
-<span class="normal"> </span><span class="function"><a href="glib-Threads.html#g-cond-signal">g_cond_signal</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">data_cond</span><span class="symbol">);</span>
-<span class="normal"> </span><span class="function"><a href="glib-Threads.html#g-mutex-unlock">g_mutex_unlock</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">data_mutex</span><span class="symbol">);</span>
-<span class="cbracket">}</span>
+<div class="example-contents"><pre class="programlisting">
+ gpointer current_data = NULL;
+ GMutex data_mutex;
+ GCond data_cond;
-<span class="normal"><a href="glib-Basic-Types.html#gpointer">gpointer</a></span>
-<span class="function">pop_data</span><span class="normal"> </span><span class="symbol">(</span><span class="type">void</span><span class="symbol">)</span>
-<span class="cbracket">{</span>
-<span class="normal"> </span><span class="usertype">gpointer</span><span class="normal"> data</span><span class="symbol">;</span>
+ void
+ push_data (gpointer data)
+ {
+ g_mutex_lock (&data_mutex);
+ current_data = data;
+ g_cond_signal (&data_cond);
+ g_mutex_unlock (&data_mutex);
+ }
-<span class="normal"> </span><span class="function"><a href="glib-Threads.html#g-mutex-lock">g_mutex_lock</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">data_mutex</span><span class="symbol">);</span>
-<span class="normal"> </span><span class="keyword">while</span><span class="normal"> </span><span class="symbol">(!</span><span class="normal">current_data</span><span class="symbol">)</span>
-<span class="normal"> </span><span class="function"><a href="glib-Threads.html#g-cond-wait">g_cond_wait</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">data_cond</span><span class="symbol">,</span><span class="normal"> </span><span class="symbol">&</span><span class="normal">data_mutex</span><span class="symbol">);</span>
-<span class="normal"> data </span><span class="symbol">=</span><span class="normal"> current_data</span><span class="symbol">;</span>
-<span class="normal"> current_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"> </span><span class="function"><a href="glib-Threads.html#g-mutex-unlock">g_mutex_unlock</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">data_mutex</span><span class="symbol">);</span>
+ gpointer
+ pop_data (void)
+ {
+ gpointer data;
-<span class="normal"> </span><span class="keyword">return</span><span class="normal"> data</span><span class="symbol">;</span>
-<span class="cbracket">}</span></pre></td>
- </tr>
- </tbody>
- </table>
-</div>
+ g_mutex_lock (&data_mutex);
+ while (!current_data)
+ g_cond_wait (&data_cond, &data_mutex);
+ data = current_data;
+ current_data = NULL;
+ g_mutex_unlock (&data_mutex);
+ return data;
+ }
+ </pre></div>
</div>
<p><br class="example-break">
</p>
</p>
<p>
</p>
-<div class="informalexample">
- <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
-19
-20
-21
-22
-23
-24
-25</pre></td>
- <td class="listing_code"><pre class="programlisting"><span class="normal"><a href="glib-Basic-Types.html#gpointer">gpointer</a></span>
-<span class="function">pop_data_timed</span><span class="normal"> </span><span class="symbol">(</span><span class="type">void</span><span class="symbol">)</span>
-<span class="cbracket">{</span>
-<span class="normal"> </span><span class="usertype">gint64</span><span class="normal"> end_time</span><span class="symbol">;</span>
-<span class="normal"> </span><span class="usertype">gpointer</span><span class="normal"> data</span><span class="symbol">;</span>
-
-<span class="normal"> </span><span class="function"><a href="glib-Threads.html#g-mutex-lock">g_mutex_lock</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">data_mutex</span><span class="symbol">);</span>
+<div class="informalexample"><pre class="programlisting">
+gpointer
+pop_data_timed (void)
+{
+ gint64 end_time;
+ gpointer data;
-<span class="normal"> end_time </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="glib-Date-and-Time-Functions.html#g-get-monotonic-time">g_get_monotonic_time</a></span><span class="normal"> </span><span class="symbol">()</span><span class="normal"> </span><span class="symbol">+</span><span class="normal"> </span><span class="number">5</span><span class="normal"> </span><span class="symbol">*</span><span class="normal"> <a href="glib-GDateTime.html#G-TIME-SPAN-SECOND:CAPS">G_TIME_SPAN_SECOND</a></span><span class="symbol">;</span>
-<span class="normal"> </span><span class="keyword">while</span><span class="normal"> </span><span class="symbol">(!</span><span class="normal">current_data</span><span class="symbol">)</span>
-<span class="normal"> </span><span class="keyword">if</span><span class="normal"> </span><span class="symbol">(!</span><span class="function"><a href="glib-Threads.html#g-cond-wait-until">g_cond_wait_until</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">data_cond</span><span class="symbol">,</span><span class="normal"> </span><span class="symbol">&</span><span class="normal">data_mutex</span><span class="symbol">,</span><span class="normal"> end_time</span><span class="symbol">))</span>
-<span class="normal"> </span><span class="cbracket">{</span>
-<span class="normal"> </span><span class="comment">// timeout has passed.</span>
-<span class="normal"> </span><span class="function"><a href="glib-Threads.html#g-mutex-unlock">g_mutex_unlock</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">data_mutex</span><span class="symbol">);</span>
-<span class="normal"> </span><span class="keyword">return</span><span class="normal"> <a href="glib-Standard-Macros.html#NULL:CAPS">NULL</a></span><span class="symbol">;</span>
-<span class="normal"> </span><span class="cbracket">}</span>
+ g_mutex_lock (&data_mutex);
-<span class="normal"> </span><span class="comment">// there is data for us</span>
-<span class="normal"> data </span><span class="symbol">=</span><span class="normal"> current_data</span><span class="symbol">;</span>
-<span class="normal"> current_data </span><span class="symbol">=</span><span class="normal"> <a href="glib-Standard-Macros.html#NULL:CAPS">NULL</a></span><span class="symbol">;</span>
+ end_time = g_get_monotonic_time () + 5 * G_TIME_SPAN_SECOND;
+ while (!current_data)
+ if (!g_cond_wait_until (&data_cond, &data_mutex, end_time))
+ {
+ // timeout has passed.
+ g_mutex_unlock (&data_mutex);
+ return NULL;
+ }
-<span class="normal"> </span><span class="function"><a href="glib-Threads.html#g-mutex-unlock">g_mutex_unlock</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">data_mutex</span><span class="symbol">);</span>
+ // there is data for us
+ data = current_data;
+ current_data = NULL;
-<span class="normal"> </span><span class="keyword">return</span><span class="normal"> data</span><span class="symbol">;</span>
-<span class="cbracket">}</span></pre></td>
- </tr>
- </tbody>
- </table>
-</div>
+ g_mutex_unlock (&data_mutex);
+ return data;
+}
+</pre></div>
<p>
</p>
<p>
</p>
<p>
</p>
-<div class="informalexample">
- <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
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29</pre></td>
- <td class="listing_code"><pre class="programlisting"><span class="keyword">static</span><span class="normal"> </span><span class="usertype">GPrivate</span><span class="normal"> name_key </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="glib-Threads.html#G-PRIVATE-INIT:CAPS">G_PRIVATE_INIT</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal"><a href="glib-Memory-Allocation.html#g-free">g_free</a></span><span class="symbol">);</span>
+<div class="informalexample"><pre class="programlisting">
+static GPrivate name_key = G_PRIVATE_INIT (g_free);
-<span class="comment">// return value should not be freed</span>
-<span class="keyword">const</span><span class="normal"> <a href="glib-Basic-Types.html#gchar">gchar</a> </span><span class="symbol">*</span>
-<span class="function">get_local_name</span><span class="normal"> </span><span class="symbol">(</span><span class="type">void</span><span class="symbol">)</span>
-<span class="cbracket">{</span>
-<span class="normal"> </span><span class="keyword">return</span><span class="normal"> </span><span class="function"><a href="glib-Threads.html#g-private-get">g_private_get</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">name_key</span><span class="symbol">);</span>
-<span class="cbracket">}</span>
-
-<span class="type">void</span>
-<span class="function">set_local_name</span><span class="normal"> </span><span class="symbol">(</span><span class="keyword">const</span><span class="normal"> </span><span class="usertype">gchar</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">name</span><span class="symbol">)</span>
-<span class="cbracket">{</span>
-<span class="normal"> </span><span class="function"><a href="glib-Threads.html#g-private-replace">g_private_replace</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">name_key</span><span class="symbol">,</span><span class="normal"> </span><span class="function"><a href="glib-String-Utility-Functions.html#g-strdup">g_strdup</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">name</span><span class="symbol">));</span>
-<span class="cbracket">}</span>
+// return value should not be freed
+const gchar *
+get_local_name (void)
+{
+ return g_private_get (&name_key);
+}
+void
+set_local_name (const gchar *name)
+{
+ g_private_replace (&name_key, g_strdup (name));
+}
-<span class="keyword">static</span><span class="normal"> </span><span class="usertype">GPrivate</span><span class="normal"> count_key</span><span class="symbol">;</span><span class="normal"> </span><span class="comment">// no free function</span>
-<span class="normal"><a href="glib-Basic-Types.html#gint">gint</a></span>
-<span class="function">get_local_count</span><span class="normal"> </span><span class="symbol">(</span><span class="type">void</span><span class="symbol">)</span>
-<span class="cbracket">{</span>
-<span class="normal"> </span><span class="keyword">return</span><span class="normal"> </span><span class="function"><a href="glib-Type-Conversion-Macros.html#GPOINTER-TO-INT:CAPS">GPOINTER_TO_INT</a></span><span class="normal"> </span><span class="symbol">(</span><span class="function"><a href="glib-Threads.html#g-private-get">g_private_get</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">count_key</span><span class="symbol">));</span>
-<span class="cbracket">}</span>
+static GPrivate count_key; // no free function
-<span class="type">void</span>
-<span class="function">set_local_count</span><span class="normal"> </span><span class="symbol">(</span><span class="usertype">gint</span><span class="normal"> count</span><span class="symbol">)</span>
-<span class="cbracket">{</span>
-<span class="normal"> </span><span class="function"><a href="glib-Threads.html#g-private-set">g_private_set</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">count_key</span><span class="symbol">,</span><span class="normal"> </span><span class="function"><a href="glib-Type-Conversion-Macros.html#GINT-TO-POINTER:CAPS">GINT_TO_POINTER</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">count</span><span class="symbol">));</span>
-<span class="cbracket">}</span></pre></td>
- </tr>
- </tbody>
- </table>
-</div>
+gint
+get_local_count (void)
+{
+ return GPOINTER_TO_INT (g_private_get (&count_key));
+}
+void
+set_local_count (gint count)
+{
+ g_private_set (&count_key, GINT_TO_POINTER (count));
+}
+</pre></div>
<p>
</p>
<div class="variablelist"><table border="0">
</p>
<p>
</p>
-<div class="informalexample">
- <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
- <tbody>
- <tr>
- <td class="listing_lines" align="right"><pre>1</pre></td>
- <td class="listing_code"><pre class="programlisting"><span class="usertype">GOnce</span><span class="normal"> my_once </span><span class="symbol">=</span><span class="normal"> <a href="glib-Threads.html#G-ONCE-INIT:CAPS">G_ONCE_INIT</a></span><span class="symbol">;</span></pre></td>
- </tr>
- </tbody>
- </table>
-</div>
-
+<div class="informalexample"><pre class="programlisting">
+ GOnce my_once = G_ONCE_INIT;
+</pre></div>
<p>
</p>
<p class="since">Since 2.4</p>
</p>
<p>
</p>
-<div class="informalexample">
- <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</pre></td>
- <td class="listing_code"><pre class="programlisting"><span class="normal"><a href="glib-Basic-Types.html#gpointer">gpointer</a></span>
-<span class="function">get_debug_flags</span><span class="normal"> </span><span class="symbol">(</span><span class="type">void</span><span class="symbol">)</span>
-<span class="cbracket">{</span>
-<span class="normal"> </span><span class="keyword">static</span><span class="normal"> </span><span class="usertype">GOnce</span><span class="normal"> my_once </span><span class="symbol">=</span><span class="normal"> <a href="glib-Threads.html#G-ONCE-INIT:CAPS">G_ONCE_INIT</a></span><span class="symbol">;</span>
-
-<span class="normal"> </span><span class="function"><a href="glib-Threads.html#g-once">g_once</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">my_once</span><span class="symbol">,</span><span class="normal"> parse_debug_flags</span><span class="symbol">,</span><span class="normal"> <a href="glib-Standard-Macros.html#NULL:CAPS">NULL</a></span><span class="symbol">);</span>
+<div class="informalexample"><pre class="programlisting">
+ gpointer
+ get_debug_flags (void)
+ {
+ static GOnce my_once = G_ONCE_INIT;
-<span class="normal"> </span><span class="keyword">return</span><span class="normal"> my_once</span><span class="symbol">.</span><span class="normal">retval</span><span class="symbol">;</span>
-<span class="cbracket">}</span></pre></td>
- </tr>
- </tbody>
- </table>
-</div>
+ g_once (&my_once, parse_debug_flags, NULL);
+ return my_once.retval;
+ }
+</pre></div>
<p>
</p>
<div class="variablelist"><table border="0">
</p>
<p>
</p>
-<div class="informalexample">
- <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</pre></td>
- <td class="listing_code"><pre class="programlisting"><span class="keyword">static</span><span class="normal"> </span><span class="usertype">gsize</span><span class="normal"> initialization_value </span><span class="symbol">=</span><span class="normal"> </span><span class="number">0</span><span class="symbol">;</span>
-
-<span class="keyword">if</span><span class="normal"> </span><span class="symbol">(</span><span class="function"><a href="glib-Threads.html#g-once-init-enter">g_once_init_enter</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">initialization_value</span><span class="symbol">))</span>
-<span class="normal"> </span><span class="cbracket">{</span>
-<span class="normal"> </span><span class="usertype">gsize</span><span class="normal"> setup_value </span><span class="symbol">=</span><span class="normal"> </span><span class="number">42</span><span class="symbol">;</span><span class="normal"> </span><span class="comment">/** initialization code here **/</span>
+<div class="informalexample"><pre class="programlisting">
+ static gsize initialization_value = 0;
-<span class="normal"> </span><span class="function"><a href="glib-Threads.html#g-once-init-leave">g_once_init_leave</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">initialization_value</span><span class="symbol">,</span><span class="normal"> setup_value</span><span class="symbol">);</span>
-<span class="normal"> </span><span class="cbracket">}</span>
+ if (g_once_init_enter (&initialization_value))
+ {
+ gsize setup_value = 42; /** initialization code here **/
-<span class="comment">/** use initialization_value here **/</span></pre></td>
- </tr>
- </tbody>
- </table>
-</div>
+ g_once_init_leave (&initialization_value, setup_value);
+ }
+ /** use initialization_value here **/
+</pre></div>
<p>
</p>
<div class="variablelist"><table border="0">