[vlc-devel] [vlc-commits] compat: replace aligned_alloc() rather than posix_memalign()
Steve Lhomme
robux4 at gmail.com
Tue Jun 20 11:40:41 CEST 2017
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
More information about the vlc-devel
mailing list