Merge branch 'ebassi/object-allocator' into 'main'

Use the system allocator on UNIX when creating GTypeInstances

See merge request GNOME/glib!2799
This commit is contained in:
Philip Withnall 2022-10-15 20:20:26 +00:00
commit 9daa0b60c0

View File

@ -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)