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
