From 67fe0450be4776fe16da0bc0dc416cf32b75d85c Mon Sep 17 00:00:00 2001 From: Marko Kreen Date: Tue, 2 Mar 2010 16:43:40 +0200 Subject: [PATCH] base: compat posix_memalign() --- m4/usual.m4 | 2 ++ usual/base.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++ usual/base.h | 5 +++++ 3 files changed, 60 insertions(+) create mode 100644 usual/base.c diff --git a/m4/usual.m4 b/m4/usual.m4 index ce03f14..8f15364 100644 --- a/m4/usual.m4 +++ b/m4/usual.m4 @@ -114,6 +114,7 @@ AC_CHECK_HEADERS([arpa/inet.h netinet/in.h netinet/tcp.h]) AC_CHECK_HEADERS([sys/param.h sys/uio.h libgen.h pwd.h grp.h]) AC_CHECK_HEADERS([sys/wait.h sys/mman.h syslog.h netdb.h dlfcn.h]) AC_CHECK_HEADERS([err.h pthread.h endian.h sys/endian.h byteswap.h]) +AC_CHECK_HEADERS([malloc.h]) dnl ucred.h may have prereqs AC_CHECK_HEADERS([ucred.h sys/ucred.h], [], [], [ #ifdef HAVE_SYS_TYPES_H @@ -133,6 +134,7 @@ AC_DEFUN([AC_USUAL_FUNCTION_CHECK], [ AC_CHECK_FUNCS(basename strlcpy strlcat getpeereid sigaction) AC_CHECK_FUNCS(inet_ntop poll getline) AC_CHECK_FUNCS(err errx warn warnx getprogname setprogname) +AC_CHECK_FUNCS(posix_memalign memalign valloc) ### Functions provided only on win32 AC_CHECK_FUNCS(localtime_r recvmsg sendmsg) ### Functions used by libusual itself diff --git a/usual/base.c b/usual/base.c new file mode 100644 index 0000000..ed45156 --- /dev/null +++ b/usual/base.c @@ -0,0 +1,53 @@ +/* + * Basic C environment. + * + * Copyright (c) 2007-2009 Marko Kreen + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include + +#ifdef HAVE_MALLOC_H +#include +#endif + +#ifndef HAVE_POSIX_MEMALIGN +int posix_memalign(void **ptr_p, size_t align, size_t len) +{ + void *p; + int ret, old_errno = errno; + +#ifdef HAVE_MEMALIGN + p = memalign(align, len); +#else /* !HAVE_MEMALIGN */ +#ifdef HAVE_VALLOC + /* assuming less than pagesize alignment */ + p = valloc(len); +#else /* !VALLOC */ + #warning "cannot emulate posix_memalign sanely" + p = malloc(len); +#endif /* !VALLOC */ +#endif /* !MEMALIGN */ + + *ptr_p = p; + if (p) + return 0; + + /* on error restore old errno */ + ret = errno; + errno = old_errno; + return ret; +} +#endif + diff --git a/usual/base.h b/usual/base.h index 27bc542..590786e 100644 --- a/usual/base.h +++ b/usual/base.h @@ -126,6 +126,11 @@ static inline void *zmalloc(size_t len) return calloc(1, len); } +#ifndef HAVE_POSIX_MEMALIGN +#define posix_memalign(a,b,c) usual_memalign(a,b,c) +int posix_memalign(void **ptr_p, size_t align, size_t len); +#endif + /* cpp expr -> string */ #define _STR_(identifier) #identifier #define STR(x) _STR_(x) -- 2.39.5