diff options
author | Simon Rettberg | 2018-10-16 10:08:48 +0200 |
---|---|---|
committer | Simon Rettberg | 2018-10-16 10:08:48 +0200 |
commit | d3a98cf6cbc3bd0b9efc570f58e8812c03931c18 (patch) | |
tree | cbddf8e50f35a9c6e878a5bfe3c6d625d99e12ba /utils/aligned_malloc.c | |
download | xscreensaver-d3a98cf6cbc3bd0b9efc570f58e8812c03931c18.tar.gz xscreensaver-d3a98cf6cbc3bd0b9efc570f58e8812c03931c18.tar.xz xscreensaver-d3a98cf6cbc3bd0b9efc570f58e8812c03931c18.zip |
Original 5.40
Diffstat (limited to 'utils/aligned_malloc.c')
-rw-r--r-- | utils/aligned_malloc.c | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/utils/aligned_malloc.c b/utils/aligned_malloc.c new file mode 100644 index 0000000..b345ad1 --- /dev/null +++ b/utils/aligned_malloc.c @@ -0,0 +1,48 @@ +/* -*- mode: c; tab-width: 4; fill-column: 128 -*- */ +/* vi: set ts=4 tw=128: */ + +/* +aligned_malloc.c, Copyright (c) 2014 Dave Odell <dmo2118@gmail.com> + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. No representations are made about the suitability of this +software for any purpose. It is provided "as is" without express or +implied warranty. +*/ + +#include "aligned_malloc.h" + +#include <stddef.h> +#include <stdlib.h> + +#include <assert.h> +#include <errno.h> + +/* aligned_alloc() (C11) or posix_memalign() (POSIX) are other possibilities + for aligned_malloc(). + */ + +int aligned_malloc(void **ptr, unsigned alignment, size_t size) +{ + void *block_start; + ptrdiff_t align1 = alignment - 1; + + assert(alignment && !(alignment & (alignment - 1))); /* alignment must be a power of two. */ + + size += sizeof(void *) + align1; + block_start = malloc(size); + if(!block_start) + return ENOMEM; + *ptr = (void *)(((ptrdiff_t)block_start + sizeof(void *) + align1) & ~align1); + ((void **)(*ptr))[-1] = block_start; + return 0; +} + +void aligned_free(void *ptr) +{ + if(ptr) + free(((void **)(ptr))[-1]); +} |