From f9dfcb27b7ba635212711a1f9d22fe8282813732 Mon Sep 17 00:00:00 2001 From: Sebastian Wilhelmi Date: Tue, 30 Jan 2001 14:16:56 +0000 Subject: [PATCH] Call g_thread_impl_init(), as g_thread_init won't call it. 2001-01-30 Sebastian Wilhelmi * gthread/gthread-impl.c (g_thread_init_with_errorcheck_mutexes): Call g_thread_impl_init(), as g_thread_init won't call it. * glib/glib-sections.txt, glib/tmpl/threads.sgml: Added g_static_mutex_free * 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. --- ChangeLog | 7 +++++++ ChangeLog.pre-2-0 | 7 +++++++ ChangeLog.pre-2-10 | 7 +++++++ ChangeLog.pre-2-12 | 7 +++++++ ChangeLog.pre-2-2 | 7 +++++++ ChangeLog.pre-2-4 | 7 +++++++ ChangeLog.pre-2-6 | 7 +++++++ ChangeLog.pre-2-8 | 7 +++++++ configure.in | 15 ++++++--------- docs/reference/ChangeLog | 5 +++++ docs/reference/glib/glib-sections.txt | 1 + docs/reference/glib/tmpl/threads.sgml | 36 ++++++++++++++++++++++++----------- glib/gthread.c | 17 +++++++++++++++++ glib/gthread.h | 1 + gthread.c | 17 +++++++++++++++++ gthread.h | 1 + gthread/ChangeLog | 3 +++ gthread/gthread-impl.c | 6 ++++++ 18 files changed, 138 insertions(+), 20 deletions(-) diff --git a/ChangeLog b/ChangeLog index 21b6946..3caeb43 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2001-01-30 Sebastian Wilhelmi + * 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 21b6946..3caeb43 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,5 +1,12 @@ 2001-01-30 Sebastian Wilhelmi + * 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 21b6946..3caeb43 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,5 +1,12 @@ 2001-01-30 Sebastian Wilhelmi + * 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 21b6946..3caeb43 100644 --- a/ChangeLog.pre-2-12 +++ b/ChangeLog.pre-2-12 @@ -1,5 +1,12 @@ 2001-01-30 Sebastian Wilhelmi + * 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 21b6946..3caeb43 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,5 +1,12 @@ 2001-01-30 Sebastian Wilhelmi + * 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 21b6946..3caeb43 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,5 +1,12 @@ 2001-01-30 Sebastian Wilhelmi + * 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 21b6946..3caeb43 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,5 +1,12 @@ 2001-01-30 Sebastian Wilhelmi + * 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 21b6946..3caeb43 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,5 +1,12 @@ 2001-01-30 Sebastian Wilhelmi + * 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 53d64fe..b0144aa 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 624f878..a7f1e44 100644 --- a/docs/reference/ChangeLog +++ b/docs/reference/ChangeLog @@ -1,3 +1,8 @@ +2001-01-30 Sebastian Wilhelmi + + * glib/glib-sections.txt, glib/tmpl/threads.sgml: Added + g_static_mutex_free + Tue Jan 9 03:10:38 2001 Tim Janik * 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 aa398f0..4fdbf90 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 G_LOCK_DEFINE diff --git a/docs/reference/glib/tmpl/threads.sgml b/docs/reference/glib/tmpl/threads.sgml index 92a6c9b..10fbee4 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). - -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.). - - @@ -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. @@ -343,7 +334,7 @@ access. A first naive implementation would be: 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: @@ -478,6 +469,17 @@ safer version of our give_me_next_number() example: +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. + + + Using GStaticMutex to simplify thread-safe programming @@ -572,6 +574,18 @@ corresponding #GMutex for every #GStaticMutex. @Returns: the corresponding #GMutex. + + +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. + + +@mutex: a #GStaticMutex. + + diff --git a/glib/gthread.c b/glib/gthread.c index bbb18ac..4e94474 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 d6f408b..303c441 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 { diff --git a/gthread.c b/gthread.c index bbb18ac..4e94474 100644 --- a/gthread.c +++ b/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/gthread.h b/gthread.h index d6f408b..303c441 100644 --- a/gthread.h +++ b/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 { diff --git a/gthread/ChangeLog b/gthread/ChangeLog index d6878da..48ecf73 100644 --- a/gthread/ChangeLog +++ b/gthread/ChangeLog @@ -1,5 +1,8 @@ 2001-01-30 Sebastian Wilhelmi + * 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 8e5e69a..6d19499 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); } -- 2.7.4