gslice: Use g_free_sized() instead of g_free()

If libc supports `free_sized()`, this could mean that freeing slices is
a bit more performant. If not, it falls back to using `free()`.

Signed-off-by: Philip Withnall <pwithnall@endlessos.org>
This commit is contained in:
Philip Withnall 2023-01-25 14:13:42 +00:00
parent 329843f682
commit 97ebd794a7

View File

@ -38,15 +38,15 @@
* *
* GSlice was a space-efficient and multi-processing scalable way to allocate * GSlice was a space-efficient and multi-processing scalable way to allocate
* equal sized pieces of memory. Since GLib 2.76, its implementation has been * equal sized pieces of memory. Since GLib 2.76, its implementation has been
* removed and it calls g_malloc() and g_free(), because the performance of the * removed and it calls g_malloc() and g_free_sized(), because the performance
* system-default allocators has improved on all platforms since GSlice was * of the system-default allocators has improved on all platforms since GSlice
* written. * was written.
* *
* The GSlice APIs have not been deprecated, as they are widely in use and doing * The GSlice APIs have not been deprecated, as they are widely in use and doing
* so would be very disruptive for little benefit. * so would be very disruptive for little benefit.
* *
* New code should be written using g_new()/g_malloc() and g_free(). There is no * New code should be written using g_new()/g_malloc() and g_free_sized() or
* particular benefit in porting existing code away from * g_free(). There is no particular benefit in porting existing code away from
* g_slice_new()/g_slice_free() unless its being rewritten anyway. * g_slice_new()/g_slice_free() unless its being rewritten anyway.
* *
* Here is an example for using the slice allocator: * Here is an example for using the slice allocator:
@ -322,7 +322,8 @@ g_slice_copy (gsize mem_size,
* *
* If @mem_block is %NULL, this function does nothing. * If @mem_block is %NULL, this function does nothing.
* *
* Since GLib 2.76 this always uses the system free() implementation internally. * Since GLib 2.76 this always uses the system free_sized() implementation
* internally.
* *
* Since: 2.10 * Since: 2.10
*/ */
@ -332,7 +333,7 @@ g_slice_free1 (gsize mem_size,
{ {
if (G_UNLIKELY (g_mem_gc_friendly)) if (G_UNLIKELY (g_mem_gc_friendly))
memset (mem_block, 0, mem_size); memset (mem_block, 0, mem_size);
g_free (mem_block); g_free_sized (mem_block, mem_size);
TRACE (GLIB_SLICE_FREE((void*)mem_block, mem_size)); TRACE (GLIB_SLICE_FREE((void*)mem_block, mem_size));
} }
@ -353,7 +354,8 @@ g_slice_free1 (gsize mem_size,
* *
* If @mem_chain is %NULL, this function does nothing. * If @mem_chain is %NULL, this function does nothing.
* *
* Since GLib 2.76 this always uses the system free() implementation internally. * Since GLib 2.76 this always uses the system free_sized() implementation
* internally.
* *
* Since: 2.10 * Since: 2.10
*/ */
@ -369,7 +371,7 @@ g_slice_free_chain_with_offset (gsize mem_size,
slice = *(gpointer *) (current + next_offset); slice = *(gpointer *) (current + next_offset);
if (G_UNLIKELY (g_mem_gc_friendly)) if (G_UNLIKELY (g_mem_gc_friendly))
memset (current, 0, mem_size); memset (current, 0, mem_size);
g_free (current); g_free_sized (current, mem_size);
} }
} }