From 27079a426c9d3db918b158976e44b9b143d78e1c Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Sun, 17 Jul 2016 22:24:35 +0200 Subject: [PATCH] buffer: convert to stdatomic --- libavutil/buffer.c | 21 +++++++++++---------- libavutil/buffer_internal.h | 5 +++-- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/libavutil/buffer.c b/libavutil/buffer.c index 49a1f2d395..0e2b4ef1b4 100644 --- a/libavutil/buffer.c +++ b/libavutil/buffer.c @@ -16,10 +16,10 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include #include #include -#include "atomic.h" #include "buffer_internal.h" #include "common.h" #include "mem.h" @@ -40,7 +40,8 @@ AVBufferRef *av_buffer_create(uint8_t *data, int size, buf->size = size; buf->free = free ? free : av_buffer_default_free; buf->opaque = opaque; - buf->refcount = 1; + + atomic_init(&buf->refcount, 1); if (flags & AV_BUFFER_FLAG_READONLY) buf->flags |= BUFFER_FLAG_READONLY; @@ -98,7 +99,7 @@ AVBufferRef *av_buffer_ref(AVBufferRef *buf) *ret = *buf; - avpriv_atomic_int_add_and_fetch(&buf->buffer->refcount, 1); + atomic_fetch_add_explicit(&buf->buffer->refcount, 1, memory_order_relaxed); return ret; } @@ -112,7 +113,7 @@ void av_buffer_unref(AVBufferRef **buf) b = (*buf)->buffer; av_freep(buf); - if (!avpriv_atomic_int_add_and_fetch(&b->refcount, -1)) { + if (atomic_fetch_add_explicit(&b->refcount, -1, memory_order_acq_rel) == 1) { b->free(b->opaque, b->data); av_freep(&b); } @@ -123,7 +124,7 @@ int av_buffer_is_writable(const AVBufferRef *buf) if (buf->buffer->flags & AV_BUFFER_FLAG_READONLY) return 0; - return avpriv_atomic_int_add_and_fetch(&buf->buffer->refcount, 0) == 1; + return atomic_load(&buf->buffer->refcount) == 1; } int av_buffer_make_writable(AVBufferRef **pbuf) @@ -209,7 +210,7 @@ AVBufferPool *av_buffer_pool_init2(int size, void *opaque, pool->alloc2 = alloc; pool->pool_free = pool_free; - avpriv_atomic_int_set(&pool->refcount, 1); + atomic_init(&pool->refcount, 1); return pool; } @@ -225,7 +226,7 @@ AVBufferPool *av_buffer_pool_init(int size, AVBufferRef* (*alloc)(int size)) pool->size = size; pool->alloc = alloc ? alloc : av_buffer_alloc; - avpriv_atomic_int_set(&pool->refcount, 1); + atomic_init(&pool->refcount, 1); return pool; } @@ -260,7 +261,7 @@ void av_buffer_pool_uninit(AVBufferPool **ppool) pool = *ppool; *ppool = NULL; - if (!avpriv_atomic_int_add_and_fetch(&pool->refcount, -1)) + if (atomic_fetch_add_explicit(&pool->refcount, -1, memory_order_acq_rel) == 1) buffer_pool_free(pool); } @@ -274,7 +275,7 @@ static void pool_release_buffer(void *opaque, uint8_t *data) pool->pool = buf; ff_mutex_unlock(&pool->mutex); - if (!avpriv_atomic_int_add_and_fetch(&pool->refcount, -1)) + if (atomic_fetch_add_explicit(&pool->refcount, -1, memory_order_acq_rel) == 1) buffer_pool_free(pool); } @@ -327,7 +328,7 @@ AVBufferRef *av_buffer_pool_get(AVBufferPool *pool) ff_mutex_unlock(&pool->mutex); if (ret) - avpriv_atomic_int_add_and_fetch(&pool->refcount, 1); + atomic_fetch_add_explicit(&pool->refcount, 1, memory_order_relaxed); return ret; } diff --git a/libavutil/buffer_internal.h b/libavutil/buffer_internal.h index 64344d8262..90d68aacac 100644 --- a/libavutil/buffer_internal.h +++ b/libavutil/buffer_internal.h @@ -19,6 +19,7 @@ #ifndef AVUTIL_BUFFER_INTERNAL_H #define AVUTIL_BUFFER_INTERNAL_H +#include #include #include "buffer.h" @@ -40,7 +41,7 @@ struct AVBuffer { /** * number of existing AVBufferRef instances referring to this buffer */ - volatile int refcount; + atomic_uint refcount; /** * a callback for freeing the data @@ -85,7 +86,7 @@ struct AVBufferPool { * buffers have been released, then it's safe to free the pool and all * the buffers in it. */ - volatile int refcount; + atomic_uint refcount; int size; void *opaque;