summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--ChangeLog.pre-2-07
-rw-r--r--ChangeLog.pre-2-107
-rw-r--r--ChangeLog.pre-2-127
-rw-r--r--ChangeLog.pre-2-27
-rw-r--r--ChangeLog.pre-2-47
-rw-r--r--ChangeLog.pre-2-67
-rw-r--r--ChangeLog.pre-2-87
-rw-r--r--configure.in15
-rw-r--r--docs/reference/ChangeLog5
-rw-r--r--docs/reference/glib/glib-sections.txt1
-rw-r--r--docs/reference/glib/tmpl/threads.sgml36
-rw-r--r--glib/gthread.c17
-rw-r--r--glib/gthread.h1
-rw-r--r--gthread.c17
-rw-r--r--gthread.h1
-rw-r--r--gthread/ChangeLog3
-rw-r--r--gthread/gthread-impl.c6
18 files changed, 138 insertions, 20 deletions
diff --git a/ChangeLog b/ChangeLog
index 21b694694..3caeb4339 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
{
diff --git a/gthread.c b/gthread.c
index bbb18ac51..4e94474f3 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 d6f408b59..303c4419e 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 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);
}