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

remi at remlab.net remi at remlab.net
Tue Jun 20 12:14:35 CEST 2017


It has everything to do with the toolchain. The toolchain provides the hosted ISO C library.

Le 20 juin 2017 13:05:49 GMT+03:00, Steve Lhomme <robux4 at gmail.com> a écrit :
>On Tue, Jun 20, 2017 at 11:53 AM,  <remi at remlab.net> wrote:
>> Repeating myself but this patch does not change the fallback logic,
>so it
>> can't break anything.
>>
>> And to paraphrase other devs "I don't care" about non-ISO toolchains.
>
>The fact on Windows the aligned malloc needs to be freed with an
>aligned version of free() has nothing to do with the toolchain.
>
>>
>> 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
>_______________________________________________
>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é.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20170620/db8a5db9/attachment.html>


More information about the vlc-devel mailing list