diff --git a/glib/gthread-posix.c b/glib/gthread-posix.c index 4e103e803..ebeb966d7 100644 --- a/glib/gthread-posix.c +++ b/glib/gthread-posix.c @@ -1069,6 +1069,18 @@ g_private_replace (GPrivate *key, #define posix_check_cmd(cmd) posix_check_err (cmd, #cmd) +GRealThread * +g_system_thread_new (void) +{ + return g_slice_new0 (GRealThread); +} + +void +g_system_thread_free (GRealThread *thread) +{ + g_slice_free (GRealThread, thread); +} + void g_system_thread_create (GThreadFunc thread_func, gpointer arg, diff --git a/glib/gthread-win32.c b/glib/gthread-win32.c index fb6ad7c83..8d19739fb 100644 --- a/glib/gthread-win32.c +++ b/glib/gthread-win32.c @@ -463,6 +463,18 @@ struct _GThreadData gboolean joinable; }; +GRealThread * +g_system_thread_new (void) +{ + return g_slice_new0 (GRealThread); +} + +void +g_system_thread_free (GRealThread *thread) +{ + g_slice_free (GRealThread, thread); +} + void g_system_thread_exit (void) { diff --git a/glib/gthread.c b/glib/gthread.c index 18db89f11..a9fe4b647 100644 --- a/glib/gthread.c +++ b/glib/gthread.c @@ -677,7 +677,7 @@ g_thread_cleanup (gpointer data) * If it is, the structure is freed in g_thread_join() */ if (!thread->thread.joinable) - g_free (thread); + g_system_thread_free (thread); } } @@ -804,7 +804,7 @@ g_thread_new_internal (const gchar *name, g_return_val_if_fail (func != NULL, NULL); - result = g_new0 (GRealThread, 1); + result = g_system_thread_new (); result->thread.joinable = joinable; result->thread.func = func; @@ -818,7 +818,7 @@ g_thread_new_internal (const gchar *name, if (local_error) { g_propagate_error (error, local_error); - g_free (result); + g_system_thread_free (result); return NULL; } @@ -894,7 +894,7 @@ g_thread_join (GThread *thread) * thread end. We free the memory here. This will leave a loose end, * if a joinable thread is not joined. */ - g_free (thread); + g_system_thread_free (real); return retval; } diff --git a/glib/gthreadprivate.h b/glib/gthreadprivate.h index 5ade4a3fa..6109060da 100644 --- a/glib/gthreadprivate.h +++ b/glib/gthreadprivate.h @@ -32,12 +32,17 @@ G_BEGIN_DECLS typedef struct _GRealThread GRealThread; G_GNUC_INTERNAL void g_system_thread_join (gpointer thread); + +G_GNUC_INTERNAL +GRealThread * g_system_thread_new (void); G_GNUC_INTERNAL void g_system_thread_create (GThreadFunc func, gpointer data, gulong stack_size, gboolean joinable, gpointer thread, GError **error); +G_GNUC_INTERNAL +void g_system_thread_free (GRealThread *thread); G_GNUC_INTERNAL void g_system_thread_exit (void); G_GNUC_INTERNAL void g_system_thread_set_name (const gchar *name);