compat: replace aligned_alloc() rather than posix_memalign()
authorRémi Denis-Courmont <remi@remlab.net>
Sat, 17 Jun 2017 12:27:16 +0000 (15:27 +0300)
committerRémi Denis-Courmont <remi@remlab.net>
Sat, 17 Jun 2017 12:34:27 +0000 (15:34 +0300)
compat/aligned_alloc.c [new file with mode: 0644]
compat/posix_memalign.c [deleted file]
configure.ac
include/vlc_common.h
include/vlc_fixups.h

diff --git a/compat/aligned_alloc.c b/compat/aligned_alloc.c
new file mode 100644 (file)
index 0000000..9a61c00
--- /dev/null
@@ -0,0 +1,65 @@
+/*****************************************************************************
+ * aligned_alloc.c: C11 aligned_alloc() replacement
+ *****************************************************************************
+ * Copyright © 2012, 2017 Rémi Denis-Courmont
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <assert.h>
+#include <stdlib.h>
+#include <errno.h>
+#if !defined (HAVE_POSIX_MEMALIGN) && !defined (_WIN32) && !defined (__APPLE__)
+# include <malloc.h>
+#endif
+
+void *aligned_alloc(size_t align, size_t size)
+{
+    /* align must be a power of 2 */
+    /* size must be a multiple of align */
+    if ((align & (align - 1)) || (size & (align - 1)))
+    {
+        errno = EINVAL;
+        return NULL;
+    }
+
+#ifdef HAVE_POSIX_MEMALIGN
+    if (align < sizeof (void *)) /* POSIX does not allow small alignment */
+        align = sizeof (void *);
+
+    void *ptr;
+    int err = posix_memalign(&ptr, align, size);
+    if (err)
+    {
+        errno = err;
+        ptr = NULL;
+    }
+    return ptr;
+
+#elif !defined (_WIN32) && !defined (__APPLE__)
+
+   return memalign(align, size);
+
+#else
+
+   if (size > 0)
+       errno = ENOMEM;
+   return NULL;
+#endif
+}
diff --git a/compat/posix_memalign.c b/compat/posix_memalign.c
deleted file mode 100644 (file)
index 3c6ffdf..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-/*****************************************************************************
- * posix_memalign.c: POSIX posix_memalign() replacement
- *****************************************************************************
- * Copyright © 2012 Rémi Denis-Courmont
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2.1 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
- *****************************************************************************/
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <stdlib.h>
-#include <errno.h>
-
-static int check_align (size_t align)
-{
-    for (size_t i = sizeof (void *); i != 0; i *= 2)
-        if (align == i)
-            return 0;
-    return EINVAL;
-}
-
-#if !defined (_WIN32) && !defined (__APPLE__)
-#include <malloc.h>
-
-int posix_memalign (void **ptr, size_t align, size_t size)
-{
-    if (check_align (align))
-        return EINVAL;
-
-    int saved_errno = errno;
-    void *p = memalign (align, size);
-    if (p == NULL)
-    {
-        errno = saved_errno;
-        return ENOMEM;
-    }
-
-    *ptr = p;
-    return 0;
-}
-
-#else
-
-int posix_memalign (void **ptr, size_t align, size_t size)
-{
-    if (check_align (align))
-        return EINVAL;
-
-    *ptr = NULL;
-    return size ? ENOMEM : 0;
-}
-
-#endif
index b1883a1..67fc7de 100644 (file)
@@ -597,8 +597,8 @@ dnl Check for system libs needed
 need_libc=false
 
 dnl Check for usual libc functions
-AC_CHECK_FUNCS([daemon fcntl flock fstatvfs fork getenv getpwuid_r isatty lstat memalign mkostemp mmap open_memstream openat pread posix_fadvise posix_madvise setlocale stricmp strnicmp strptime tdestroy uselocale])
-AC_REPLACE_FUNCS([atof atoll dirfd fdopendir ffsll flockfile fsync getdelim getpid lldiv memrchr nrand48 poll posix_memalign recvmsg rewind sendmsg setenv strcasecmp strcasestr strdup strlcpy strndup strnlen strnstr strsep strtof strtok_r strtoll swab tfind timegm timespec_get strverscmp pathconf])
+AC_CHECK_FUNCS([daemon fcntl flock fstatvfs fork getenv getpwuid_r isatty lstat memalign mkostemp mmap open_memstream openat pread posix_fadvise posix_madvise posix_memalign setlocale stricmp strnicmp strptime tdestroy uselocale])
+AC_REPLACE_FUNCS([aligned_alloc atof atoll dirfd fdopendir ffsll flockfile fsync getdelim getpid lldiv memrchr nrand48 poll recvmsg rewind sendmsg setenv strcasecmp strcasestr strdup strlcpy strndup strnlen strnstr strsep strtof strtok_r strtoll swab tfind timegm timespec_get strverscmp pathconf])
 AC_REPLACE_FUNCS([gettimeofday])
 AC_CHECK_FUNC(fdatasync,,
   [AC_DEFINE(fdatasync, fsync, [Alias fdatasync() to fsync() if missing.])
index e1cf885..0bfb1b9 100644 (file)
@@ -854,13 +854,7 @@ VLC_API bool vlc_ureduce( unsigned *, unsigned *, uint64_t, uint64_t, uint64_t )
 # define vlc_memalign(align, size) (_aligned_malloc(size, align))
 # define vlc_free(base)            (_aligned_free(base))
 #else
-static inline void *vlc_memalign(size_t align, size_t size)
-{
-    void *base;
-    if (unlikely(posix_memalign(&base, align, size)))
-        base = NULL;
-    return base;
-}
+# define vlc_memalign(align, size) aligned_alloc(align, size)
 # define vlc_free(base) free(base)
 #endif
 
index 8bfb768..44b8426 100644 (file)
@@ -88,7 +88,7 @@ typedef struct
 # include <stdio.h> /* FILE */
 #endif
 
-#if !defined (HAVE_POSIX_MEMALIGN) || \
+#if !defined (HAVE_ALIGNED_ALLOC) || \
     !defined (HAVE_MEMRCHR) || \
     !defined (HAVE_STRLCPY) || \
     !defined (HAVE_STRNDUP) || \
@@ -302,8 +302,8 @@ int setenv (const char *, const char *, int);
 int unsetenv (const char *);
 #endif
 
-#ifndef HAVE_POSIX_MEMALIGN
-int posix_memalign (void **, size_t, size_t);
+#ifndef HAVE_ALIGNED_ALLOC
+void *aligned_alloc(size_t, size_t);
 #endif
 
 #if defined(__native_client__) && defined(__cplusplus)