thread: use GPrivate for enumerable threads

Use a GPrivate to track the destruction of enumerable threads and remove
them from the list.
This commit is contained in:
Ryan Lortie 2011-10-12 16:26:39 -04:00
parent 1368533dc2
commit f788a2e5e1
3 changed files with 19 additions and 20 deletions

View File

@ -332,18 +332,10 @@ g_thread_foreach (GFunc thread_func,
} }
} }
void static void
g_enumerable_thread_add (GRealThread *thread) g_enumerable_thread_remove (gpointer data)
{
G_LOCK (g_thread);
thread->next = g_thread_all_threads;
g_thread_all_threads = thread;
G_UNLOCK (g_thread);
}
void
g_enumerable_thread_remove (GRealThread *thread)
{ {
GRealThread *thread = data;
GRealThread *t, *p; GRealThread *t, *p;
G_LOCK (g_thread); G_LOCK (g_thread);
@ -361,6 +353,19 @@ g_enumerable_thread_remove (GRealThread *thread)
G_UNLOCK (g_thread); G_UNLOCK (g_thread);
} }
GPrivate enumerable_thread_private = G_PRIVATE_INIT (g_enumerable_thread_remove);
void
g_enumerable_thread_add (GRealThread *thread)
{
G_LOCK (g_thread);
thread->next = g_thread_all_threads;
g_thread_all_threads = thread;
G_UNLOCK (g_thread);
g_private_set (&enumerable_thread_private, thread);
}
/* GOnce {{{1 ------------------------------------------------------------- */ /* GOnce {{{1 ------------------------------------------------------------- */
gboolean gboolean
g_once_init_enter_impl (volatile gsize *location) g_once_init_enter_impl (volatile gsize *location)

View File

@ -678,9 +678,6 @@ g_thread_cleanup (gpointer data)
*/ */
if (!thread->thread.joinable) if (!thread->thread.joinable)
{ {
if (thread->enumerable)
g_enumerable_thread_remove (thread);
/* Just to make sure, this isn't used any more */ /* Just to make sure, this isn't used any more */
g_system_thread_assign (thread->system_thread, zero_thread); g_system_thread_assign (thread->system_thread, zero_thread);
g_free (thread); g_free (thread);
@ -701,6 +698,9 @@ g_thread_create_proxy (gpointer data)
/* This has to happen before G_LOCK, as that might call g_thread_self */ /* This has to happen before G_LOCK, as that might call g_thread_self */
g_private_set (&g_thread_specific_private, data); g_private_set (&g_thread_specific_private, data);
if (thread->enumerable)
g_enumerable_thread_add (thread);
/* The lock makes sure that thread->system_thread is written, /* The lock makes sure that thread->system_thread is written,
* before thread->thread.func is called. See g_thread_new_internal(). * before thread->thread.func is called. See g_thread_new_internal().
*/ */
@ -822,8 +822,6 @@ g_thread_new_internal (const gchar *name,
g_system_thread_create (g_thread_create_proxy, result, g_system_thread_create (g_thread_create_proxy, result,
stack_size, joinable, stack_size, joinable,
&result->system_thread, &local_error); &result->system_thread, &local_error);
if (enumerable && !local_error)
g_enumerable_thread_add (result);
G_UNLOCK (g_thread_new); G_UNLOCK (g_thread_new);
if (local_error) if (local_error)
@ -899,9 +897,6 @@ g_thread_join (GThread *thread)
retval = real->retval; retval = real->retval;
if (real->enumerable)
g_enumerable_thread_remove (real);
/* Just to make sure, this isn't used any more */ /* Just to make sure, this isn't used any more */
thread->joinable = 0; thread->joinable = 0;
g_system_thread_assign (real->system_thread, zero_thread); g_system_thread_assign (real->system_thread, zero_thread);

View File

@ -75,7 +75,6 @@ G_GNUC_INTERNAL extern GSystemThread zero_thread;
G_GNUC_INTERNAL extern GMutex g_once_mutex; G_GNUC_INTERNAL extern GMutex g_once_mutex;
G_GNUC_INTERNAL void g_enumerable_thread_add (GRealThread *thread); G_GNUC_INTERNAL void g_enumerable_thread_add (GRealThread *thread);
G_GNUC_INTERNAL void g_enumerable_thread_remove (GRealThread *thread);
/* initializers that may also use g_private_new() */ /* initializers that may also use g_private_new() */
G_GNUC_INTERNAL void _g_messages_thread_init_nomessage (void); G_GNUC_INTERNAL void _g_messages_thread_init_nomessage (void);