From 6b72d5e8e18c526ac7df6014aad4e30541eeb0cb Mon Sep 17 00:00:00 2001 From: otto <> Date: Mon, 5 Nov 2018 08:23:40 +0000 Subject: Implement C11's aligned_alloc(3). ok guenther@ --- src/lib/libc/stdlib/malloc.c | 44 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) (limited to 'src/lib/libc/stdlib/malloc.c') diff --git a/src/lib/libc/stdlib/malloc.c b/src/lib/libc/stdlib/malloc.c index 81c30812a4..70e7f37dc8 100644 --- a/src/lib/libc/stdlib/malloc.c +++ b/src/lib/libc/stdlib/malloc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: malloc.c,v 1.249 2018/04/07 09:57:08 otto Exp $ */ +/* $OpenBSD: malloc.c,v 1.250 2018/11/05 08:23:40 otto Exp $ */ /* * Copyright (c) 2008, 2010, 2011, 2016 Otto Moerbeek * Copyright (c) 2012 Matthew Dempsky @@ -2058,6 +2058,48 @@ err: } /*DEF_STRONG(posix_memalign);*/ +void * +aligned_alloc(size_t alignment, size_t size) +{ + struct dir_info *d; + int saved_errno = errno; + void *r; + + /* Make sure that alignment is a positive power of 2. */ + if (((alignment - 1) & alignment) != 0 || alignment == 0) { + errno = EINVAL; + return NULL; + }; + /* Per spec, size should be a multiple of alignment */ + if ((size & (alignment - 1)) != 0) { + errno = EINVAL; + return NULL; + } + + d = getpool(); + if (d == NULL) { + _malloc_init(0); + d = getpool(); + } + _MALLOC_LOCK(d->mutex); + d->func = "aligned_alloc"; + if (d->active++) { + malloc_recurse(d); + return NULL; + } + r = omemalign(d, alignment, size, 0, CALLER); + d->active--; + _MALLOC_UNLOCK(d->mutex); + if (r == NULL) { + if (mopts.malloc_xmalloc) + wrterror(d, "out of memory"); + return NULL; + } + errno = saved_errno; + return r; +} +/*DEF_STRONG(aligned_alloc);*/ + #ifdef MALLOC_STATS struct malloc_leak { -- cgit v1.2.3-55-g6feb