|
|
|
@ -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_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; |
|
|
|
|
} |
|
|
|
|