[vlc-devel] [vlc-commits] compat: replace aligned_alloc() rather than posix_memalign()

Steve Lhomme robux4 at gmail.com
Tue Jun 20 11:07:38 CEST 2017


On Sat, Jun 17, 2017 at 2:35 PM, Rémi Denis-Courmont <git at videolan.org> wrote:
> vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sat Jun 17 15:27:16 2017 +0300| [34cd965645cb0246f3d74515bbd5e55367f7d884] | committer: Rémi Denis-Courmont
>
> compat: replace aligned_alloc() rather than posix_memalign()
>
>> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=34cd965645cb0246f3d74515bbd5e55367f7d884
> ---
>
>  compat/{posix_memalign.c => aligned_alloc.c} | 62 ++++++++++++++--------------
>  configure.ac                                 |  4 +-
>  include/vlc_common.h                         |  8 +---
>  include/vlc_fixups.h                         |  6 +--
>  4 files changed, 36 insertions(+), 44 deletions(-)
>
> diff --git a/compat/posix_memalign.c b/compat/aligned_alloc.c
> similarity index 55%
> rename from compat/posix_memalign.c
> rename to compat/aligned_alloc.c
> index 3c6ffdfe28..9a61c0010f 100644
> --- a/compat/posix_memalign.c
> +++ b/compat/aligned_alloc.c
> @@ -1,7 +1,7 @@
>  /*****************************************************************************
> - * posix_memalign.c: POSIX posix_memalign() replacement
> + * aligned_alloc.c: C11 aligned_alloc() replacement
>   *****************************************************************************
> - * Copyright © 2012 Rémi Denis-Courmont
> + * 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
> @@ -22,46 +22,44 @@
>  # 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
>
> -static int check_align (size_t align)
> +void *aligned_alloc(size_t align, size_t size)
>  {
> -    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>
> +    /* 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;
> +    }
>
> -int posix_memalign (void **ptr, size_t align, size_t size)
> -{
> -    if (check_align (align))
> -        return EINVAL;
> +#ifdef HAVE_POSIX_MEMALIGN
> +    if (align < sizeof (void *)) /* POSIX does not allow small alignment */
> +        align = sizeof (void *);
>
> -    int saved_errno = errno;
> -    void *p = memalign (align, size);
> -    if (p == NULL)
> +    void *ptr;
> +    int err = posix_memalign(&ptr, align, size);
> +    if (err)
>      {
> -        errno = saved_errno;
> -        return ENOMEM;
> +        errno = err;
> +        ptr = NULL;
>      }
> +    return ptr;
>
> -    *ptr = p;
> -    return 0;
> -}
> +#elif !defined (_WIN32) && !defined (__APPLE__)
>
> -#else
> -
> -int posix_memalign (void **ptr, size_t align, size_t size)
> -{
> -    if (check_align (align))
> -        return EINVAL;
> +   return memalign(align, size);

Is the goal that this code is never called for Windows and Apple OSes
? Because it worked and this function always return NULL.

> -    *ptr = NULL;
> -    return size ? ENOMEM : 0;
> -}
> +#else
>
> +   if (size > 0)
> +       errno = ENOMEM;
> +   return NULL;
>  #endif
> +}
> diff --git a/configure.ac b/configure.ac
> index b1883a18b7..67fc7deb1a 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -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.])
> diff --git a/include/vlc_common.h b/include/vlc_common.h
> index e1cf885379..0bfb1b9b04 100644
> --- a/include/vlc_common.h
> +++ b/include/vlc_common.h
> @@ -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
>
> diff --git a/include/vlc_fixups.h b/include/vlc_fixups.h
> index 8bfb76888f..44b8426f2c 100644
> --- a/include/vlc_fixups.h
> +++ b/include/vlc_fixups.h
> @@ -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)
>
> _______________________________________________
> vlc-commits mailing list
> vlc-commits at videolan.org
> https://mailman.videolan.org/listinfo/vlc-commits


More information about the vlc-devel mailing list