gboolean joinable,
GError **error)
{
- return g_thread_new_full (NULL, func, data, joinable, 0, error);
+ return g_thread_new_internal (NULL, func, data, joinable, 0, TRUE, error);
}
/**
GThreadPriority priority,
GError **error)
{
- return g_thread_new_full (NULL, func, data, joinable, stack_size, error);
+ return g_thread_new_internal (NULL, func, data, joinable, stack_size, TRUE, error);
}
/* GStaticMutex {{{1 ------------------------------------------------------ */
GArray *private_data;
GRealThread *next;
const gchar *name;
+ gboolean enumerable;
gpointer retval;
GSystemThread system_thread;
};
*/
if (!thread->thread.joinable)
{
- GRealThread *t, *p;
-
- G_LOCK (g_thread);
- for (t = g_thread_all_threads, p = NULL; t; p = t, t = t->next)
+ if (thread->enumerable)
{
- if (t == thread)
+ GRealThread *t, *p;
+
+ G_LOCK (g_thread);
+ for (t = g_thread_all_threads, p = NULL; t; p = t, t = t->next)
{
- if (p)
- p->next = t->next;
- else
- g_thread_all_threads = t->next;
- break;
+ if (t == thread)
+ {
+ if (p)
+ p->next = t->next;
+ else
+ g_thread_all_threads = t->next;
+ break;
+ }
}
+ G_UNLOCK (g_thread);
}
- G_UNLOCK (g_thread);
/* Just to make sure, this isn't used any more */
g_system_thread_assign (thread->system_thread, zero_thread);
g_free (thread);
gboolean joinable,
GError **error)
{
- return g_thread_new_full (name, func, data, joinable, 0, error);
+ return g_thread_new_internal (name, func, data, joinable, 0, FALSE, error);
}
/**
gsize stack_size,
GError **error)
{
- GRealThread* result;
+ return g_thread_new_internal (name, func, data, joinable, stack_size, FALSE, error);
+}
+
+GThread *
+g_thread_new_internal (const gchar *name,
+ GThreadFunc func,
+ gpointer data,
+ gboolean joinable,
+ gsize stack_size,
+ gboolean enumerable,
+ GError **error)
+{
+ GRealThread *result;
GError *local_error = NULL;
g_return_val_if_fail (func, NULL);
result->thread.func = func;
result->thread.data = data;
result->private_data = NULL;
+ result->enumerable = enumerable;
result->name = name;
G_LOCK (g_thread);
g_system_thread_create (g_thread_create_proxy, result,
stack_size, joinable,
&result->system_thread, &local_error);
- if (!local_error)
+ if (enumerable && !local_error)
{
result->next = g_thread_all_threads;
g_thread_all_threads = result;
* Returns: the return value of the thread
*/
gpointer
-g_thread_join (GThread* thread)
+g_thread_join (GThread *thread)
{
- GRealThread* real = (GRealThread*) thread;
+ GRealThread *real = (GRealThread*) thread;
GRealThread *p, *t;
gpointer retval;
retval = real->retval;
- G_LOCK (g_thread);
- for (t = g_thread_all_threads, p = NULL; t; p = t, t = t->next)
+ if (real->enumerable)
{
- if (t == (GRealThread*) thread)
+ G_LOCK (g_thread);
+ for (t = g_thread_all_threads, p = NULL; t; p = t, t = t->next)
{
- if (p)
- p->next = t->next;
- else
- g_thread_all_threads = t->next;
- break;
+ if (t == real)
+ {
+ if (p)
+ p->next = t->next;
+ else
+ g_thread_all_threads = t->next;
+ break;
+ }
}
+ G_UNLOCK (g_thread);
}
- G_UNLOCK (g_thread);
/* Just to make sure, this isn't used any more */
thread->joinable = 0;
g_system_thread_assign (real->system_thread, zero_thread);
thread->thread.func = NULL;
thread->thread.data = NULL;
thread->private_data = NULL;
+ thread->enumerable = FALSE;
g_system_thread_self (&thread->system_thread);
g_private_set (&g_thread_specific_private, thread);
-
- G_LOCK (g_thread);
- thread->next = g_thread_all_threads;
- g_thread_all_threads = thread;
- G_UNLOCK (g_thread);
}
return (GThread*)thread;