mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-02-05 02:36:19 +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
|
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)
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user