diff options
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | ChangeLog.pre-2-0 | 7 | ||||
-rw-r--r-- | ChangeLog.pre-2-10 | 7 | ||||
-rw-r--r-- | ChangeLog.pre-2-12 | 7 | ||||
-rw-r--r-- | ChangeLog.pre-2-2 | 7 | ||||
-rw-r--r-- | ChangeLog.pre-2-4 | 7 | ||||
-rw-r--r-- | ChangeLog.pre-2-6 | 7 | ||||
-rw-r--r-- | ChangeLog.pre-2-8 | 7 | ||||
-rw-r--r-- | configure.in | 15 | ||||
-rw-r--r-- | docs/reference/ChangeLog | 5 | ||||
-rw-r--r-- | docs/reference/glib/glib-sections.txt | 1 | ||||
-rw-r--r-- | docs/reference/glib/tmpl/threads.sgml | 36 | ||||
-rw-r--r-- | glib/gthread.c | 17 | ||||
-rw-r--r-- | glib/gthread.h | 1 | ||||
-rw-r--r-- | gthread.c | 17 | ||||
-rw-r--r-- | gthread.h | 1 | ||||
-rw-r--r-- | gthread/ChangeLog | 3 | ||||
-rw-r--r-- | gthread/gthread-impl.c | 6 |
18 files changed, 138 insertions, 20 deletions
@@ -1,5 +1,12 @@ 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. diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index 21b694694..3caeb4339 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,5 +1,12 @@ 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. diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 21b694694..3caeb4339 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,5 +1,12 @@ 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. diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12 index 21b694694..3caeb4339 100644 --- a/ChangeLog.pre-2-12 +++ b/ChangeLog.pre-2-12 @@ -1,5 +1,12 @@ 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. diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index 21b694694..3caeb4339 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,5 +1,12 @@ 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. diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 21b694694..3caeb4339 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,5 +1,12 @@ 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. diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 21b694694..3caeb4339 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,5 +1,12 @@ 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. diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 21b694694..3caeb4339 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,5 +1,12 @@ 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. diff --git a/configure.in b/configure.in index 53d64feae..b0144aa5c 100644 --- a/configure.in +++ b/configure.in @@ -1479,17 +1479,14 @@ typedef struct _GStaticMutex GStaticMutex; 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))) diff --git a/docs/reference/ChangeLog b/docs/reference/ChangeLog index 624f878e6..a7f1e447f 100644 --- a/docs/reference/ChangeLog +++ b/docs/reference/ChangeLog @@ -1,3 +1,8 @@ +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. diff --git a/docs/reference/glib/glib-sections.txt b/docs/reference/glib/glib-sections.txt index aa398f065..4fdbf9044 100644 --- a/docs/reference/glib/glib-sections.txt +++ b/docs/reference/glib/glib-sections.txt @@ -465,6 +465,7 @@ g_static_mutex_lock g_static_mutex_trylock g_static_mutex_unlock g_static_mutex_get_mutex +g_static_mutex_free <SUBSECTION> G_LOCK_DEFINE diff --git a/docs/reference/glib/tmpl/threads.sgml b/docs/reference/glib/tmpl/threads.sgml index 92a6c9b5b..10fbee496 100644 --- a/docs/reference/glib/tmpl/threads.sgml +++ b/docs/reference/glib/tmpl/threads.sgml @@ -30,15 +30,6 @@ that every thread has a private instance of (#GPrivate, #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> @@ -51,7 +42,7 @@ This macro is defined, if GLib was compiled with thread support. This 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> @@ -343,7 +334,7 @@ access. A first naive implementation would be: <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> @@ -478,6 +469,17 @@ safer version of our give_me_next_number() example: </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> @@ -572,6 +574,18 @@ corresponding #GMutex for every #GStaticMutex. @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> diff --git a/glib/gthread.c b/glib/gthread.c index bbb18ac51..4e94474f3 100644 --- a/glib/gthread.c +++ b/glib/gthread.c @@ -160,6 +160,23 @@ g_static_mutex_get_mutex_impl (GMutex** mutex) } 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; diff --git a/glib/gthread.h b/glib/gthread.h index d6f408b59..303c4419e 100644 --- a/glib/gthread.h +++ b/glib/gthread.h @@ -227,6 +227,7 @@ void g_thread_set_priority (GThread *thread, 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 { @@ -160,6 +160,23 @@ g_static_mutex_get_mutex_impl (GMutex** mutex) } 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; @@ -227,6 +227,7 @@ void g_thread_set_priority (GThread *thread, 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 { diff --git a/gthread/ChangeLog b/gthread/ChangeLog index d6878da44..48ecf7338 100644 --- a/gthread/ChangeLog +++ b/gthread/ChangeLog @@ -1,5 +1,8 @@ 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. diff --git a/gthread/gthread-impl.c b/gthread/gthread-impl.c index 8e5e69adc..6d194994a 100644 --- a/gthread/gthread-impl.c +++ b/gthread/gthread-impl.c @@ -290,6 +290,12 @@ g_thread_init_with_errorcheck_mutexes (GThreadFunctions* init) (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); } |