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

Thomas Guillem thomas at gllm.fr
Tue Jun 20 12:04:47 CEST 2017


On Tue, Jun 20, 2017, at 11:53, remi at remlab.net wrote:
> Repeating myself but this patch does not change the fallback logic, so
> it can't break anything.
You're right, this patch doesn't change the fallback logic.

The ones that break windows are:
 "Win32: fix mismatched alloc/free"
 "Remove vlc_free()"
 "picture_pool: fix potentially invalid allocation size"

Can we add back vlc_memalign and vlc_free ?

> 
>  And to paraphrase other devs "I don't care" about non-ISO toolchains.> 
> Le 20 juin 2017 12:40:41 GMT+03:00, Steve Lhomme <robux4 at gmail.com>
> a écrit :>> On Tue, Jun 20, 2017 at 11:35 AM, Steve Lhomme
>> <robux4 at gmail.com> wrote:
>>>>>  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.
>>> 
>> 
>> 
>> For the record, calling free() instead of these aligned free
>> functions
>>>> results in a crash.
>> 
>> 
>> 
>>>  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
>>>> 
>> 
>> 
>> 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

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20170620/13696dd3/attachment.html>


More information about the vlc-devel mailing list