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]

> +
> +#endif /* HAVE_PTHREADS */
> +
> +#endif /* !HAVE_MEMORYBARRIER && !HAVE_SYNC_SYNCHRONIZE && 
> !HAVE_MACHINE_RW_BARRIER */

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

Reply via email to