}
}
-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);
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)
*/
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);
/* 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().
*/
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)
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);
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);