On Mon, 4 Mar 2013 15:55:50 +0100, Janne Grunau <[email protected]> wrote:
> On 2013-03-04 15:10:46 +0100, Anton Khirnov wrote:
> > From: "Ronald S. Bultje" <[email protected]>
> > 
> > These could be used for reference counting, or for keeping track of
> > decoding progress in references in multithreaded decoders.
> > 
> > Support is provided by gcc/msvc/suncc intrinsics, with a fallback using
> > pthread mutexes.
> > 
> > Signed-off-by: Anton Khirnov <[email protected]>
> > ---
> >  configure                |    7 +++
> >  libavutil/Makefile       |    2 +
> >  libavutil/atomic.c       |  123 
> > ++++++++++++++++++++++++++++++++++++++++++++++
> >  libavutil/atomic.h       |   74 ++++++++++++++++++++++++++++
> >  libavutil/atomic_gcc.h   |   48 ++++++++++++++++++
> >  libavutil/atomic_suncc.h |   51 +++++++++++++++++++
> >  libavutil/atomic_win32.h |   50 +++++++++++++++++++
> >  tests/fate/libavutil.mak |    5 ++
> >  8 files changed, 360 insertions(+)
> >  create mode 100644 libavutil/atomic.c
> >  create mode 100644 libavutil/atomic.h
> >  create mode 100644 libavutil/atomic_gcc.h
> >  create mode 100644 libavutil/atomic_suncc.h
> >  create mode 100644 libavutil/atomic_win32.h
> > 
> > diff --git a/configure b/configure
> > index 1aae93b..2bd5aae 100755
> > --- a/configure
> > +++ b/configure
> > @@ -1271,9 +1271,11 @@ HAVE_LIST="
> >      loongson
> >      machine_ioctl_bt848_h
> >      machine_ioctl_meteor_h
> > +    machine_rw_barrier
> >      malloc_h
> >      MapViewOfFile
> >      memalign
> > +    MemoryBarrier
> >      mkstemp
> >      mm_empty
> >      mmap
> > @@ -1308,6 +1310,7 @@ HAVE_LIST="
> >      struct_v4l2_frmivalenum_discrete
> >      symver_asm_label
> >      symver_gnu_asm
> > +    sync_synchronize
> >      sysconf
> >      sysctl
> >      sys_mman_h
> > @@ -3440,6 +3443,10 @@ check_func  strerror_r
> >  check_func  strptime
> >  check_func  strtok_r
> >  check_func  sched_getaffinity
> > +# cannot use check_func, because those are builtins
> > +check_code  ld "" "__sync_synchronize()" && enable sync_synchronize
> > +check_code  ld mbarrier.h "__machine_rw_barrier()" && enable 
> > machine_rw_barrier
> > +check_code  ld windows.h "MemoryBarrier()" && enable MemoryBarrier
> >  check_func  sysconf
> >  check_func  sysctl
> >  check_func  usleep
> > diff --git a/libavutil/Makefile b/libavutil/Makefile
> > index 465b2fc..4406b13 100644
> > --- a/libavutil/Makefile
> > +++ b/libavutil/Makefile
> > @@ -54,6 +54,7 @@ BUILT_HEADERS = avconfig.h
> >  
> >  OBJS = adler32.o                                                        \
> >         aes.o                                                            \
> > +       atomic.o                                                         \
> >         audio_fifo.o                                                     \
> >         avstring.o                                                       \
> >         base64.o                                                         \
> > @@ -100,6 +101,7 @@ SKIPHEADERS          = old_pix_fmts.h
> >  
> >  TESTPROGS = adler32                                                     \
> >              aes                                                         \
> > +            atomic                                                      \
> >              avstring                                                    \
> >              base64                                                      \
> >              blowfish                                                    \
> > diff --git a/libavutil/atomic.c b/libavutil/atomic.c
> > new file mode 100644
> > index 0000000..8fa2532
> > --- /dev/null
> > +++ b/libavutil/atomic.c
> > @@ -0,0 +1,123 @@
> > +/*
> > + * Copyright (c) 2012 Ronald S. Bultje <[email protected]>
> > + *
> > + * This file is part of Libav.
> > + *
> > + * Libav 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.
> > + *
> > + * Libav 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 Libav; if not, write to the Free Software
> > + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 
> > 02110-1301 USA
> > + */
> > +
> > +#include "atomic.h"
> > +
> > +#if !HAVE_MEMORYBARRIER && !HAVE_SYNC_SYNCHRONIZE && 
> > !HAVE_MACHINE_RW_BARRIER
> > +
> > +#if HAVE_PTHREADS
> > +
> > +#include <pthread.h>
> > +
> > +static pthread_mutex_t atomic_lock = PTHREAD_MUTEX_INITIALIZER;
> > +
> > +int avpriv_atomic_int_get(volatile int *ptr)
> > +{
> > +    int res;
> > +
> > +    pthread_mutex_lock(&atomic_lock);
> > +    res = *ptr;
> > +    pthread_mutex_unlock(&atomic_lock);
> > +
> > +    return res;
> > +}
> > +
> > +void avpriv_atomic_int_set(volatile int *ptr, int val)
> > +{
> > +    pthread_mutex_lock(&atomic_lock);
> > +    *ptr = val;
> > +    pthread_mutex_unlock(&atomic_lock);
> > +}
> > +
> > +int avpriv_atomic_int_add_and_fetch(volatile int *ptr, int inc)
> > +{
> > +    int res;
> > +
> > +    pthread_mutex_lock(&atomic_lock);
> > +    *ptr += inc;
> > +    res = *ptr;
> > +    pthread_mutex_unlock(&atomic_lock);
> > +
> > +    return res;
> > +}
> > +
> > +void *avpriv_atomic_ptr_cas(void * volatile *ptr, void *oldval, void 
> > *newval)
> > +{
> > +    void *ret;
> > +    pthread_mutex_lock(&atomic_lock);
> > +    ret = *ptr;
> > +    if (*ptr == oldval)
> > +        *ptr = newval;
> > +    pthread_mutex_unlock(&atomic_lock);
> > +    return ret;
> > +}
> > +
> > +#elif !HAVE_THREADS
> > +
> > +int avpriv_atomic_int_get(volatile int *ptr)
> > +{
> > +    return *ptr;
> > +}
> > +
> > +void avpriv_atomic_int_set(volatile int *ptr, int val)
> > +{
> > +    *ptr = val;
> > +}
> > +
> > +int avpriv_atomic_int_add_and_fetch(volatile int *ptr, int inc)
> > +{
> > +    *ptr += inc;
> > +    return *ptr;
> > +}
> > +
> > +void *avpriv_atomic_ptr_cas(void * volatile *ptr, void *oldval, void 
> > *newval)
> > +{
> > +    if (*ptr == oldval) {
> > +        *ptr = newval;
> > +        return oldval;
> > +    }
> > +    return *ptr;
> > +}
> > +
> > +#else
> > +
> > +#error "Threading is enabled, but there is no implementation of atomic 
> > operations available"
> 
> the message is wrong. only pthreads is disabled at this point.
> 
> #elif HAVE_THREADS
> 
> #error "Threading is enabled, but there is no implementation of atomic 
> operations available"
> 
> #else
> 
> [the removed dummy implemtation]

Eh? That's what my patch already does.

-- 
Anton Khirnov
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to