mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-01-13 21:28:01 +02:00
Merge commit '27079a426c9d3db918b158976e44b9b143d78e1c'
* commit '27079a426c9d3db918b158976e44b9b143d78e1c': buffer: convert to stdatomic Merged-by: Clément Bœsch <u@pkh.me>
This commit is contained in:
commit
443e969293
@ -16,10 +16,10 @@
|
|||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <stdatomic.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "atomic.h"
|
|
||||||
#include "buffer_internal.h"
|
#include "buffer_internal.h"
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "mem.h"
|
#include "mem.h"
|
||||||
@ -40,7 +40,8 @@ AVBufferRef *av_buffer_create(uint8_t *data, int size,
|
|||||||
buf->size = size;
|
buf->size = size;
|
||||||
buf->free = free ? free : av_buffer_default_free;
|
buf->free = free ? free : av_buffer_default_free;
|
||||||
buf->opaque = opaque;
|
buf->opaque = opaque;
|
||||||
buf->refcount = 1;
|
|
||||||
|
atomic_init(&buf->refcount, 1);
|
||||||
|
|
||||||
if (flags & AV_BUFFER_FLAG_READONLY)
|
if (flags & AV_BUFFER_FLAG_READONLY)
|
||||||
buf->flags |= BUFFER_FLAG_READONLY;
|
buf->flags |= BUFFER_FLAG_READONLY;
|
||||||
@ -98,7 +99,7 @@ AVBufferRef *av_buffer_ref(AVBufferRef *buf)
|
|||||||
|
|
||||||
*ret = *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;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -115,7 +116,7 @@ static void buffer_replace(AVBufferRef **dst, AVBufferRef **src)
|
|||||||
} else
|
} else
|
||||||
av_freep(dst);
|
av_freep(dst);
|
||||||
|
|
||||||
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);
|
b->free(b->opaque, b->data);
|
||||||
av_freep(&b);
|
av_freep(&b);
|
||||||
}
|
}
|
||||||
@ -134,7 +135,7 @@ int av_buffer_is_writable(const AVBufferRef *buf)
|
|||||||
if (buf->buffer->flags & AV_BUFFER_FLAG_READONLY)
|
if (buf->buffer->flags & AV_BUFFER_FLAG_READONLY)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return avpriv_atomic_int_get(&buf->buffer->refcount) == 1;
|
return atomic_load(&buf->buffer->refcount) == 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *av_buffer_get_opaque(const AVBufferRef *buf)
|
void *av_buffer_get_opaque(const AVBufferRef *buf)
|
||||||
@ -144,7 +145,7 @@ void *av_buffer_get_opaque(const AVBufferRef *buf)
|
|||||||
|
|
||||||
int av_buffer_get_ref_count(const AVBufferRef *buf)
|
int av_buffer_get_ref_count(const AVBufferRef *buf)
|
||||||
{
|
{
|
||||||
return buf->buffer->refcount;
|
return atomic_load(&buf->buffer->refcount);
|
||||||
}
|
}
|
||||||
|
|
||||||
int av_buffer_make_writable(AVBufferRef **pbuf)
|
int av_buffer_make_writable(AVBufferRef **pbuf)
|
||||||
@ -229,7 +230,7 @@ AVBufferPool *av_buffer_pool_init2(int size, void *opaque,
|
|||||||
pool->alloc2 = alloc;
|
pool->alloc2 = alloc;
|
||||||
pool->pool_free = pool_free;
|
pool->pool_free = pool_free;
|
||||||
|
|
||||||
avpriv_atomic_int_set(&pool->refcount, 1);
|
atomic_init(&pool->refcount, 1);
|
||||||
|
|
||||||
return pool;
|
return pool;
|
||||||
}
|
}
|
||||||
@ -245,7 +246,7 @@ AVBufferPool *av_buffer_pool_init(int size, AVBufferRef* (*alloc)(int size))
|
|||||||
pool->size = size;
|
pool->size = size;
|
||||||
pool->alloc = alloc ? alloc : av_buffer_alloc;
|
pool->alloc = alloc ? alloc : av_buffer_alloc;
|
||||||
|
|
||||||
avpriv_atomic_int_set(&pool->refcount, 1);
|
atomic_init(&pool->refcount, 1);
|
||||||
|
|
||||||
return pool;
|
return pool;
|
||||||
}
|
}
|
||||||
@ -280,7 +281,7 @@ void av_buffer_pool_uninit(AVBufferPool **ppool)
|
|||||||
pool = *ppool;
|
pool = *ppool;
|
||||||
*ppool = NULL;
|
*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);
|
buffer_pool_free(pool);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -297,7 +298,7 @@ static void pool_release_buffer(void *opaque, uint8_t *data)
|
|||||||
pool->pool = buf;
|
pool->pool = buf;
|
||||||
ff_mutex_unlock(&pool->mutex);
|
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);
|
buffer_pool_free(pool);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -350,7 +351,7 @@ AVBufferRef *av_buffer_pool_get(AVBufferPool *pool)
|
|||||||
ff_mutex_unlock(&pool->mutex);
|
ff_mutex_unlock(&pool->mutex);
|
||||||
|
|
||||||
if (ret)
|
if (ret)
|
||||||
avpriv_atomic_int_add_and_fetch(&pool->refcount, 1);
|
atomic_fetch_add_explicit(&pool->refcount, 1, memory_order_relaxed);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#ifndef AVUTIL_BUFFER_INTERNAL_H
|
#ifndef AVUTIL_BUFFER_INTERNAL_H
|
||||||
#define AVUTIL_BUFFER_INTERNAL_H
|
#define AVUTIL_BUFFER_INTERNAL_H
|
||||||
|
|
||||||
|
#include <stdatomic.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#include "buffer.h"
|
#include "buffer.h"
|
||||||
@ -40,7 +41,7 @@ struct AVBuffer {
|
|||||||
/**
|
/**
|
||||||
* number of existing AVBufferRef instances referring to this buffer
|
* number of existing AVBufferRef instances referring to this buffer
|
||||||
*/
|
*/
|
||||||
volatile int refcount;
|
atomic_uint refcount;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* a callback for freeing the data
|
* 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
|
* buffers have been released, then it's safe to free the pool and all
|
||||||
* the buffers in it.
|
* the buffers in it.
|
||||||
*/
|
*/
|
||||||
volatile int refcount;
|
atomic_uint refcount;
|
||||||
|
|
||||||
int size;
|
int size;
|
||||||
void *opaque;
|
void *opaque;
|
||||||
|
Loading…
Reference in New Issue
Block a user