[vlc-devel] [PATCH 2/7] core: utils: add vlc_qsort

Thomas Guillem thomas at gllm.fr
Tue Jan 22 10:34:07 CET 2019


On Mon, Jan 21, 2019, at 18:09, Hugo Beauzée-Luyssen wrote:
> On Mon, Jan 21, 2019, at 5:43 PM, Thomas Guillem wrote:
> > Following the upcoming POSIX prototype.
> > ---
> >  include/vlc_utils.h | 36 ++++++++++++++++++++++++++++
> >  src/Makefile.am     |  2 ++
> >  src/libvlccore.sym  |  1 +
> >  src/misc/utils.c    | 58 +++++++++++++++++++++++++++++++++++++++++++++
> >  4 files changed, 97 insertions(+)
> >  create mode 100644 include/vlc_utils.h
> >  create mode 100644 src/misc/utils.c
> > 
> > diff --git a/include/vlc_utils.h b/include/vlc_utils.h
> > new file mode 100644
> > index 0000000000..46a331a1aa
> > --- /dev/null
> > +++ b/include/vlc_utils.h
> > @@ -0,0 +1,36 @@
> > +/******************************************************************************
> > + * vlc_utils.h
> > + ******************************************************************************
> > + * Copyright © 2019 VLC authors and VideoLAN
> > + *
> > + * 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
> > + * the Free Software Foundation; either version 2.1 of the License, or
> > + * (at your option) any later version.
> > + *
> > + * This program is distributed in the hope that it will be useful,
> > + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> > + * GNU Lesser General Public License for more details.
> > + *
> > + * You should have received a copy of the GNU Lesser General Public License
> > + * along with this program; if not, write to the Free Software Foundation,
> > + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
> > + *****************************************************************************/
> > +
> > +#ifndef VLC_UTILS_H
> > +#define VLC_UTILS_H
> > +
> > +#include <stdlib.h>
> > +#include <stddef.h>
> > +
> > +/**
> > + * Sort an array with reentrancy, following the upcoming POSIX prototype
> > + *
> > + * cf. POSIX qsort_r
> > + */
> > +VLC_API void vlc_qsort(void *base, size_t nmemb, size_t size,
> > +                       int (*compar)(const void *, const void *, void *),
> > +                       void *arg);
> > +
> > +#endif
> > diff --git a/src/Makefile.am b/src/Makefile.am
> > index aec931cdd4..a98f5fdac1 100644
> > --- a/src/Makefile.am
> > +++ b/src/Makefile.am
> > @@ -100,6 +100,7 @@ pluginsinclude_HEADERS = \
> >  	../include/vlc_thumbnailer.h \
> >  	../include/vlc_tls.h \
> >  	../include/vlc_url.h \
> > +	../include/vlc_utils.h \
> >  	../include/vlc_variables.h \
> >  	../include/vlc_vector.h \
> >  	../include/vlc_viewpoint.h \
> > @@ -388,6 +389,7 @@ libvlccore_la_SOURCES = \
> >  	misc/text_style.c \
> >  	misc/subpicture.c \
> >  	misc/subpicture.h \
> > +	misc/utils.c \
> >  	misc/medialibrary.c
> >  libvlccore_la_LIBADD = $(LIBS_libvlccore) \
> >  	../compat/libcompat.la \
> > diff --git a/src/libvlccore.sym b/src/libvlccore.sym
> > index a7bf98ecc1..629b3ec9eb 100644
> > --- a/src/libvlccore.sym
> > +++ b/src/libvlccore.sym
> > @@ -671,6 +671,7 @@ vlc_rand_bytes
> >  vlc_drand48
> >  vlc_lrand48
> >  vlc_mrand48
> > +vlc_qsort
> >  vlc_restorecancel
> >  vlc_rwlock_destroy
> >  vlc_rwlock_init
> > diff --git a/src/misc/utils.c b/src/misc/utils.c
> > new file mode 100644
> > index 0000000000..3d5d9f357f
> > --- /dev/null
> > +++ b/src/misc/utils.c
> > @@ -0,0 +1,58 @@
> > +/******************************************************************************
> > + * utils.c: compat utils back-end
> > + ******************************************************************************
> > + * Copyright © 2019 VLC authors and VideoLAN
> > + * Copyright © 2018 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
> > + * the Free Software Foundation; either version 2.1 of the License, or
> > + * (at your option) any later version.
> > + *
> > + * This program is distributed in the hope that it will be useful,
> > + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> > + * GNU Lesser General Public License for more details.
> > + *
> > + * You should have received a copy of the GNU Lesser General Public License
> > + * along with this program; if not, write to the Free Software Foundation,
> > + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
> > + *****************************************************************************/
> > +
> > +#ifdef HAVE_CONFIG_H
> > +# include <config.h>
> > +#endif
> > +
> > +#include <vlc_common.h>
> > +#include <vlc_utils.h>
> > +
> > +static _Thread_local struct
> 
> Any reason not to use "thread_local" ?

No, no idea, just copied the code from Rémi compat code.

> 
> > +{
> > +    int (*compar)(const void *, const void *, void *);
> > +    void *arg;
> > +} state;
> > +
> > +static int compar_wrapper(const void *a, const void *b)
> > +{
> > +    return state.compar(a, b, state.arg);
> > +}
> > +
> > +/* Follow the upcoming POSIX prototype, coming from GNU/libc.
> > + * Note that this differs from the BSD prototype. */
> > +
> > +VLC_WEAK void vlc_qsort(void *base, size_t nmemb, size_t size,
> > +                        int (*compar)(const void *, const void *, void *),
> > +                        void *arg)
> 
> Any particular reason to use VLC_WEAK instead of the usual per-platform 
> implementation?

It's more future proof for me. We could add more utility functions to misc/utils.c. Some of these functions could be implemented differently depending of the OS or not. With VLC_WEAK, we don't have to play with conditions in the Makefile.am, this seems more convenient.

As you want, I don't have strong opinions about wether we should use VLC_WEAK in that case.

> 
> > +{
> > +    int (*saved_compar)(const void *, const void *, void *) = state.compar;
> > +    void *saved_arg = state.arg;
> > +
> > +    state.compar = compar;
> > +    state.arg = arg;
> > +
> > +    qsort(base, nmemb, size, compar_wrapper);
> > +
> > +    /* Restore state for nested reentrant calls */
> > +    state.compar = saved_compar;
> > +    state.arg = saved_arg;
> > +}
> > -- 
> > 2.20.1
> > 
> > _______________________________________________
> > vlc-devel mailing list
> > To unsubscribe or modify your subscription options:
> > https://mailman.videolan.org/listinfo/vlc-devel
> 
> 
> -- 
>   Hugo Beauzée-Luyssen
>   hugo at beauzee.fr
> _______________________________________________
> 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