drop g_thread_new_full()
[platform/upstream/glib.git] / glib / deprecated / gthread-deprecated.c
1 /* GLIB - Library of useful routines for C programming
2  * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
3  *
4  * gthread.c: MT safety related functions
5  * Copyright 1998 Sebastian Wilhelmi; University of Karlsruhe
6  *                Owen Taylor
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with this library; if not, write to the
20  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21  * Boston, MA 02111-1307, USA.
22  */
23
24 #include "config.h"
25
26 /* we know we are deprecated here, no need for warnings */
27 #define GLIB_DISABLE_DEPRECATION_WARNINGS
28
29 #include "gmessages.h"
30 #include "gslice.h"
31 #include "gmain.h"
32 #include "gthread.h"
33 #include "gthreadprivate.h"
34 #include "deprecated/gthread.h"
35
36 #include "gutils.h"
37
38 /* {{{1 Documentation */
39
40 /**
41  * SECTION:threads-deprecated
42  * @title: Deprecated thread API
43  * @short_description: old thread APIs (for reference only)
44  * @see_also: #GThread
45  *
46  * These APIs are deprecated.  You should not use them in new code.
47  * This section remains only to assist with understanding code that was
48  * written to use these APIs at some point in the past.
49  **/
50
51 /**
52  * GThreadPriority:
53  * @G_THREAD_PRIORITY_LOW: a priority lower than normal
54  * @G_THREAD_PRIORITY_NORMAL: the default priority
55  * @G_THREAD_PRIORITY_HIGH: a priority higher than normal
56  * @G_THREAD_PRIORITY_URGENT: the highest priority
57  *
58  * Deprecated:2.32: Thread priorities no longer have any effect.
59  */
60
61 /**
62  * GThreadFunctions:
63  * @mutex_new: virtual function pointer for g_mutex_new()
64  * @mutex_lock: virtual function pointer for g_mutex_lock()
65  * @mutex_trylock: virtual function pointer for g_mutex_trylock()
66  * @mutex_unlock: virtual function pointer for g_mutex_unlock()
67  * @mutex_free: virtual function pointer for g_mutex_free()
68  * @cond_new: virtual function pointer for g_cond_new()
69  * @cond_signal: virtual function pointer for g_cond_signal()
70  * @cond_broadcast: virtual function pointer for g_cond_broadcast()
71  * @cond_wait: virtual function pointer for g_cond_wait()
72  * @cond_timed_wait: virtual function pointer for g_cond_timed_wait()
73  * @cond_free: virtual function pointer for g_cond_free()
74  * @private_new: virtual function pointer for g_private_new()
75  * @private_get: virtual function pointer for g_private_get()
76  * @private_set: virtual function pointer for g_private_set()
77  * @thread_create: virtual function pointer for g_thread_create()
78  * @thread_yield: virtual function pointer for g_thread_yield()
79  * @thread_join: virtual function pointer for g_thread_join()
80  * @thread_exit: virtual function pointer for g_thread_exit()
81  * @thread_set_priority: virtual function pointer for
82  *                       g_thread_set_priority()
83  * @thread_self: virtual function pointer for g_thread_self()
84  * @thread_equal: used internally by recursive mutex locks and by some
85  *                assertion checks
86  *
87  * This function table is no longer used by g_thread_init()
88  * to initialize the thread system.
89  */
90
91 /**
92  * G_THREADS_IMPL_POSIX:
93  *
94  * This macro is defined if POSIX style threads are used.
95  *
96  * Deprecated:2.32:POSIX threads are in use on all non-Windows systems.
97  *                 Use G_OS_WIN32 to detect Windows.
98  */
99
100 /**
101  * G_THREADS_IMPL_WIN32:
102  *
103  * This macro is defined if Windows style threads are used.
104  *
105  * Deprecated:2.32:Use G_OS_WIN32 to detect Windows.
106  */
107
108
109 /* {{{1 Exported Variables */
110
111 /* Set this FALSE to have previously-compiled GStaticMutex code use the
112  * slow path (ie: call into us) to avoid compatibility problems.
113  */
114 gboolean g_thread_use_default_impl = FALSE;
115
116 GThreadFunctions g_thread_functions_for_glib_use =
117 {
118   g_mutex_new,
119   g_mutex_lock,
120   g_mutex_trylock,
121   g_mutex_unlock,
122   g_mutex_free,
123   g_cond_new,
124   g_cond_signal,
125   g_cond_broadcast,
126   g_cond_wait,
127   g_cond_timed_wait,
128   g_cond_free,
129   g_private_new,
130   g_private_get,
131   g_private_set,
132   NULL,
133   g_thread_yield,
134   NULL,
135   NULL,
136   NULL,
137   NULL,
138   NULL,
139 };
140
141 static guint64
142 gettime (void)
143 {
144   return g_get_monotonic_time () * 1000;
145 }
146
147 guint64 (*g_thread_gettime) (void) = gettime;
148
149 /* Initialisation {{{1 ---------------------------------------------------- */
150 gboolean         g_threads_got_initialized = TRUE;
151
152 /**
153  * g_thread_init:
154  * @vtable: a function table of type #GThreadFunctions, that provides
155  *     the entry points to the thread system to be used. Since 2.32,
156  *     this parameter is ignored and should always be %NULL
157  *
158  * If you use GLib from more than one thread, you must initialize the
159  * thread system by calling g_thread_init().
160  *
161  * Since version 2.24, calling g_thread_init() multiple times is allowed,
162  * but nothing happens except for the first call.
163  *
164  * Since version 2.32, GLib does not support custom thread implementations
165  * anymore and the @vtable parameter is ignored and you should pass %NULL.
166  *
167  * <note><para>g_thread_init() must not be called directly or indirectly
168  * in a callback from GLib. Also no mutexes may be currently locked while
169  * calling g_thread_init().</para></note>
170  *
171  * <note><para>To use g_thread_init() in your program, you have to link
172  * with the libraries that the command <command>pkg-config --libs
173  * gthread-2.0</command> outputs. This is not the case for all the
174  * other thread-related functions of GLib. Those can be used without
175  * having to link with the thread libraries.</para></note>
176  */
177
178 /**
179  * g_thread_get_initialized:
180  *
181  * Indicates if g_thread_init() has been called.
182  *
183  * Returns: %TRUE if threads have been initialized.
184  *
185  * Since: 2.20
186  */
187 gboolean
188 g_thread_get_initialized (void)
189 {
190   return g_thread_supported ();
191 }
192
193 /* We need this for ABI compatibility */
194 void g_thread_init_glib (void) { }
195
196 /* Internal variables {{{1 */
197
198 static GSList      *g_thread_all_threads = NULL;
199 static GSList      *g_thread_free_indices = NULL;
200
201 /* Protects g_thread_all_threads and g_thread_free_indices */
202 G_LOCK_DEFINE_STATIC (g_static_mutex);
203 G_LOCK_DEFINE_STATIC (g_thread);
204
205 /* Misc. GThread functions {{{1 */
206
207 /**
208  * g_thread_set_priority:
209  * @thread: a #GThread.
210  * @priority: ignored
211  *
212  * This function does nothing.
213  *
214  * Deprecated:2.32: Thread priorities no longer have any effect.
215  */
216 void
217 g_thread_set_priority (GThread         *thread,
218                        GThreadPriority  priority)
219 {
220 }
221
222 /**
223  * g_thread_foreach:
224  * @thread_func: function to call for all #GThread structures
225  * @user_data: second argument to @thread_func
226  *
227  * Call @thread_func on all #GThreads that have been
228  * created with g_thread_create().
229  *
230  * Note that threads may decide to exit while @thread_func is
231  * running, so without intimate knowledge about the lifetime of
232  * foreign threads, @thread_func shouldn't access the GThread*
233  * pointer passed in as first argument. However, @thread_func will
234  * not be called for threads which are known to have exited already.
235  *
236  * Due to thread lifetime checks, this function has an execution complexity
237  * which is quadratic in the number of existing threads.
238  *
239  * Since: 2.10
240  *
241  * Deprecated:2.32: There aren't many things you can do with a #GThread,
242  *     except comparing it with one that was returned from g_thread_create().
243  *     There are better ways to find out if your thread is still alive.
244  */
245 void
246 g_thread_foreach (GFunc    thread_func,
247                   gpointer user_data)
248 {
249   GSList *slist = NULL;
250   GRealThread *thread;
251   g_return_if_fail (thread_func != NULL);
252   /* snapshot the list of threads for iteration */
253   G_LOCK (g_thread);
254   slist = g_slist_copy (g_thread_all_threads);
255   G_UNLOCK (g_thread);
256   /* walk the list, skipping non-existent threads */
257   while (slist)
258     {
259       GSList *node = slist;
260       slist = node->next;
261       /* check whether the current thread still exists */
262       G_LOCK (g_thread);
263       if (g_slist_find (g_thread_all_threads, node->data))
264         thread = node->data;
265       else
266         thread = NULL;
267       G_UNLOCK (g_thread);
268       if (thread)
269         thread_func (thread, user_data);
270       g_slist_free_1 (node);
271     }
272 }
273
274 static void
275 g_enumerable_thread_remove (gpointer data)
276 {
277   GRealThread *thread = data;
278
279   G_LOCK (g_thread);
280   g_thread_all_threads = g_slist_remove (g_thread_all_threads, thread);
281   G_UNLOCK (g_thread);
282 }
283
284 GPrivate enumerable_thread_private = G_PRIVATE_INIT (g_enumerable_thread_remove);
285
286 static void
287 g_enumerable_thread_add (GRealThread *thread)
288 {
289   G_LOCK (g_thread);
290   g_thread_all_threads = g_slist_prepend (g_thread_all_threads, thread);
291   G_UNLOCK (g_thread);
292
293   g_private_set (&enumerable_thread_private, thread);
294 }
295
296 static gpointer
297 g_deprecated_thread_proxy (gpointer data)
298 {
299   GRealThread *real = data;
300
301   g_enumerable_thread_add (real);
302
303   return g_thread_proxy (data);
304 }
305
306 /**
307  * g_thread_create:
308  * @func: a function to execute in the new thread
309  * @data: an argument to supply to the new thread
310  * @joinable: should this thread be joinable?
311  * @error: return location for error, or %NULL
312  *
313  * This function creates a new thread.
314  *
315  * The new thread executes the function @func with the argument @data.
316  * If the thread was created successfully, it is returned.
317  *
318  * @error can be %NULL to ignore errors, or non-%NULL to report errors.
319  * The error is set, if and only if the function returns %NULL.
320  *
321  * This function returns a reference to the created thread only if
322  * @joinable is %TRUE.  In that case, you must free this reference by
323  * calling g_thread_unref() or g_thread_join().  If @joinable is %FALSE
324  * then you should probably not touch the return value.
325  *
326  * Returns: the new #GThread on success
327  *
328  * Deprecated:2.32: Use g_thread_new() instead
329  */
330 GThread *
331 g_thread_create (GThreadFunc   func,
332                  gpointer      data,
333                  gboolean      joinable,
334                  GError      **error)
335 {
336   return g_thread_create_full (func, data, 0, joinable, 0, 0, error);
337 }
338
339 /**
340  * g_thread_create_full:
341  * @func: a function to execute in the new thread.
342  * @data: an argument to supply to the new thread.
343  * @stack_size: a stack size for the new thread.
344  * @joinable: should this thread be joinable?
345  * @bound: ignored
346  * @priority: ignored
347  * @error: return location for error.
348  * @Returns: the new #GThread on success.
349  *
350  * This function creates a new thread.
351  *
352  * Deprecated:2.32: The @bound and @priority arguments are now ignored.
353  * Use g_thread_new().
354  */
355 GThread *
356 g_thread_create_full (GThreadFunc       func,
357                       gpointer          data,
358                       gulong            stack_size,
359                       gboolean          joinable,
360                       gboolean          bound,
361                       GThreadPriority   priority,
362                       GError          **error)
363 {
364   GThread *thread;
365
366   thread = g_thread_new_internal (NULL, g_deprecated_thread_proxy,
367                                   func, data, stack_size, error);
368
369   if (!joinable)
370     {
371       thread->joinable = FALSE;
372       g_thread_unref (thread);
373     }
374
375   return thread;
376 }
377
378 /* GOnce {{{1 ------------------------------------------------------------- */
379 gboolean
380 g_once_init_enter_impl (volatile gsize *location)
381 {
382   return (g_once_init_enter) (location);
383 }
384
385 /* GStaticMutex {{{1 ------------------------------------------------------ */
386
387 /**
388  * GStaticMutex:
389  *
390  * A #GStaticMutex works like a #GMutex.
391  *
392  * Prior to GLib 2.32, GStaticMutex had the significant advantage
393  * that it doesn't need to be created at run-time, but can be defined
394  * at compile-time. Since 2.32, #GMutex can be statically allocated
395  * as well, and GStaticMutex has been deprecated.
396  *
397  * Here is a version of our give_me_next_number() example using
398  * a GStaticMutex.
399  *
400  * <example>
401  *  <title>
402  *   Using <structname>GStaticMutex</structname>
403  *   to simplify thread-safe programming
404  *  </title>
405  *  <programlisting>
406  *   int
407  *   give_me_next_number (void)
408  *   {
409  *     static int current_number = 0;
410  *     int ret_val;
411  *     static GStaticMutex mutex = G_STATIC_MUTEX_INIT;
412  *
413  *     g_static_mutex_lock (&amp;mutex);
414  *     ret_val = current_number = calc_next_number (current_number);
415  *     g_static_mutex_unlock (&amp;mutex);
416  *
417  *     return ret_val;
418  *   }
419  *  </programlisting>
420  * </example>
421  *
422  * Sometimes you would like to dynamically create a mutex. If you don't
423  * want to require prior calling to g_thread_init(), because your code
424  * should also be usable in non-threaded programs, you are not able to
425  * use g_mutex_new() and thus #GMutex, as that requires a prior call to
426  * g_thread_init(). In theses cases you can also use a #GStaticMutex.
427  * It must be initialized with g_static_mutex_init() before using it
428  * and freed with with g_static_mutex_free() when not needed anymore to
429  * free up any allocated resources.
430  *
431  * Even though #GStaticMutex is not opaque, it should only be used with
432  * the following functions, as it is defined differently on different
433  * platforms.
434  *
435  * All of the <function>g_static_mutex_*</function> functions apart
436  * from <function>g_static_mutex_get_mutex</function> can also be used
437  * even if g_thread_init() has not yet been called. Then they do
438  * nothing, apart from <function>g_static_mutex_trylock</function>,
439  * which does nothing but returning %TRUE.
440  *
441  * <note><para>All of the <function>g_static_mutex_*</function>
442  * functions are actually macros. Apart from taking their addresses, you
443  * can however use them as if they were functions.</para></note>
444  **/
445
446 /**
447  * G_STATIC_MUTEX_INIT:
448  *
449  * A #GStaticMutex must be initialized with this macro, before it can
450  * be used. This macro can used be to initialize a variable, but it
451  * cannot be assigned to a variable. In that case you have to use
452  * g_static_mutex_init().
453  *
454  * |[
455  * GStaticMutex my_mutex = G_STATIC_MUTEX_INIT;
456  * ]|
457  **/
458
459 /**
460  * g_static_mutex_init:
461  * @mutex: a #GStaticMutex to be initialized.
462  *
463  * Initializes @mutex.
464  * Alternatively you can initialize it with #G_STATIC_MUTEX_INIT.
465  *
466  * Deprecated: 2.32: Use g_mutex_init()
467  */
468 void
469 g_static_mutex_init (GStaticMutex *mutex)
470 {
471   static const GStaticMutex init_mutex = G_STATIC_MUTEX_INIT;
472
473   g_return_if_fail (mutex);
474
475   *mutex = init_mutex;
476 }
477
478 /* IMPLEMENTATION NOTE:
479  *
480  * On some platforms a GStaticMutex is actually a normal GMutex stored
481  * inside of a structure instead of being allocated dynamically.  We can
482  * only do this for platforms on which we know, in advance, how to
483  * allocate (size) and initialise (value) that memory.
484  *
485  * On other platforms, a GStaticMutex is nothing more than a pointer to
486  * a GMutex.  In that case, the first access we make to the static mutex
487  * must first allocate the normal GMutex and store it into the pointer.
488  *
489  * configure.ac writes macros into glibconfig.h to determine if
490  * g_static_mutex_get_mutex() accesses the structure in memory directly
491  * (on platforms where we are able to do that) or if it ends up here,
492  * where we may have to allocate the GMutex before returning it.
493  */
494
495 /**
496  * g_static_mutex_get_mutex:
497  * @mutex: a #GStaticMutex.
498  * @Returns: the #GMutex corresponding to @mutex.
499  *
500  * For some operations (like g_cond_wait()) you must have a #GMutex
501  * instead of a #GStaticMutex. This function will return the
502  * corresponding #GMutex for @mutex.
503  *
504  * Deprecated: 2.32: Just use a #GMutex
505  */
506 GMutex *
507 g_static_mutex_get_mutex_impl (GStaticMutex* mutex)
508 {
509   GMutex *result;
510
511   if (!g_thread_supported ())
512     return NULL;
513
514   result = g_atomic_pointer_get (&mutex->mutex);
515
516   if (!result)
517     {
518       G_LOCK (g_static_mutex);
519
520       result = mutex->mutex;
521       if (!result)
522         {
523           result = g_mutex_new ();
524           g_atomic_pointer_set (&mutex->mutex, result);
525         }
526
527       G_UNLOCK (g_static_mutex);
528     }
529
530   return result;
531 }
532
533 /* IMPLEMENTATION NOTE:
534  *
535  * g_static_mutex_lock(), g_static_mutex_trylock() and
536  * g_static_mutex_unlock() are all preprocessor macros that wrap the
537  * corresponding g_mutex_*() function around a call to
538  * g_static_mutex_get_mutex().
539  */
540
541 /**
542  * g_static_mutex_lock:
543  * @mutex: a #GStaticMutex.
544  *
545  * Works like g_mutex_lock(), but for a #GStaticMutex.
546  *
547  * Deprecated: 2.32: Use g_mutex_lock()
548  */
549
550 /**
551  * g_static_mutex_trylock:
552  * @mutex: a #GStaticMutex.
553  * @Returns: %TRUE, if the #GStaticMutex could be locked.
554  *
555  * Works like g_mutex_trylock(), but for a #GStaticMutex.
556  *
557  * Deprecated: 2.32: Use g_mutex_trylock()
558  */
559
560 /**
561  * g_static_mutex_unlock:
562  * @mutex: a #GStaticMutex.
563  *
564  * Works like g_mutex_unlock(), but for a #GStaticMutex.
565  *
566  * Deprecated: 2.32: Use g_mutex_unlock()
567  */
568
569 /**
570  * g_static_mutex_free:
571  * @mutex: a #GStaticMutex to be freed.
572  *
573  * Releases all resources allocated to @mutex.
574  *
575  * You don't have to call this functions for a #GStaticMutex with an
576  * unbounded lifetime, i.e. objects declared 'static', but if you have
577  * a #GStaticMutex as a member of a structure and the structure is
578  * freed, you should also free the #GStaticMutex.
579  *
580  * <note><para>Calling g_static_mutex_free() on a locked mutex may
581  * result in undefined behaviour.</para></note>
582  *
583  * Deprecated: 2.32: Use g_mutex_free()
584  */
585 void
586 g_static_mutex_free (GStaticMutex* mutex)
587 {
588   GMutex **runtime_mutex;
589
590   g_return_if_fail (mutex);
591
592   /* The runtime_mutex is the first (or only) member of GStaticMutex,
593    * see both versions (of glibconfig.h) in configure.ac. Note, that
594    * this variable is NULL, if g_thread_init() hasn't been called or
595    * if we're using the default thread implementation and it provides
596    * static mutexes. */
597   runtime_mutex = ((GMutex**)mutex);
598
599   if (*runtime_mutex)
600     g_mutex_free (*runtime_mutex);
601
602   *runtime_mutex = NULL;
603 }
604
605 /* {{{1 GStaticRecMutex */
606
607 /**
608  * GStaticRecMutex:
609  *
610  * A #GStaticRecMutex works like a #GStaticMutex, but it can be locked
611  * multiple times by one thread. If you enter it n times, you have to
612  * unlock it n times again to let other threads lock it. An exception
613  * is the function g_static_rec_mutex_unlock_full(): that allows you to
614  * unlock a #GStaticRecMutex completely returning the depth, (i.e. the
615  * number of times this mutex was locked). The depth can later be used
616  * to restore the state of the #GStaticRecMutex by calling
617  * g_static_rec_mutex_lock_full(). In GLib 2.32, #GStaticRecMutex has
618  * been deprecated in favor of #GRecMutex.
619  *
620  * Even though #GStaticRecMutex is not opaque, it should only be used
621  * with the following functions.
622  *
623  * All of the <function>g_static_rec_mutex_*</function> functions can
624  * be used even if g_thread_init() has not been called. Then they do
625  * nothing, apart from <function>g_static_rec_mutex_trylock</function>,
626  * which does nothing but returning %TRUE.
627  **/
628
629 /**
630  * G_STATIC_REC_MUTEX_INIT:
631  *
632  * A #GStaticRecMutex must be initialized with this macro before it can
633  * be used. This macro can used be to initialize a variable, but it
634  * cannot be assigned to a variable. In that case you have to use
635  * g_static_rec_mutex_init().
636  *
637  * |[
638  *   GStaticRecMutex my_mutex = G_STATIC_REC_MUTEX_INIT;
639  * ]|
640  */
641
642 /**
643  * g_static_rec_mutex_init:
644  * @mutex: a #GStaticRecMutex to be initialized.
645  *
646  * A #GStaticRecMutex must be initialized with this function before it
647  * can be used. Alternatively you can initialize it with
648  * #G_STATIC_REC_MUTEX_INIT.
649  *
650  * Deprecated: 2.32: Use g_rec_mutex_init()
651  */
652 void
653 g_static_rec_mutex_init (GStaticRecMutex *mutex)
654 {
655   static const GStaticRecMutex init_mutex = G_STATIC_REC_MUTEX_INIT;
656
657   g_return_if_fail (mutex);
658
659   *mutex = init_mutex;
660 }
661
662 static GRecMutex *
663 g_static_rec_mutex_get_rec_mutex_impl (GStaticRecMutex* mutex)
664 {
665   GRecMutex *result;
666
667   if (!g_thread_supported ())
668     return NULL;
669
670   result = g_atomic_pointer_get (&mutex->mutex.mutex);
671
672   if (!result)
673     {
674       G_LOCK (g_static_mutex);
675
676       result = (GRecMutex *) mutex->mutex.mutex;
677       if (!result)
678         {
679           result = g_slice_new (GRecMutex);
680           g_rec_mutex_init (result);
681           g_atomic_pointer_set (&mutex->mutex.mutex, result);
682         }
683
684       G_UNLOCK (g_static_mutex);
685     }
686
687   return result;
688 }
689
690 /**
691  * g_static_rec_mutex_lock:
692  * @mutex: a #GStaticRecMutex to lock.
693  *
694  * Locks @mutex. If @mutex is already locked by another thread, the
695  * current thread will block until @mutex is unlocked by the other
696  * thread. If @mutex is already locked by the calling thread, this
697  * functions increases the depth of @mutex and returns immediately.
698  *
699  * Deprecated: 2.32: Use g_rec_mutex_lock()
700  */
701 void
702 g_static_rec_mutex_lock (GStaticRecMutex* mutex)
703 {
704   GRecMutex *rm;
705   rm = g_static_rec_mutex_get_rec_mutex_impl (mutex);
706   g_rec_mutex_lock (rm);
707   mutex->depth++;
708 }
709
710 /**
711  * g_static_rec_mutex_trylock:
712  * @mutex: a #GStaticRecMutex to lock.
713  * @Returns: %TRUE, if @mutex could be locked.
714  *
715  * Tries to lock @mutex. If @mutex is already locked by another thread,
716  * it immediately returns %FALSE. Otherwise it locks @mutex and returns
717  * %TRUE. If @mutex is already locked by the calling thread, this
718  * functions increases the depth of @mutex and immediately returns
719  * %TRUE.
720  *
721  * Deprecated: 2.32: Use g_rec_mutex_trylock()
722  */
723 gboolean
724 g_static_rec_mutex_trylock (GStaticRecMutex* mutex)
725 {
726   GRecMutex *rm;
727   rm = g_static_rec_mutex_get_rec_mutex_impl (mutex);
728
729   if (g_rec_mutex_trylock (rm))
730     {
731       mutex->depth++;
732       return TRUE;
733     }
734   else
735     return FALSE;
736 }
737
738 /**
739  * g_static_rec_mutex_unlock:
740  * @mutex: a #GStaticRecMutex to unlock.
741  *
742  * Unlocks @mutex. Another thread will be allowed to lock @mutex only
743  * when it has been unlocked as many times as it had been locked
744  * before. If @mutex is completely unlocked and another thread is
745  * blocked in a g_static_rec_mutex_lock() call for @mutex, it will be
746  * woken and can lock @mutex itself.
747  *
748  * Deprecated: 2.32: Use g_rec_mutex_unlock()
749  */
750 void
751 g_static_rec_mutex_unlock (GStaticRecMutex* mutex)
752 {
753   GRecMutex *rm;
754   rm = g_static_rec_mutex_get_rec_mutex_impl (mutex);
755   mutex->depth--;
756   g_rec_mutex_unlock (rm);
757 }
758
759 /**
760  * g_static_rec_mutex_lock_full:
761  * @mutex: a #GStaticRecMutex to lock.
762  * @depth: number of times this mutex has to be unlocked to be
763  *         completely unlocked.
764  *
765  * Works like calling g_static_rec_mutex_lock() for @mutex @depth times.
766  *
767  * Deprecated: 2.32: Use g_rec_mutex_lock()
768  */
769 void
770 g_static_rec_mutex_lock_full (GStaticRecMutex *mutex,
771                               guint            depth)
772 {
773   GRecMutex *rm;
774
775   rm = g_static_rec_mutex_get_rec_mutex_impl (mutex);
776   while (depth--)
777     {
778       g_rec_mutex_lock (rm);
779       mutex->depth++;
780     }
781 }
782
783 /**
784  * g_static_rec_mutex_unlock_full:
785  * @mutex: a #GStaticRecMutex to completely unlock.
786  * @Returns: number of times @mutex has been locked by the current
787  *           thread.
788  *
789  * Completely unlocks @mutex. If another thread is blocked in a
790  * g_static_rec_mutex_lock() call for @mutex, it will be woken and can
791  * lock @mutex itself. This function returns the number of times that
792  * @mutex has been locked by the current thread. To restore the state
793  * before the call to g_static_rec_mutex_unlock_full() you can call
794  * g_static_rec_mutex_lock_full() with the depth returned by this
795  * function.
796  *
797  * Deprecated: 2.32: Use g_rec_mutex_unlock()
798  */
799 guint
800 g_static_rec_mutex_unlock_full (GStaticRecMutex *mutex)
801 {
802   GRecMutex *rm;
803   gint depth;
804
805   rm = g_static_rec_mutex_get_rec_mutex_impl (mutex);
806   depth = mutex->depth;
807   while (mutex->depth--)
808     g_rec_mutex_unlock (rm);
809
810   return depth;
811 }
812
813 /**
814  * g_static_rec_mutex_free:
815  * @mutex: a #GStaticRecMutex to be freed.
816  *
817  * Releases all resources allocated to a #GStaticRecMutex.
818  *
819  * You don't have to call this functions for a #GStaticRecMutex with an
820  * unbounded lifetime, i.e. objects declared 'static', but if you have
821  * a #GStaticRecMutex as a member of a structure and the structure is
822  * freed, you should also free the #GStaticRecMutex.
823  *
824  * Deprecated: 2.32: Use g_rec_mutex_clear()
825  */
826 void
827 g_static_rec_mutex_free (GStaticRecMutex *mutex)
828 {
829   g_return_if_fail (mutex);
830
831   if (mutex->mutex.mutex)
832     {
833       GRecMutex *rm = (GRecMutex *) mutex->mutex.mutex;
834
835       g_rec_mutex_clear (rm);
836       g_slice_free (GRecMutex, rm);
837     }
838 }
839
840 /* GStaticRWLock {{{1 ----------------------------------------------------- */
841
842 /**
843  * GStaticRWLock:
844  *
845  * The #GStaticRWLock struct represents a read-write lock. A read-write
846  * lock can be used for protecting data that some portions of code only
847  * read from, while others also write. In such situations it is
848  * desirable that several readers can read at once, whereas of course
849  * only one writer may write at a time. Take a look at the following
850  * example:
851  *
852  * <example>
853  *  <title>An array with access functions</title>
854  *  <programlisting>
855  *   GStaticRWLock rwlock = G_STATIC_RW_LOCK_INIT;
856  *   GPtrArray *array;
857  *
858  *   gpointer
859  *   my_array_get (guint index)
860  *   {
861  *     gpointer retval = NULL;
862  *
863  *     if (!array)
864  *       return NULL;
865  *
866  *     g_static_rw_lock_reader_lock (&amp;rwlock);
867  *     if (index &lt; array->len)
868  *       retval = g_ptr_array_index (array, index);
869  *     g_static_rw_lock_reader_unlock (&amp;rwlock);
870  *
871  *     return retval;
872  *   }
873  *
874  *   void
875  *   my_array_set (guint index, gpointer data)
876  *   {
877  *     g_static_rw_lock_writer_lock (&amp;rwlock);
878  *
879  *     if (!array)
880  *       array = g_ptr_array_new (<!-- -->);
881  *
882  *     if (index >= array->len)
883  *       g_ptr_array_set_size (array, index+1);
884  *     g_ptr_array_index (array, index) = data;
885  *
886  *     g_static_rw_lock_writer_unlock (&amp;rwlock);
887  *   }
888  *  </programlisting>
889  * </example>
890  *
891  * This example shows an array which can be accessed by many readers
892  * (the <function>my_array_get()</function> function) simultaneously,
893  * whereas the writers (the <function>my_array_set()</function>
894  * function) will only be allowed once at a time and only if no readers
895  * currently access the array. This is because of the potentially
896  * dangerous resizing of the array. Using these functions is fully
897  * multi-thread safe now.
898  *
899  * Most of the time, writers should have precedence over readers. That
900  * means, for this implementation, that as soon as a writer wants to
901  * lock the data, no other reader is allowed to lock the data, whereas,
902  * of course, the readers that already have locked the data are allowed
903  * to finish their operation. As soon as the last reader unlocks the
904  * data, the writer will lock it.
905  *
906  * Even though #GStaticRWLock is not opaque, it should only be used
907  * with the following functions.
908  *
909  * All of the <function>g_static_rw_lock_*</function> functions can be
910  * used even if g_thread_init() has not been called. Then they do
911  * nothing, apart from <function>g_static_rw_lock_*_trylock</function>,
912  * which does nothing but returning %TRUE.
913  *
914  * <note><para>A read-write lock has a higher overhead than a mutex. For
915  * example, both g_static_rw_lock_reader_lock() and
916  * g_static_rw_lock_reader_unlock() have to lock and unlock a
917  * #GStaticMutex, so it takes at least twice the time to lock and unlock
918  * a #GStaticRWLock that it does to lock and unlock a #GStaticMutex. So
919  * only data structures that are accessed by multiple readers, and which
920  * keep the lock for a considerable time justify a #GStaticRWLock. The
921  * above example most probably would fare better with a
922  * #GStaticMutex.</para></note>
923  *
924  * Deprecated: 2.32: Use a #GRWLock instead
925  **/
926
927 /**
928  * G_STATIC_RW_LOCK_INIT:
929  *
930  * A #GStaticRWLock must be initialized with this macro before it can
931  * be used. This macro can used be to initialize a variable, but it
932  * cannot be assigned to a variable. In that case you have to use
933  * g_static_rw_lock_init().
934  *
935  * |[
936  *   GStaticRWLock my_lock = G_STATIC_RW_LOCK_INIT;
937  * ]|
938  */
939
940 /**
941  * g_static_rw_lock_init:
942  * @lock: a #GStaticRWLock to be initialized.
943  *
944  * A #GStaticRWLock must be initialized with this function before it
945  * can be used. Alternatively you can initialize it with
946  * #G_STATIC_RW_LOCK_INIT.
947  *
948  * Deprecated: 2.32: Use g_rw_lock_init() instead
949  */
950 void
951 g_static_rw_lock_init (GStaticRWLock* lock)
952 {
953   static const GStaticRWLock init_lock = G_STATIC_RW_LOCK_INIT;
954
955   g_return_if_fail (lock);
956
957   *lock = init_lock;
958 }
959
960 inline static void
961 g_static_rw_lock_wait (GCond** cond, GStaticMutex* mutex)
962 {
963   if (!*cond)
964       *cond = g_cond_new ();
965   g_cond_wait (*cond, g_static_mutex_get_mutex (mutex));
966 }
967
968 inline static void
969 g_static_rw_lock_signal (GStaticRWLock* lock)
970 {
971   if (lock->want_to_write && lock->write_cond)
972     g_cond_signal (lock->write_cond);
973   else if (lock->want_to_read && lock->read_cond)
974     g_cond_broadcast (lock->read_cond);
975 }
976
977 /**
978  * g_static_rw_lock_reader_lock:
979  * @lock: a #GStaticRWLock to lock for reading.
980  *
981  * Locks @lock for reading. There may be unlimited concurrent locks for
982  * reading of a #GStaticRWLock at the same time.  If @lock is already
983  * locked for writing by another thread or if another thread is already
984  * waiting to lock @lock for writing, this function will block until
985  * @lock is unlocked by the other writing thread and no other writing
986  * threads want to lock @lock. This lock has to be unlocked by
987  * g_static_rw_lock_reader_unlock().
988  *
989  * #GStaticRWLock is not recursive. It might seem to be possible to
990  * recursively lock for reading, but that can result in a deadlock, due
991  * to writer preference.
992  *
993  * Deprecated: 2.32: Use g_rw_lock_reader_lock() instead
994  */
995 void
996 g_static_rw_lock_reader_lock (GStaticRWLock* lock)
997 {
998   g_return_if_fail (lock);
999
1000   if (!g_threads_got_initialized)
1001     return;
1002
1003   g_static_mutex_lock (&lock->mutex);
1004   lock->want_to_read++;
1005   while (lock->have_writer || lock->want_to_write)
1006     g_static_rw_lock_wait (&lock->read_cond, &lock->mutex);
1007   lock->want_to_read--;
1008   lock->read_counter++;
1009   g_static_mutex_unlock (&lock->mutex);
1010 }
1011
1012 /**
1013  * g_static_rw_lock_reader_trylock:
1014  * @lock: a #GStaticRWLock to lock for reading.
1015  * @Returns: %TRUE, if @lock could be locked for reading.
1016  *
1017  * Tries to lock @lock for reading. If @lock is already locked for
1018  * writing by another thread or if another thread is already waiting to
1019  * lock @lock for writing, immediately returns %FALSE. Otherwise locks
1020  * @lock for reading and returns %TRUE. This lock has to be unlocked by
1021  * g_static_rw_lock_reader_unlock().
1022  *
1023  * Deprectated: 2.32: Use g_rw_lock_reader_trylock() instead
1024  */
1025 gboolean
1026 g_static_rw_lock_reader_trylock (GStaticRWLock* lock)
1027 {
1028   gboolean ret_val = FALSE;
1029
1030   g_return_val_if_fail (lock, FALSE);
1031
1032   if (!g_threads_got_initialized)
1033     return TRUE;
1034
1035   g_static_mutex_lock (&lock->mutex);
1036   if (!lock->have_writer && !lock->want_to_write)
1037     {
1038       lock->read_counter++;
1039       ret_val = TRUE;
1040     }
1041   g_static_mutex_unlock (&lock->mutex);
1042   return ret_val;
1043 }
1044
1045 /**
1046  * g_static_rw_lock_reader_unlock:
1047  * @lock: a #GStaticRWLock to unlock after reading.
1048  *
1049  * Unlocks @lock. If a thread waits to lock @lock for writing and all
1050  * locks for reading have been unlocked, the waiting thread is woken up
1051  * and can lock @lock for writing.
1052  *
1053  * Deprectated: 2.32: Use g_rw_lock_reader_unlock() instead
1054  */
1055 void
1056 g_static_rw_lock_reader_unlock  (GStaticRWLock* lock)
1057 {
1058   g_return_if_fail (lock);
1059
1060   if (!g_threads_got_initialized)
1061     return;
1062
1063   g_static_mutex_lock (&lock->mutex);
1064   lock->read_counter--;
1065   if (lock->read_counter == 0)
1066     g_static_rw_lock_signal (lock);
1067   g_static_mutex_unlock (&lock->mutex);
1068 }
1069
1070 /**
1071  * g_static_rw_lock_writer_lock:
1072  * @lock: a #GStaticRWLock to lock for writing.
1073  *
1074  * Locks @lock for writing. If @lock is already locked for writing or
1075  * reading by other threads, this function will block until @lock is
1076  * completely unlocked and then lock @lock for writing. While this
1077  * functions waits to lock @lock, no other thread can lock @lock for
1078  * reading. When @lock is locked for writing, no other thread can lock
1079  * @lock (neither for reading nor writing). This lock has to be
1080  * unlocked by g_static_rw_lock_writer_unlock().
1081  *
1082  * Deprectated: 2.32: Use g_rw_lock_writer_lock() instead
1083  */
1084 void
1085 g_static_rw_lock_writer_lock (GStaticRWLock* lock)
1086 {
1087   g_return_if_fail (lock);
1088
1089   if (!g_threads_got_initialized)
1090     return;
1091
1092   g_static_mutex_lock (&lock->mutex);
1093   lock->want_to_write++;
1094   while (lock->have_writer || lock->read_counter)
1095     g_static_rw_lock_wait (&lock->write_cond, &lock->mutex);
1096   lock->want_to_write--;
1097   lock->have_writer = TRUE;
1098   g_static_mutex_unlock (&lock->mutex);
1099 }
1100
1101 /**
1102  * g_static_rw_lock_writer_trylock:
1103  * @lock: a #GStaticRWLock to lock for writing.
1104  * @Returns: %TRUE, if @lock could be locked for writing.
1105  *
1106  * Tries to lock @lock for writing. If @lock is already locked (for
1107  * either reading or writing) by another thread, it immediately returns
1108  * %FALSE. Otherwise it locks @lock for writing and returns %TRUE. This
1109  * lock has to be unlocked by g_static_rw_lock_writer_unlock().
1110  *
1111  * Deprectated: 2.32: Use g_rw_lock_writer_trylock() instead
1112  */
1113 gboolean
1114 g_static_rw_lock_writer_trylock (GStaticRWLock* lock)
1115 {
1116   gboolean ret_val = FALSE;
1117
1118   g_return_val_if_fail (lock, FALSE);
1119
1120   if (!g_threads_got_initialized)
1121     return TRUE;
1122
1123   g_static_mutex_lock (&lock->mutex);
1124   if (!lock->have_writer && !lock->read_counter)
1125     {
1126       lock->have_writer = TRUE;
1127       ret_val = TRUE;
1128     }
1129   g_static_mutex_unlock (&lock->mutex);
1130   return ret_val;
1131 }
1132
1133 /**
1134  * g_static_rw_lock_writer_unlock:
1135  * @lock: a #GStaticRWLock to unlock after writing.
1136  *
1137  * Unlocks @lock. If a thread is waiting to lock @lock for writing and
1138  * all locks for reading have been unlocked, the waiting thread is
1139  * woken up and can lock @lock for writing. If no thread is waiting to
1140  * lock @lock for writing, and some thread or threads are waiting to
1141  * lock @lock for reading, the waiting threads are woken up and can
1142  * lock @lock for reading.
1143  *
1144  * Deprectated: 2.32: Use g_rw_lock_writer_unlock() instead
1145  */
1146 void
1147 g_static_rw_lock_writer_unlock (GStaticRWLock* lock)
1148 {
1149   g_return_if_fail (lock);
1150
1151   if (!g_threads_got_initialized)
1152     return;
1153
1154   g_static_mutex_lock (&lock->mutex);
1155   lock->have_writer = FALSE;
1156   g_static_rw_lock_signal (lock);
1157   g_static_mutex_unlock (&lock->mutex);
1158 }
1159
1160 /**
1161  * g_static_rw_lock_free:
1162  * @lock: a #GStaticRWLock to be freed.
1163  *
1164  * Releases all resources allocated to @lock.
1165  *
1166  * You don't have to call this functions for a #GStaticRWLock with an
1167  * unbounded lifetime, i.e. objects declared 'static', but if you have
1168  * a #GStaticRWLock as a member of a structure, and the structure is
1169  * freed, you should also free the #GStaticRWLock.
1170  *
1171  * Deprecated: 2.32: Use a #GRWLock instead
1172  */
1173 void
1174 g_static_rw_lock_free (GStaticRWLock* lock)
1175 {
1176   g_return_if_fail (lock);
1177
1178   if (lock->read_cond)
1179     {
1180       g_cond_free (lock->read_cond);
1181       lock->read_cond = NULL;
1182     }
1183   if (lock->write_cond)
1184     {
1185       g_cond_free (lock->write_cond);
1186       lock->write_cond = NULL;
1187     }
1188   g_static_mutex_free (&lock->mutex);
1189 }
1190
1191 /* GPrivate {{{1 ------------------------------------------------------ */
1192
1193 /**
1194  * g_private_new:
1195  * @notify: a #GDestroyNotify
1196  *
1197  * Deprecated:2.32: dynamic allocation of #GPrivate is a bad idea.  Use
1198  *                  static storage and G_PRIVATE_INIT() instead.
1199  *
1200  * Returns: a newly allocated #GPrivate (which can never be destroyed)
1201  */
1202 GPrivate *
1203 g_private_new (GDestroyNotify notify)
1204 {
1205   GPrivate tmp = G_PRIVATE_INIT (notify);
1206   GPrivate *key;
1207
1208   key = g_slice_new (GPrivate);
1209   *key = tmp;
1210
1211   return key;
1212 }
1213
1214 /* {{{1 GStaticPrivate */
1215
1216 typedef struct _GStaticPrivateNode GStaticPrivateNode;
1217 struct _GStaticPrivateNode
1218 {
1219   gpointer        data;
1220   GDestroyNotify  destroy;
1221   GStaticPrivate *owner;
1222 };
1223
1224 static void
1225 g_static_private_cleanup (gpointer data)
1226 {
1227   GArray *array = data;
1228   guint i;
1229
1230   for (i = 0; i < array->len; i++ )
1231     {
1232       GStaticPrivateNode *node = &g_array_index (array, GStaticPrivateNode, i);
1233       if (node->destroy)
1234         node->destroy (node->data);
1235     }
1236
1237   g_array_free (array, TRUE);
1238 }
1239
1240 GPrivate static_private_private = G_PRIVATE_INIT (g_static_private_cleanup);
1241
1242 /**
1243  * GStaticPrivate:
1244  *
1245  * A #GStaticPrivate works almost like a #GPrivate, but it has one
1246  * significant advantage. It doesn't need to be created at run-time
1247  * like a #GPrivate, but can be defined at compile-time. This is
1248  * similar to the difference between #GMutex and #GStaticMutex. Now
1249  * look at our <function>give_me_next_number()</function> example with
1250  * #GStaticPrivate:
1251  *
1252  * <example>
1253  *  <title>Using GStaticPrivate for per-thread data</title>
1254  *  <programlisting>
1255  *   int
1256  *   give_me_next_number (<!-- -->)
1257  *   {
1258  *     static GStaticPrivate current_number_key = G_STATIC_PRIVATE_INIT;
1259  *     int *current_number = g_static_private_get (&amp;current_number_key);
1260  *
1261  *     if (!current_number)
1262  *       {
1263  *         current_number = g_new (int,1);
1264  *         *current_number = 0;
1265  *         g_static_private_set (&amp;current_number_key, current_number, g_free);
1266  *       }
1267  *
1268  *     *current_number = calc_next_number (*current_number);
1269  *
1270  *     return *current_number;
1271  *   }
1272  *  </programlisting>
1273  * </example>
1274  */
1275
1276 /**
1277  * G_STATIC_PRIVATE_INIT:
1278  *
1279  * Every #GStaticPrivate must be initialized with this macro, before it
1280  * can be used.
1281  *
1282  * |[
1283  *   GStaticPrivate my_private = G_STATIC_PRIVATE_INIT;
1284  * ]|
1285  */
1286
1287 /**
1288  * g_static_private_init:
1289  * @private_key: a #GStaticPrivate to be initialized
1290  *
1291  * Initializes @private_key. Alternatively you can initialize it with
1292  * #G_STATIC_PRIVATE_INIT.
1293  */
1294 void
1295 g_static_private_init (GStaticPrivate *private_key)
1296 {
1297   private_key->index = 0;
1298 }
1299
1300 /**
1301  * g_static_private_get:
1302  * @private_key: a #GStaticPrivate
1303  *
1304  * Works like g_private_get() only for a #GStaticPrivate.
1305  *
1306  * This function works even if g_thread_init() has not yet been called.
1307  *
1308  * Returns: the corresponding pointer
1309  */
1310 gpointer
1311 g_static_private_get (GStaticPrivate *private_key)
1312 {
1313   GArray *array;
1314   gpointer ret = NULL;
1315
1316   array = g_private_get (&static_private_private);
1317
1318   if (array && private_key->index != 0 && private_key->index <= array->len)
1319     {
1320       GStaticPrivateNode *node;
1321
1322       node = &g_array_index (array, GStaticPrivateNode, private_key->index - 1);
1323
1324       /* Deal with the possibility that the GStaticPrivate which used
1325        * to have this index got freed and the index got allocated to
1326        * a new one. In this case, the data in the node is stale, so
1327        * free it and return NULL.
1328        */
1329       if (G_UNLIKELY (node->owner != private_key))
1330         {
1331           if (node->destroy)
1332             node->destroy (node->data);
1333           node->destroy = NULL;
1334           node->data = NULL;
1335           node->owner = NULL;
1336         }
1337       ret = node->data;
1338     }
1339
1340   return ret;
1341 }
1342
1343 /**
1344  * g_static_private_set:
1345  * @private_key: a #GStaticPrivate
1346  * @data: the new pointer
1347  * @notify: a function to be called with the pointer whenever the
1348  *     current thread ends or sets this pointer again
1349  *
1350  * Sets the pointer keyed to @private_key for the current thread and
1351  * the function @notify to be called with that pointer (%NULL or
1352  * non-%NULL), whenever the pointer is set again or whenever the
1353  * current thread ends.
1354  *
1355  * This function works even if g_thread_init() has not yet been called.
1356  * If g_thread_init() is called later, the @data keyed to @private_key
1357  * will be inherited only by the main thread, i.e. the one that called
1358  * g_thread_init().
1359  *
1360  * <note><para>@notify is used quite differently from @destructor in
1361  * g_private_new().</para></note>
1362  */
1363 void
1364 g_static_private_set (GStaticPrivate *private_key,
1365                       gpointer        data,
1366                       GDestroyNotify  notify)
1367 {
1368   GArray *array;
1369   static guint next_index = 0;
1370   GStaticPrivateNode *node;
1371
1372   if (!private_key->index)
1373     {
1374       G_LOCK (g_thread);
1375
1376       if (!private_key->index)
1377         {
1378           if (g_thread_free_indices)
1379             {
1380               private_key->index = GPOINTER_TO_UINT (g_thread_free_indices->data);
1381               g_thread_free_indices = g_slist_delete_link (g_thread_free_indices,
1382                                                            g_thread_free_indices);
1383             }
1384           else
1385             private_key->index = ++next_index;
1386         }
1387
1388       G_UNLOCK (g_thread);
1389     }
1390
1391   array = g_private_get (&static_private_private);
1392   if (!array)
1393     {
1394       array = g_array_new (FALSE, TRUE, sizeof (GStaticPrivateNode));
1395       g_private_set (&static_private_private, array);
1396     }
1397   if (private_key->index > array->len)
1398     g_array_set_size (array, private_key->index);
1399
1400   node = &g_array_index (array, GStaticPrivateNode, private_key->index - 1);
1401
1402   if (node->destroy)
1403     node->destroy (node->data);
1404
1405   node->data = data;
1406   node->destroy = notify;
1407   node->owner = private_key;
1408 }
1409
1410 /**
1411  * g_static_private_free:
1412  * @private_key: a #GStaticPrivate to be freed
1413  *
1414  * Releases all resources allocated to @private_key.
1415  *
1416  * You don't have to call this functions for a #GStaticPrivate with an
1417  * unbounded lifetime, i.e. objects declared 'static', but if you have
1418  * a #GStaticPrivate as a member of a structure and the structure is
1419  * freed, you should also free the #GStaticPrivate.
1420  */
1421 void
1422 g_static_private_free (GStaticPrivate *private_key)
1423 {
1424   guint idx = private_key->index;
1425
1426   if (!idx)
1427     return;
1428
1429   private_key->index = 0;
1430
1431   /* Freeing the per-thread data is deferred to either the
1432    * thread end or the next g_static_private_get() call for
1433    * the same index.
1434    */
1435   G_LOCK (g_thread);
1436   g_thread_free_indices = g_slist_prepend (g_thread_free_indices,
1437                                            GUINT_TO_POINTER (idx));
1438   G_UNLOCK (g_thread);
1439 }
1440
1441 /* GMutex {{{1 ------------------------------------------------------ */
1442
1443 /**
1444  * g_mutex_new:
1445  *
1446  * Allocates and initializes a new #GMutex.
1447  *
1448  * Returns: a newly allocated #GMutex. Use g_mutex_free() to free
1449  *
1450  * Deprecated:3.32:GMutex can now be statically allocated, or embedded
1451  * in structures and initialised with g_mutex_init().
1452  */
1453 GMutex *
1454 g_mutex_new (void)
1455 {
1456   GMutex *mutex;
1457
1458   mutex = g_slice_new (GMutex);
1459   g_mutex_init (mutex);
1460
1461   return mutex;
1462 }
1463
1464 /**
1465  * g_mutex_free:
1466  * @mutex: a #GMutex
1467  *
1468  * Destroys a @mutex that has been created with g_mutex_new().
1469  *
1470  * Calling g_mutex_free() on a locked mutex may result
1471  * in undefined behaviour.
1472  *
1473  * Deprecated:3.32:GMutex can now be statically allocated, or embedded
1474  * in structures and initialised with g_mutex_init().
1475  */
1476 void
1477 g_mutex_free (GMutex *mutex)
1478 {
1479   g_mutex_clear (mutex);
1480   g_slice_free (GMutex, mutex);
1481 }
1482
1483 /* GCond {{{1 ------------------------------------------------------ */
1484
1485 /**
1486  * g_cond_new:
1487  *
1488  * Allocates and initializes a new #GCond.
1489  *
1490  * Returns: a newly allocated #GCond. Free with g_cond_free()
1491  *
1492  * Deprecated:3.32:GCond can now be statically allocated, or embedded
1493  * in structures and initialised with g_cond_init().
1494  */
1495 GCond *
1496 g_cond_new (void)
1497 {
1498   GCond *cond;
1499
1500   cond = g_slice_new (GCond);
1501   g_cond_init (cond);
1502
1503   return cond;
1504 }
1505
1506 /**
1507  * g_cond_free:
1508  * @cond: a #GCond
1509  *
1510  * Destroys a #GCond that has been created with g_cond_new().
1511  *
1512  * Calling g_cond_free() for a #GCond on which threads are
1513  * blocking leads to undefined behaviour.
1514  *
1515  * Deprecated:3.32:GCond can now be statically allocated, or embedded
1516  * in structures and initialised with g_cond_init().
1517  */
1518 void
1519 g_cond_free (GCond *cond)
1520 {
1521   g_cond_clear (cond);
1522   g_slice_free (GCond, cond);
1523 }
1524
1525 /* {{{1 Epilogue */
1526 /* vim: set foldmethod=marker: */