2001-01-30 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+ * gthread.c, gthread.h: Added g_static_mutex_free to allow using
+ GStaticMutexes with limited lifetime without leaking.
+
+ * configure.in: GStaticMutex doesn't have to provide extra space
+ for debugging information for G_ERRORCHECK_MUTEXES, as then the
+ non-default implementation (runtime_mutex) is used anyway.
+
* gthread.h (g_cond_wait): Added debug information for
g_mutex_free calls, if G_ERRORCHECK_MUTEXES is defined.
2001-01-30 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+ * gthread.c, gthread.h: Added g_static_mutex_free to allow using
+ GStaticMutexes with limited lifetime without leaking.
+
+ * configure.in: GStaticMutex doesn't have to provide extra space
+ for debugging information for G_ERRORCHECK_MUTEXES, as then the
+ non-default implementation (runtime_mutex) is used anyway.
+
* gthread.h (g_cond_wait): Added debug information for
g_mutex_free calls, if G_ERRORCHECK_MUTEXES is defined.
2001-01-30 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+ * gthread.c, gthread.h: Added g_static_mutex_free to allow using
+ GStaticMutexes with limited lifetime without leaking.
+
+ * configure.in: GStaticMutex doesn't have to provide extra space
+ for debugging information for G_ERRORCHECK_MUTEXES, as then the
+ non-default implementation (runtime_mutex) is used anyway.
+
* gthread.h (g_cond_wait): Added debug information for
g_mutex_free calls, if G_ERRORCHECK_MUTEXES is defined.
2001-01-30 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+ * gthread.c, gthread.h: Added g_static_mutex_free to allow using
+ GStaticMutexes with limited lifetime without leaking.
+
+ * configure.in: GStaticMutex doesn't have to provide extra space
+ for debugging information for G_ERRORCHECK_MUTEXES, as then the
+ non-default implementation (runtime_mutex) is used anyway.
+
* gthread.h (g_cond_wait): Added debug information for
g_mutex_free calls, if G_ERRORCHECK_MUTEXES is defined.
2001-01-30 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+ * gthread.c, gthread.h: Added g_static_mutex_free to allow using
+ GStaticMutexes with limited lifetime without leaking.
+
+ * configure.in: GStaticMutex doesn't have to provide extra space
+ for debugging information for G_ERRORCHECK_MUTEXES, as then the
+ non-default implementation (runtime_mutex) is used anyway.
+
* gthread.h (g_cond_wait): Added debug information for
g_mutex_free calls, if G_ERRORCHECK_MUTEXES is defined.
2001-01-30 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+ * gthread.c, gthread.h: Added g_static_mutex_free to allow using
+ GStaticMutexes with limited lifetime without leaking.
+
+ * configure.in: GStaticMutex doesn't have to provide extra space
+ for debugging information for G_ERRORCHECK_MUTEXES, as then the
+ non-default implementation (runtime_mutex) is used anyway.
+
* gthread.h (g_cond_wait): Added debug information for
g_mutex_free calls, if G_ERRORCHECK_MUTEXES is defined.
2001-01-30 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+ * gthread.c, gthread.h: Added g_static_mutex_free to allow using
+ GStaticMutexes with limited lifetime without leaking.
+
+ * configure.in: GStaticMutex doesn't have to provide extra space
+ for debugging information for G_ERRORCHECK_MUTEXES, as then the
+ non-default implementation (runtime_mutex) is used anyway.
+
* gthread.h (g_cond_wait): Added debug information for
g_mutex_free calls, if G_ERRORCHECK_MUTEXES is defined.
2001-01-30 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+ * gthread.c, gthread.h: Added g_static_mutex_free to allow using
+ GStaticMutexes with limited lifetime without leaking.
+
+ * configure.in: GStaticMutex doesn't have to provide extra space
+ for debugging information for G_ERRORCHECK_MUTEXES, as then the
+ non-default implementation (runtime_mutex) is used anyway.
+
* gthread.h (g_cond_wait): Added debug information for
g_mutex_free calls, if G_ERRORCHECK_MUTEXES is defined.
struct _GStaticMutex
{
struct _GMutex *runtime_mutex;
- struct {
- union {
- char pad[$g_mutex_sizeof];
- double dummy_double;
- void *dummy_pointer;
- long dummy_long;
- } mutex;
- void *debug_info;
+ union {
+ char pad[$g_mutex_sizeof];
+ double dummy_double;
+ void *dummy_pointer;
+ long dummy_long;
} static_mutex;
};
-#define G_STATIC_MUTEX_INIT { NULL, { { { $g_mutex_contents} }, NULL } }
+#define G_STATIC_MUTEX_INIT { NULL, { { $g_mutex_contents} } }
#define g_static_mutex_get_mutex(mutex) \
(g_thread_use_default_impl ? ((GMutex*) &((mutex)->static_mutex)) : \
g_static_mutex_get_mutex_impl (&((mutex)->runtime_mutex)))
+2001-01-30 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+
+ * glib/glib-sections.txt, glib/tmpl/threads.sgml: Added
+ g_static_mutex_free
+
Tue Jan 9 03:10:38 2001 Tim Janik <timj@gtk.org>
* gobject/tmpl/types.sgml: added some function documentations.
g_static_mutex_trylock
g_static_mutex_unlock
g_static_mutex_get_mutex
+g_static_mutex_free
<SUBSECTION>
G_LOCK_DEFINE
#GStaticPrivate).
</para>
-<para>
-Currently there is only as much thread support included in GLib as is
-necessary to make GLib itself multithread safe. Version 1.4 of GLib
-will contain full thread support. For now the most portable way to
-create threads is to require the macro #G_THREADS_IMPL_POSIX to be
-defined and use POSIX threads then. This will work on almost all
-platforms (except most notably Solaris and DCE threads.).
-</para>
-
<!-- ##### SECTION See_Also ##### -->
<para>
does not necessarily mean, that there is a thread implementation
available, but the infrastructure is in place and once you provide a
thread implementation to g_thread_init(), GLib will be multithread
-safe. It isn't and can't be, if #G_THREADS_ENABLED is not defined.
+safe. It isn't and cannot be, if #G_THREADS_ENABLED is not defined.
</para>
<para>
This looks like it would work, but there is a race condition while
-constructing the mutex and this code can't work reliable. So please do
+constructing the mutex and this code cannot work reliable. So please do
not use such constructs in your own programs. One working solution is:
</para>
</para>
<para>
+Sometimes you would like to dynamically create a mutex. If you don't
+want to require prior calling to g_thread_init(), because your code
+should also be usable in non-threaded programs, you are not able to
+use g_mutex_new() and thus #GMutex, as that requires a prior call to
+g_thread_init(). In theses cases you can also use a #GStaticMutex, but
+you should remember to free the #GStaticMutex with
+g_static_mutex_free() when not needed anymore to free up any
+allocated recourses.
+</para>
+
+<para>
<example>
<title>Using GStaticMutex to simplify thread-safe programming</title>
<programlisting>
@Returns: the corresponding #GMutex.
+<!-- ##### FUNCTION g_static_mutex_free ##### -->
+<para>
+Releases all resources allocated to a #GStaticMutex. You don't have to
+call this functions for a #GStaticMutex with an unbounded lifetime,
+i.e. objects declared 'static', but if you have a #GStaticMutex as a
+member of a structure and the structure is freed, you should also free
+the #GStaticMutex.
+</para>
+
+@mutex: a #GStaticMutex.
+
+
<!-- ##### MACRO G_LOCK_DEFINE ##### -->
<para>
}
void
+g_static_mutex_free (GStaticMutex* mutex)
+{
+ GMutex **runtime_mutex;
+
+ g_return_if_fail (mutex);
+
+ /* The runtime_mutex is the first (or only) member of GStaticMutex,
+ * see both versions (of glibconfig.h) in configure.in */
+ runtime_mutex = ((GMutex**)mutex);
+
+ if (*runtime_mutex)
+ g_mutex_free (*runtime_mutex);
+
+ *runtime_mutex = NULL;
+}
+
+void
g_static_rec_mutex_lock (GStaticRecMutex* mutex)
{
GSystemThread self;
g_mutex_trylock (g_static_mutex_get_mutex (mutex))
#define g_static_mutex_unlock(mutex) \
g_mutex_unlock (g_static_mutex_get_mutex (mutex))
+void g_static_mutex_free (GStaticMutex *mutex);
struct _GStaticPrivate
{
}
void
+g_static_mutex_free (GStaticMutex* mutex)
+{
+ GMutex **runtime_mutex;
+
+ g_return_if_fail (mutex);
+
+ /* The runtime_mutex is the first (or only) member of GStaticMutex,
+ * see both versions (of glibconfig.h) in configure.in */
+ runtime_mutex = ((GMutex**)mutex);
+
+ if (*runtime_mutex)
+ g_mutex_free (*runtime_mutex);
+
+ *runtime_mutex = NULL;
+}
+
+void
g_static_rec_mutex_lock (GStaticRecMutex* mutex)
{
GSystemThread self;
g_mutex_trylock (g_static_mutex_get_mutex (mutex))
#define g_static_mutex_unlock(mutex) \
g_mutex_unlock (g_static_mutex_get_mutex (mutex))
+void g_static_mutex_free (GStaticMutex *mutex);
struct _GStaticPrivate
{
2001-01-30 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
+ * gthread-impl.c (g_thread_init_with_errorcheck_mutexes): Call
+ g_thread_impl_init(), as g_thread_init won't call it.
+
* gthread-impl.c (g_mutex_free_errorcheck_impl): Fixed it for
real. Sorry for this mess. It looked like a real obvious fix, so I
didn't check. Bad boy. Added some casts to quiet the compiler.
(gboolean (*)(GCond *, GMutex *, GTimeVal *))
g_cond_timed_wait_errorcheck_impl;
+#ifdef HAVE_G_THREAD_IMPL_INIT
+ /* This isn't called in g_thread_init, as it doesn't think to get
+ * the default implementation, so we have to call it on our own. */
+ g_thread_impl_init();
+#endif
+
g_thread_init (&errorcheck_functions);
}