[vlc-devel] [vlc-commits] compat: replace aligned_alloc() rather than posix_memalign()
remi at remlab.net
remi at remlab.net
Tue Jun 20 11:53:28 CEST 2017
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.
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é.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20170620/f72ab28a/attachment.html>
More information about the vlc-devel
mailing list