On 2013-03-04 11:35:04 +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 | 120 > ++++++++++++++++++++++++++++++++++++++++++++++ > libavutil/atomic.h | 75 +++++++++++++++++++++++++++++ > libavutil/atomic_gcc.h | 48 +++++++++++++++++++ > libavutil/atomic_suncc.h | 51 ++++++++++++++++++++ > libavutil/atomic_win32.h | 50 +++++++++++++++++++ > 7 files changed, 353 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..9a94e61 > --- /dev/null > +++ b/libavutil/atomic.c > @@ -0,0 +1,120 @@ > +/* > + * 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; > +} > + > +#else > +// assume there is no threading at all, noop implementations of everything
why assume if we can test with HAVE_THREADS and error out if threading is enabled but no atomics available otherwise ok Janne _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
