X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?p=xscreensaver;a=blobdiff_plain;f=utils%2Faligned_malloc.c;fp=utils%2Faligned_malloc.c;h=4db92a41813bc3a969daa5ea31e6909deded1876;hp=0000000000000000000000000000000000000000;hb=8afc01a67be4fbf3f1cc0fce9adf01b5289a21c6;hpb=3f1091236d800c43a3124c44c7da54e53f205b13 diff --git a/utils/aligned_malloc.c b/utils/aligned_malloc.c new file mode 100644 index 00000000..4db92a41 --- /dev/null +++ b/utils/aligned_malloc.c @@ -0,0 +1,47 @@ +/* -*- mode: c; tab-width: 4; fill-column: 128 -*- */ +/* vi: set ts=4 tw=128: */ + +/* +aligned_malloc.c, Copyright (c) 2014 Dave Odell + +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 +#include + +#if !(_POSIX_VERSION >= 200112L || _XOPEN_VERSION >= 600) + +#include +#include + +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) +{ + free(((void **)(ptr))[-1]); +} + +#endif