From 3b7af4dd5da919b29bf77c47251c12edf5ed07d1 Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Wed, 6 Jul 2022 20:43:45 +0100 Subject: [PATCH] gtype: Use the system allocator on UNIX Instead of replacing the slice allocator wholesale, we can start phasing it out by having GTypeInstance use the system allocator on operating systems where we can assume good performance profiles. We cannot commit to fully gutting GSlice in the cases where we might still need it, like the G(S)List allocator and small, similarly-sized data structures. The main user of GSlice is still GTypeInstance/GObject, and those have moved out of the sweet spot of GSlice's performance envelove over the years, with larger instance sizes and private data. See: #1079 --- gobject/gtype.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/gobject/gtype.c b/gobject/gtype.c index 40953843d..66db7bc9d 100644 --- a/gobject/gtype.c +++ b/gobject/gtype.c @@ -1824,6 +1824,18 @@ type_iface_blow_holder_info_Wm (TypeNode *iface, } } +/* We use the system allocator on UNIX-y systems, where we know we have + * access to a decent allocator. On other systems, we fall back to the + * slice allocator, as we know its performance profile + */ +#ifdef G_OS_UNIX +# define instance_alloc(s) g_malloc0 ((s)) +# define instance_free(s,p) g_free ((p)) +#else +# define instance_alloc(s) g_slice_alloc0 ((s)) +# define instance_free(s,p) g_slice_free1 ((s),(p)) +#endif + /** * g_type_create_instance: (skip) * @type: an instantiatable type to create an instance for @@ -1900,7 +1912,7 @@ g_type_create_instance (GType type) private_size += ALIGN_STRUCT (1); /* Allocate one extra pointer size... */ - allocated = g_slice_alloc0 (private_size + ivar_size + sizeof (gpointer)); + allocated = instance_alloc (private_size + ivar_size + sizeof (gpointer)); /* ... and point it back to the start of the private data. */ *(gpointer *) (allocated + private_size + ivar_size) = allocated + ALIGN_STRUCT (1); @@ -1910,7 +1922,7 @@ g_type_create_instance (GType type) } else #endif - allocated = g_slice_alloc0 (private_size + ivar_size); + allocated = instance_alloc (private_size + ivar_size); instance = (GTypeInstance *) (allocated + private_size); @@ -2000,14 +2012,14 @@ g_type_free_instance (GTypeInstance *instance) /* Clear out the extra pointer... */ *(gpointer *) (allocated + private_size + ivar_size) = NULL; /* ... and ensure we include it in the size we free. */ - g_slice_free1 (private_size + ivar_size + sizeof (gpointer), allocated); + instance_free (private_size + ivar_size + sizeof (gpointer), allocated); VALGRIND_FREELIKE_BLOCK (allocated + ALIGN_STRUCT (1), 0); VALGRIND_FREELIKE_BLOCK (instance, 0); } else #endif - g_slice_free1 (private_size + ivar_size, allocated); + instance_free (private_size + ivar_size, allocated); #ifdef G_ENABLE_DEBUG IF_DEBUG (INSTANCE_COUNT)