summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2016-07-17 22:24:35 +0200
committerAnton Khirnov <anton@khirnov.net>2016-07-25 13:56:47 +0200
commit610991572511f75a7da7c5231015892f9592cc7d (patch)
treeac899e36b69419b570e24a858dbfb5ee79a64169
parent9193d69ce51fd22af4e71c0446df5c8ec13de444 (diff)
buffer: convert to stdatomic
-rw-r--r--libavutil/buffer.c21
-rw-r--r--libavutil/buffer_internal.h5
2 files changed, 14 insertions, 12 deletions
diff --git a/libavutil/buffer.c b/libavutil/buffer.c
index 6681002345..0e274f37dc 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 <stdatomic.h>
#include <stdint.h>
#include <string.h>
-#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_store(&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_store(&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_store(&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..627e7e51c2 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 <stdatomic.h>
#include <stdint.h>
#include "buffer.h"
@@ -40,7 +41,7 @@ struct AVBuffer {
/**
* number of existing AVBufferRef instances referring to this buffer
*/
- volatile int refcount;
+ atomic_int 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_int refcount;
int size;
void *opaque;