Merge commit '65f1d45dcc71186ede72fff950996099d23359bd'
authorMichael Niedermayer <michaelni@gmx.at>
Fri, 8 Mar 2013 14:47:06 +0000 (15:47 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Fri, 8 Mar 2013 14:48:27 +0000 (15:48 +0100)
* commit '65f1d45dcc71186ede72fff950996099d23359bd':
  lavu: add support for atomic operations.

Conflicts:
configure

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
configure
libavutil/Makefile
libavutil/atomic.c
libavutil/atomic.h
libavutil/atomic_gcc.h
libavutil/atomic_suncc.h
libavutil/atomic_win32.h
tests/fate/libavutil.mak

diff --cc configure
+++ b/configure
@@@ -1434,10 -1283,9 +1434,11 @@@ HAVE_LIST=
      local_aligned_8
      localtime_r
      loongson
 +    lzo1x_999_compress
      machine_ioctl_bt848_h
      machine_ioctl_meteor_h
+     machine_rw_barrier
 +    makeinfo
      malloc_h
      MapViewOfFile
      memalign
@@@ -3791,7 -3453,12 +3794,10 @@@ check_func  ${malloc_prefix}posix_memal
  check_func_headers malloc.h _aligned_malloc     && enable aligned_malloc
  check_func  setrlimit
  check_func  strerror_r
 -check_func  strptime
 -check_func  strtok_r
  check_func  sched_getaffinity
+ check_builtin sync_synchronize "" "__sync_synchronize()"
+ check_builtin machine_rw_barrier mbarrier.h "__machine_rw_barrier()"
+ check_builtin MemoryBarrier windows.h "MemoryBarrier()"
  check_func  sysconf
  check_func  sysctl
  check_func  usleep
Simple merge
index 0000000,8fa2532..55abbab
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,123 +1,123 @@@
 - * This file is part of Libav.
+ /*
+  * Copyright (c) 2012 Ronald S. Bultje <rsbultje@gmail.com>
+  *
 - * Libav is free software; you can redistribute it and/or
++ * This file is part of FFmpeg.
+  *
 - * Libav is distributed in the hope that it will be useful,
++ * FFmpeg 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.
+  *
 - * License along with Libav; if not, write to the Free Software
++ * FFmpeg 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 FFmpeg; 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"
+ #endif /* HAVE_PTHREADS */
+ #endif /* !HAVE_MEMORYBARRIER && !HAVE_SYNC_SYNCHRONIZE && !HAVE_MACHINE_RW_BARRIER */
+ #ifdef TEST
+ #include <assert.h>
+ int main(void)
+ {
+     volatile int val = 1;
+     int res;
+     res = avpriv_atomic_int_add_and_fetch(&val, 1);
+     assert(res == 2);
+     avpriv_atomic_int_set(&val, 3);
+     res = avpriv_atomic_int_get(&val);
+     assert(res == 3);
+     return 0;
+ }
+ #endif
index 0000000,dad93bd..14d334f
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,74 +1,74 @@@
 - * This file is part of Libav.
+ /*
+  * Copyright (c) 2012 Ronald S. Bultje <rsbultje@gmail.com>
+  *
 - * Libav is free software; you can redistribute it and/or
++ * This file is part of FFmpeg.
+  *
 - * Libav is distributed in the hope that it will be useful,
++ * FFmpeg 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.
+  *
 - * License along with Libav; if not, write to the Free Software
++ * FFmpeg 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 FFmpeg; if not, write to the Free Software
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ #ifndef AVUTIL_ATOMIC_H
+ #define AVUTIL_ATOMIC_H
+ #include "config.h"
+ #if HAVE_MEMORYBARRIER
+ #include "atomic_win32.h"
+ #elif HAVE_SYNC_SYNCHRONIZE
+ #include "atomic_gcc.h"
+ #elif HAVE_MACHINE_RW_BARRIER
+ #include "atomic_suncc.h"
+ #else
+ /**
+  * Load the current value stored in an atomic integer.
+  *
+  * @param ptr atomic integer
+  * @return the current value of the atomic integer
+  * @note This acts as a memory barrier.
+  */
+ int avpriv_atomic_int_get(volatile int *ptr);
+ /**
+  * Store a new value in an atomic integer.
+  *
+  * @param ptr atomic integer
+  * @param val the value to store in the atomic integer
+  * @note This acts as a memory barrier.
+  */
+ void avpriv_atomic_int_set(volatile int *ptr, int val);
+ /**
+  * Add a value to an atomic integer.
+  *
+  * @param ptr atomic integer
+  * @param inc the value to add to the atomic integer (may be negative)
+  * @return the new value of the atomic integer.
+  * @note This does NOT act as a memory barrier. This is primarily
+  *       intended for reference counting.
+  */
+ int avpriv_atomic_int_add_and_fetch(volatile int *ptr, int inc);
+ /**
+  * Atomic pointer compare and swap.
+  *
+  * @param ptr pointer to the pointer to operate on
+  * @param oldval do the swap if the current value of *ptr equals to oldval
+  * @param newval value to replace *ptr with
+  * @return the value of *ptr before comparison
+  */
+ void *avpriv_atomic_ptr_cas(void * volatile *ptr, void *oldval, void *newval);
+ #endif /* HAVE_MEMORYBARRIER */
+ #endif /* AVUTIL_ATOMIC_H */
index 0000000,e2f3fe1..57c20bb
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,48 +1,48 @@@
 - * This file is part of Libav.
+ /*
+  * Copyright (c) 2012 Ronald S. Bultje <rsbultje@gmail.com>
+  *
 - * Libav is free software; you can redistribute it and/or
++ * This file is part of FFmpeg.
+  *
 - * Libav is distributed in the hope that it will be useful,
++ * FFmpeg 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.
+  *
 - * License along with Libav; if not, write to the Free Software
++ * FFmpeg 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 FFmpeg; if not, write to the Free Software
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ #include "atomic.h"
+ #define avpriv_atomic_int_get atomic_int_get_gcc
+ static inline int atomic_int_get_gcc(volatile int *ptr)
+ {
+     __sync_synchronize();
+     return *ptr;
+ }
+ #define avpriv_atomic_int_set atomic_int_set_gcc
+ static inline void atomic_int_set_gcc(volatile int *ptr, int val)
+ {
+     *ptr = val;
+     __sync_synchronize();
+ }
+ #define avpriv_atomic_int_add_and_fetch atomic_int_add_and_fetch_gcc
+ static inline int atomic_int_add_and_fetch_gcc(volatile int *ptr, int inc)
+ {
+     return __sync_add_and_fetch(ptr, inc);
+ }
+ #define avpriv_atomic_ptr_cas atomic_ptr_cas_gcc
+ static inline void *atomic_ptr_cas_gcc(void * volatile *ptr,
+                                        void *oldval, void *newval)
+ {
+     return __sync_val_compare_and_swap(ptr, oldval, newval);
+ }
index 0000000,85373f5..69cce41
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,51 +1,51 @@@
 - * This file is part of Libav.
+ /*
+  *
 - * Libav is free software; you can redistribute it and/or
++ * This file is part of FFmpeg.
+  *
 - * Libav is distributed in the hope that it will be useful,
++ * FFmpeg 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.
+  *
 - * License along with Libav; if not, write to the Free Software
++ * FFmpeg 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 FFmpeg; if not, write to the Free Software
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ #include <atomic.h>
+ #include <mbarrier.h>
+ #include "atomic.h"
+ #define avpriv_atomic_int_get atomic_int_get_suncc
+ static inline int atomic_int_get_suncc(volatile int *ptr)
+ {
+     __machine_rw_barrier();
+     return *ptr;
+ }
+ #define avpriv_atomic_int_set atomic_int_set_suncc
+ static inline void atomic_int_set_suncc(volatile int *ptr, int val)
+ {
+     *ptr = val;
+     __machine_rw_barrier();
+ }
+ #define avpriv_atomic_int_add_and_fetch atomic_int_add_and_fetch_suncc
+ static inline int atomic_int_add_and_fetch_suncc(volatile int *ptr, int inc)
+ {
+     return atomic_add_int_nv(ptr, inc);
+ }
+ #define avpriv_atomic_ptr_cas atomic_ptr_cas_suncc
+ static inline void *atomic_ptr_cas_suncc(void * volatile *ptr,
+                                          void *oldval, void *newval)
+ {
+     return atomic_cas_ptr(ptr, oldval, newval);
+ }
index 0000000,6ae61f6..cf49c55
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,50 +1,50 @@@
 - * This file is part of Libav.
+ /*
+  * Copyright (c) 2012 Ronald S. Bultje <rsbultje@gmail.com>
+  *
 - * Libav is free software; you can redistribute it and/or
++ * This file is part of FFmpeg.
+  *
 - * Libav is distributed in the hope that it will be useful,
++ * FFmpeg 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.
+  *
 - * License along with Libav; if not, write to the Free Software
++ * FFmpeg 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 FFmpeg; if not, write to the Free Software
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ #include <windows.h>
+ #include "atomic.h"
+ #define avpriv_atomic_int_get atomic_int_get_win32
+ static inline int atomic_int_get_win32(volatile int *ptr)
+ {
+     MemoryBarrier();
+     return *ptr;
+ }
+ #define avpriv_atomic_int_set atomic_int_set_win32
+ static inline void atomic_int_set_win32(volatile int *ptr, int val)
+ {
+     *ptr = val;
+     MemoryBarrier();
+ }
+ #define avpriv_atomic_int_add_and_fetch atomic_int_add_and_fetch_win32
+ static inline int atomic_int_add_and_fetch_win32(volatile int *ptr, int inc)
+ {
+     return inc + InterlockedExchangeAdd(ptr, inc);
+ }
+ #define avpriv_atomic_ptr_cas atomic_ptr_cas_win32
+ static inline void *atomic_ptr_cas_win32(void * volatile *ptr,
+                                          void *oldval, void *newval)
+ {
+     return InterlockedCompareExchangePointer(ptr, newval, oldval);
+ }
Simple merge