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

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


On Tue, Jun 20, 2017 at 11:28 AM,  <remi at remlab.net> wrote:
> The goal is to use aligned_alloc() instead of posix_memalign() since the
> earlier is required by ISO C and C++ (and slightly simpler to use).
>
> This patch only changes the behaviour on supported non-POSIX toolchains by
> removing the need for POSIX emulation code. If the toolchain is broken, then
> the fallback logic is unchanged: posix_memalign(), else memalign() else
> screw-you.

There is no posix_memalign() or memalign() on Windows. So right now
VLC and libvlc cannot be used at all.

Proper support requires using __mingw_aligned_malloc() or
_aligned_malloc(). But that means using __mingw_aligned_free() and
_aligned_free() as well.

Next time you may break the core, please submit patches for review first.

> Le 20 juin 2017 12:07:38 GMT+03:00, Steve Lhomme <robux4 at gmail.com> a écrit
> :
>>
>> 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
>>
>> ________________________________
>>
>> vlc-devel mailing list
>> To unsubscribe or modify your subscription options:
>> https://mailman.videolan.org/listinfo/vlc-devel
>
>
> --
> Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez excuser ma
> brièveté.
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel


More information about the vlc-devel mailing list