From 7b06f826c942bf691b1fe6e52546ebcee3eecb5a Mon Sep 17 00:00:00 2001 From: Sebastian Wilhelmi Date: Mon, 2 Apr 2001 16:34:08 +0000 Subject: [PATCH] Use the new GRealThread member "context" instead of a GStaticPrivate to 2001-04-02 Sebastian Wilhelmi * gmain.c: Use the new GRealThread member "context" instead of a GStaticPrivate to store the thread specific main loop context. * gthread.c: Added "context" member to GRealThread and updated g_thread_create, g_thread_self and g_thread_cleanup accordingly. * gthread.c, gthread.h: Removed the functions g_static_private_(get|set)_for_thread and adapted g_static_private_(get|set) and g_static_private_free accordingly. --- ChangeLog | 12 +++++++++ ChangeLog.pre-2-0 | 12 +++++++++ ChangeLog.pre-2-10 | 12 +++++++++ ChangeLog.pre-2-12 | 12 +++++++++ ChangeLog.pre-2-2 | 12 +++++++++ ChangeLog.pre-2-4 | 12 +++++++++ ChangeLog.pre-2-6 | 12 +++++++++ ChangeLog.pre-2-8 | 12 +++++++++ glib/gmain.c | 22 +++++++++++----- glib/gthread.c | 77 ++++++++++++++++++++++++++++-------------------------- glib/gthread.h | 6 ----- gmain.c | 22 +++++++++++----- gthread.c | 77 ++++++++++++++++++++++++++++-------------------------- gthread.h | 6 ----- 14 files changed, 208 insertions(+), 98 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7d132c3..bd293a4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2001-04-02 Sebastian Wilhelmi + + * gmain.c: Use the new GRealThread member "context" instead of a + GStaticPrivate to store the thread specific main loop context. + + * gthread.c: Added "context" member to GRealThread and updated + g_thread_create, g_thread_self and g_thread_cleanup accordingly. + + * gthread.c, gthread.h: Removed the functions + g_static_private_(get|set)_for_thread and adapted + g_static_private_(get|set) and g_static_private_free accordingly. + 2001-03-30 Sven Neumann * ghash.[ch] diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index 7d132c3..bd293a4 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,15 @@ +2001-04-02 Sebastian Wilhelmi + + * gmain.c: Use the new GRealThread member "context" instead of a + GStaticPrivate to store the thread specific main loop context. + + * gthread.c: Added "context" member to GRealThread and updated + g_thread_create, g_thread_self and g_thread_cleanup accordingly. + + * gthread.c, gthread.h: Removed the functions + g_static_private_(get|set)_for_thread and adapted + g_static_private_(get|set) and g_static_private_free accordingly. + 2001-03-30 Sven Neumann * ghash.[ch] diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 7d132c3..bd293a4 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,15 @@ +2001-04-02 Sebastian Wilhelmi + + * gmain.c: Use the new GRealThread member "context" instead of a + GStaticPrivate to store the thread specific main loop context. + + * gthread.c: Added "context" member to GRealThread and updated + g_thread_create, g_thread_self and g_thread_cleanup accordingly. + + * gthread.c, gthread.h: Removed the functions + g_static_private_(get|set)_for_thread and adapted + g_static_private_(get|set) and g_static_private_free accordingly. + 2001-03-30 Sven Neumann * ghash.[ch] diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12 index 7d132c3..bd293a4 100644 --- a/ChangeLog.pre-2-12 +++ b/ChangeLog.pre-2-12 @@ -1,3 +1,15 @@ +2001-04-02 Sebastian Wilhelmi + + * gmain.c: Use the new GRealThread member "context" instead of a + GStaticPrivate to store the thread specific main loop context. + + * gthread.c: Added "context" member to GRealThread and updated + g_thread_create, g_thread_self and g_thread_cleanup accordingly. + + * gthread.c, gthread.h: Removed the functions + g_static_private_(get|set)_for_thread and adapted + g_static_private_(get|set) and g_static_private_free accordingly. + 2001-03-30 Sven Neumann * ghash.[ch] diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index 7d132c3..bd293a4 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,15 @@ +2001-04-02 Sebastian Wilhelmi + + * gmain.c: Use the new GRealThread member "context" instead of a + GStaticPrivate to store the thread specific main loop context. + + * gthread.c: Added "context" member to GRealThread and updated + g_thread_create, g_thread_self and g_thread_cleanup accordingly. + + * gthread.c, gthread.h: Removed the functions + g_static_private_(get|set)_for_thread and adapted + g_static_private_(get|set) and g_static_private_free accordingly. + 2001-03-30 Sven Neumann * ghash.[ch] diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 7d132c3..bd293a4 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,15 @@ +2001-04-02 Sebastian Wilhelmi + + * gmain.c: Use the new GRealThread member "context" instead of a + GStaticPrivate to store the thread specific main loop context. + + * gthread.c: Added "context" member to GRealThread and updated + g_thread_create, g_thread_self and g_thread_cleanup accordingly. + + * gthread.c, gthread.h: Removed the functions + g_static_private_(get|set)_for_thread and adapted + g_static_private_(get|set) and g_static_private_free accordingly. + 2001-03-30 Sven Neumann * ghash.[ch] diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 7d132c3..bd293a4 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,15 @@ +2001-04-02 Sebastian Wilhelmi + + * gmain.c: Use the new GRealThread member "context" instead of a + GStaticPrivate to store the thread specific main loop context. + + * gthread.c: Added "context" member to GRealThread and updated + g_thread_create, g_thread_self and g_thread_cleanup accordingly. + + * gthread.c, gthread.h: Removed the functions + g_static_private_(get|set)_for_thread and adapted + g_static_private_(get|set) and g_static_private_free accordingly. + 2001-03-30 Sven Neumann * ghash.[ch] diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 7d132c3..bd293a4 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,15 @@ +2001-04-02 Sebastian Wilhelmi + + * gmain.c: Use the new GRealThread member "context" instead of a + GStaticPrivate to store the thread specific main loop context. + + * gthread.c: Added "context" member to GRealThread and updated + g_thread_create, g_thread_self and g_thread_cleanup accordingly. + + * gthread.c, gthread.h: Removed the functions + g_static_private_(get|set)_for_thread and adapted + g_static_private_(get|set) and g_static_private_free accordingly. + 2001-03-30 Sven Neumann * ghash.[ch] diff --git a/glib/gmain.c b/glib/gmain.c index 6435a15..1fa20fe 100644 --- a/glib/gmain.c +++ b/glib/gmain.c @@ -496,7 +496,7 @@ g_poll (GPollFD *fds, /* Called to clean up when a thread terminates */ -static void +void g_main_context_destroy (GMainContext *context) { GSource *source; @@ -538,6 +538,18 @@ g_main_context_destroy (GMainContext *context) g_free (context); } +/* This is an imcomplete (only the members up till context) version of + * GRealThread from gthread.h. Keep them in sync */ +typedef struct _GRealThread GRealThread; +struct _GRealThread +{ + GThread thread; + GThreadFunc func; + gpointer arg; + gpointer private_data; + GMainContext *context; +}; + /** * g_main_context_get: * @thread: a #GThread @@ -551,13 +563,13 @@ g_main_context_destroy (GMainContext *context) GMainContext * g_main_context_get (GThread *thread) { - static GStaticPrivate private_key = G_STATIC_PRIVATE_INIT; + GRealThread *real_thread = (GRealThread*)thread; GMainContext *context; g_return_val_if_fail (thread != NULL, NULL); if (g_thread_supported ()) - context = g_static_private_get_for_thread (&private_key, thread); + context = real_thread->context; else context = default_main_context; @@ -616,9 +628,7 @@ g_main_context_get (GThread *thread) #endif if (g_thread_supported ()) - g_static_private_set_for_thread (&private_key, thread, - context, - (GDestroyNotify)g_main_context_destroy); + real_thread->context = context; else default_main_context = context; } diff --git a/glib/gthread.c b/glib/gthread.c index ef0f3c8..8ee0c99 100644 --- a/glib/gthread.c +++ b/glib/gthread.c @@ -69,6 +69,7 @@ g_thread_error_quark (void) return quark; } +/* Keep this in sync with GRealThread in gmain.c! */ typedef struct _GRealThread GRealThread; struct _GRealThread { @@ -76,6 +77,7 @@ struct _GRealThread GThreadFunc func; gpointer arg; gpointer private_data; + GMainContext *context; GSystemThread system_thread; #ifdef G_THREAD_USE_PID_SURROGATE pid_t pid; @@ -346,17 +348,8 @@ g_static_private_init (GStaticPrivate *private_key) gpointer g_static_private_get (GStaticPrivate *private_key) { - return g_static_private_get_for_thread (private_key, g_thread_self ()); -} - -gpointer -g_static_private_get_for_thread (GStaticPrivate *private_key, - GThread *thread) -{ + GRealThread *self = (GRealThread*) g_thread_self (); GArray *array; - GRealThread *self = (GRealThread*) thread; - - g_return_val_if_fail (thread, NULL); array = self->private_data; if (!array) @@ -365,7 +358,8 @@ g_static_private_get_for_thread (GStaticPrivate *private_key, if (!private_key->index) return NULL; else if (private_key->index <= array->len) - return g_array_index (array, GStaticPrivateNode, private_key->index - 1).data; + return g_array_index (array, GStaticPrivateNode, + private_key->index - 1).data; else return NULL; } @@ -375,23 +369,11 @@ g_static_private_set (GStaticPrivate *private_key, gpointer data, GDestroyNotify notify) { - g_static_private_set_for_thread (private_key, g_thread_self (), - data, notify); -} - -void -g_static_private_set_for_thread (GStaticPrivate *private_key, - GThread *thread, - gpointer data, - GDestroyNotify notify) -{ + GRealThread *self = (GRealThread*) g_thread_self (); GArray *array; - GRealThread *self =(GRealThread*) thread; static guint next_index = 0; GStaticPrivateNode *node; - g_return_if_fail (thread); - array = self->private_data; if (!array) { @@ -444,32 +426,48 @@ g_static_private_set_for_thread (GStaticPrivate *private_key, void g_static_private_free (GStaticPrivate *private_key) { - GStaticPrivate copied_key; + guint index = private_key->index; GSList *list; - copied_key.index = private_key->index; - private_key->index = 0; - - if (!copied_key.index) + if (!index) return; + + private_key->index = 0; G_LOCK (g_thread); list = g_thread_all_threads; while (list) { - GThread *thread = list->data; + GRealThread *thread = list->data; + GArray *array = thread->private_data; list = list->next; - - G_UNLOCK (g_thread); - g_static_private_set_for_thread (&copied_key, thread, NULL, NULL); - G_LOCK (g_thread); + + if (array && index <= array->len) + { + GStaticPrivateNode *node = &g_array_index (array, + GStaticPrivateNode, + index - 1); + gpointer ddata = node->data; + GDestroyNotify ddestroy = node->destroy; + + node->data = NULL; + node->destroy = NULL; + + if (ddestroy) + { + G_UNLOCK (g_thread); + ddestroy (ddata); + G_LOCK (g_thread); + } + } } - g_thread_free_indeces = - g_slist_prepend (g_thread_free_indeces, - GUINT_TO_POINTER (copied_key.index)); + g_thread_free_indeces = g_slist_prepend (g_thread_free_indeces, + GUINT_TO_POINTER (index)); G_UNLOCK (g_thread); } +void g_main_context_destroy (GMainContext *context); + static void g_thread_cleanup (gpointer data) { @@ -490,6 +488,9 @@ g_thread_cleanup (gpointer data) } g_array_free (array, TRUE); } + if (thread->context) + g_main_context_destroy (thread->context); + /* We only free the thread structure, if it isn't joinable. If it is, the structure is freed in g_thread_join */ if (!thread->thread.joinable) @@ -559,6 +560,7 @@ g_thread_create (GThreadFunc thread_func, result->func = thread_func; result->arg = arg; result->private_data = NULL; + result->context = NULL; G_LOCK (g_thread); G_THREAD_UF (thread_create, (g_thread_create_proxy, result, stack_size, joinable, bound, priority, @@ -643,6 +645,7 @@ g_thread_self (void) thread->func = NULL; thread->arg = NULL; thread->private_data = NULL; + thread->context = NULL; if (g_thread_supported ()) G_THREAD_UF (thread_self, (&thread->system_thread)); diff --git a/glib/gthread.h b/glib/gthread.h index 098cfc4..2f147b4 100644 --- a/glib/gthread.h +++ b/glib/gthread.h @@ -229,12 +229,6 @@ gpointer g_static_private_get (GStaticPrivate *private_key); void g_static_private_set (GStaticPrivate *private_key, gpointer data, GDestroyNotify notify); -gpointer g_static_private_get_for_thread (GStaticPrivate *private_key, - GThread *thread); -void g_static_private_set_for_thread (GStaticPrivate *private_key, - GThread *thread, - gpointer data, - GDestroyNotify notify); void g_static_private_free (GStaticPrivate *private_key); typedef struct _GStaticRecMutex GStaticRecMutex; diff --git a/gmain.c b/gmain.c index 6435a15..1fa20fe 100644 --- a/gmain.c +++ b/gmain.c @@ -496,7 +496,7 @@ g_poll (GPollFD *fds, /* Called to clean up when a thread terminates */ -static void +void g_main_context_destroy (GMainContext *context) { GSource *source; @@ -538,6 +538,18 @@ g_main_context_destroy (GMainContext *context) g_free (context); } +/* This is an imcomplete (only the members up till context) version of + * GRealThread from gthread.h. Keep them in sync */ +typedef struct _GRealThread GRealThread; +struct _GRealThread +{ + GThread thread; + GThreadFunc func; + gpointer arg; + gpointer private_data; + GMainContext *context; +}; + /** * g_main_context_get: * @thread: a #GThread @@ -551,13 +563,13 @@ g_main_context_destroy (GMainContext *context) GMainContext * g_main_context_get (GThread *thread) { - static GStaticPrivate private_key = G_STATIC_PRIVATE_INIT; + GRealThread *real_thread = (GRealThread*)thread; GMainContext *context; g_return_val_if_fail (thread != NULL, NULL); if (g_thread_supported ()) - context = g_static_private_get_for_thread (&private_key, thread); + context = real_thread->context; else context = default_main_context; @@ -616,9 +628,7 @@ g_main_context_get (GThread *thread) #endif if (g_thread_supported ()) - g_static_private_set_for_thread (&private_key, thread, - context, - (GDestroyNotify)g_main_context_destroy); + real_thread->context = context; else default_main_context = context; } diff --git a/gthread.c b/gthread.c index ef0f3c8..8ee0c99 100644 --- a/gthread.c +++ b/gthread.c @@ -69,6 +69,7 @@ g_thread_error_quark (void) return quark; } +/* Keep this in sync with GRealThread in gmain.c! */ typedef struct _GRealThread GRealThread; struct _GRealThread { @@ -76,6 +77,7 @@ struct _GRealThread GThreadFunc func; gpointer arg; gpointer private_data; + GMainContext *context; GSystemThread system_thread; #ifdef G_THREAD_USE_PID_SURROGATE pid_t pid; @@ -346,17 +348,8 @@ g_static_private_init (GStaticPrivate *private_key) gpointer g_static_private_get (GStaticPrivate *private_key) { - return g_static_private_get_for_thread (private_key, g_thread_self ()); -} - -gpointer -g_static_private_get_for_thread (GStaticPrivate *private_key, - GThread *thread) -{ + GRealThread *self = (GRealThread*) g_thread_self (); GArray *array; - GRealThread *self = (GRealThread*) thread; - - g_return_val_if_fail (thread, NULL); array = self->private_data; if (!array) @@ -365,7 +358,8 @@ g_static_private_get_for_thread (GStaticPrivate *private_key, if (!private_key->index) return NULL; else if (private_key->index <= array->len) - return g_array_index (array, GStaticPrivateNode, private_key->index - 1).data; + return g_array_index (array, GStaticPrivateNode, + private_key->index - 1).data; else return NULL; } @@ -375,23 +369,11 @@ g_static_private_set (GStaticPrivate *private_key, gpointer data, GDestroyNotify notify) { - g_static_private_set_for_thread (private_key, g_thread_self (), - data, notify); -} - -void -g_static_private_set_for_thread (GStaticPrivate *private_key, - GThread *thread, - gpointer data, - GDestroyNotify notify) -{ + GRealThread *self = (GRealThread*) g_thread_self (); GArray *array; - GRealThread *self =(GRealThread*) thread; static guint next_index = 0; GStaticPrivateNode *node; - g_return_if_fail (thread); - array = self->private_data; if (!array) { @@ -444,32 +426,48 @@ g_static_private_set_for_thread (GStaticPrivate *private_key, void g_static_private_free (GStaticPrivate *private_key) { - GStaticPrivate copied_key; + guint index = private_key->index; GSList *list; - copied_key.index = private_key->index; - private_key->index = 0; - - if (!copied_key.index) + if (!index) return; + + private_key->index = 0; G_LOCK (g_thread); list = g_thread_all_threads; while (list) { - GThread *thread = list->data; + GRealThread *thread = list->data; + GArray *array = thread->private_data; list = list->next; - - G_UNLOCK (g_thread); - g_static_private_set_for_thread (&copied_key, thread, NULL, NULL); - G_LOCK (g_thread); + + if (array && index <= array->len) + { + GStaticPrivateNode *node = &g_array_index (array, + GStaticPrivateNode, + index - 1); + gpointer ddata = node->data; + GDestroyNotify ddestroy = node->destroy; + + node->data = NULL; + node->destroy = NULL; + + if (ddestroy) + { + G_UNLOCK (g_thread); + ddestroy (ddata); + G_LOCK (g_thread); + } + } } - g_thread_free_indeces = - g_slist_prepend (g_thread_free_indeces, - GUINT_TO_POINTER (copied_key.index)); + g_thread_free_indeces = g_slist_prepend (g_thread_free_indeces, + GUINT_TO_POINTER (index)); G_UNLOCK (g_thread); } +void g_main_context_destroy (GMainContext *context); + static void g_thread_cleanup (gpointer data) { @@ -490,6 +488,9 @@ g_thread_cleanup (gpointer data) } g_array_free (array, TRUE); } + if (thread->context) + g_main_context_destroy (thread->context); + /* We only free the thread structure, if it isn't joinable. If it is, the structure is freed in g_thread_join */ if (!thread->thread.joinable) @@ -559,6 +560,7 @@ g_thread_create (GThreadFunc thread_func, result->func = thread_func; result->arg = arg; result->private_data = NULL; + result->context = NULL; G_LOCK (g_thread); G_THREAD_UF (thread_create, (g_thread_create_proxy, result, stack_size, joinable, bound, priority, @@ -643,6 +645,7 @@ g_thread_self (void) thread->func = NULL; thread->arg = NULL; thread->private_data = NULL; + thread->context = NULL; if (g_thread_supported ()) G_THREAD_UF (thread_self, (&thread->system_thread)); diff --git a/gthread.h b/gthread.h index 098cfc4..2f147b4 100644 --- a/gthread.h +++ b/gthread.h @@ -229,12 +229,6 @@ gpointer g_static_private_get (GStaticPrivate *private_key); void g_static_private_set (GStaticPrivate *private_key, gpointer data, GDestroyNotify notify); -gpointer g_static_private_get_for_thread (GStaticPrivate *private_key, - GThread *thread); -void g_static_private_set_for_thread (GStaticPrivate *private_key, - GThread *thread, - gpointer data, - GDestroyNotify notify); void g_static_private_free (GStaticPrivate *private_key); typedef struct _GStaticRecMutex GStaticRecMutex; -- 2.7.4