aboutsummaryrefslogtreecommitdiffstats
path: root/extras/mini-os/lib/xmalloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'extras/mini-os/lib/xmalloc.c')
-rw-r--r--extras/mini-os/lib/xmalloc.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/extras/mini-os/lib/xmalloc.c b/extras/mini-os/lib/xmalloc.c
index 9e59c9f834..d4c3941738 100644
--- a/extras/mini-os/lib/xmalloc.c
+++ b/extras/mini-os/lib/xmalloc.c
@@ -62,10 +62,19 @@ struct xmalloc_pad
size_t hdr_size;
};
+/* Return size, increased to alignment with align. */
+static inline size_t align_up(size_t size, size_t align)
+{
+ return (size + align - 1) & ~(align - 1);
+}
+
static void maybe_split(struct xmalloc_hdr *hdr, size_t size, size_t block)
{
struct xmalloc_hdr *extra;
- size_t leftover = block - size;
+ size_t leftover;
+ size = align_up(size, __alignof__(struct xmalloc_hdr));
+ size = align_up(size, __alignof__(struct xmalloc_pad));
+ leftover = block - size;
/* If enough is left to make a block, put it on free list. */
if ( leftover >= (2 * (sizeof(struct xmalloc_hdr) + sizeof(struct xmalloc_pad))) )
@@ -100,12 +109,6 @@ static struct xmalloc_hdr *xmalloc_new_page(size_t size)
return hdr;
}
-/* Return size, increased to alignment with align. */
-static inline size_t align_up(size_t size, size_t align)
-{
- return (size + align - 1) & ~(align - 1);
-}
-
/* Big object? Just use the page allocator. */
static void *xmalloc_whole_pages(size_t size, size_t align)
{