mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-01-26 14:06:15 +01:00
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:
parent
1368533dc2
commit
f788a2e5e1
@ -332,18 +332,10 @@ g_thread_foreach (GFunc thread_func,
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
void
|
||||
g_enumerable_thread_remove (GRealThread *thread)
|
||||
static void
|
||||
g_enumerable_thread_remove (gpointer data)
|
||||
{
|
||||
GRealThread *thread = data;
|
||||
GRealThread *t, *p;
|
||||
|
||||
G_LOCK (g_thread);
|
||||
@ -361,6 +353,19 @@ g_enumerable_thread_remove (GRealThread *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 ------------------------------------------------------------- */
|
||||
gboolean
|
||||
g_once_init_enter_impl (volatile gsize *location)
|
||||
|
@ -678,9 +678,6 @@ g_thread_cleanup (gpointer data)
|
||||
*/
|
||||
if (!thread->thread.joinable)
|
||||
{
|
||||
if (thread->enumerable)
|
||||
g_enumerable_thread_remove (thread);
|
||||
|
||||
/* Just to make sure, this isn't used any more */
|
||||
g_system_thread_assign (thread->system_thread, zero_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 */
|
||||
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,
|
||||
* 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,
|
||||
stack_size, joinable,
|
||||
&result->system_thread, &local_error);
|
||||
if (enumerable && !local_error)
|
||||
g_enumerable_thread_add (result);
|
||||
G_UNLOCK (g_thread_new);
|
||||
|
||||
if (local_error)
|
||||
@ -899,9 +897,6 @@ g_thread_join (GThread *thread)
|
||||
|
||||
retval = real->retval;
|
||||
|
||||
if (real->enumerable)
|
||||
g_enumerable_thread_remove (real);
|
||||
|
||||
/* Just to make sure, this isn't used any more */
|
||||
thread->joinable = 0;
|
||||
g_system_thread_assign (real->system_thread, zero_thread);
|
||||
|
@ -75,7 +75,6 @@ G_GNUC_INTERNAL extern GSystemThread zero_thread;
|
||||
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_remove (GRealThread *thread);
|
||||
|
||||
/* initializers that may also use g_private_new() */
|
||||
G_GNUC_INTERNAL void _g_messages_thread_init_nomessage (void);
|
||||
|
Loading…
Reference in New Issue
Block a user