summaryrefslogtreecommitdiff
path: root/libavutil
diff options
context:
space:
mode:
authorJames Almer <jamrial@gmail.com>2021-02-20 10:21:47 -0300
committerJames Almer <jamrial@gmail.com>2021-02-24 10:45:30 -0300
commit45a29029761297535296ddf66bcdeca3086a468d (patch)
treee25bfc7a13a6fcab3e54a126772201a3c3ff5941 /libavutil
parentb913a4e18d3278017fcaaecd90a1c53e916b4479 (diff)
downloadffmpeg-45a29029761297535296ddf66bcdeca3086a468d.tar.gz
avutil/buffer: free all pooled buffers immediately after uninitializing the pool
No buffer will be fetched from the pool after it's uninitialized, so there's no benefit from waiting until every single buffer has been returned to it before freeing them all. This should free some memory in certain scenarios, which can be beneficial in low memory systems. Based on a patch by Jonas Karlman. Reviewed-by: Anton Khirnov <anton@khirnov.net> Signed-off-by: James Almer <jamrial@gmail.com>
Diffstat (limited to 'libavutil')
-rw-r--r--libavutil/buffer.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/libavutil/buffer.c b/libavutil/buffer.c
index d67b4bbdaf..3204f11b68 100644
--- a/libavutil/buffer.c
+++ b/libavutil/buffer.c
@@ -279,11 +279,7 @@ AVBufferPool *av_buffer_pool_init(int size, AVBufferRef* (*alloc)(int size))
return pool;
}
-/*
- * This function gets called when the pool has been uninited and
- * all the buffers returned to it.
- */
-static void buffer_pool_free(AVBufferPool *pool)
+static void buffer_pool_flush(AVBufferPool *pool)
{
while (pool->pool) {
BufferPoolEntry *buf = pool->pool;
@@ -292,6 +288,15 @@ static void buffer_pool_free(AVBufferPool *pool)
buf->free(buf->opaque, buf->data);
av_freep(&buf);
}
+}
+
+/*
+ * This function gets called when the pool has been uninited and
+ * all the buffers returned to it.
+ */
+static void buffer_pool_free(AVBufferPool *pool)
+{
+ buffer_pool_flush(pool);
ff_mutex_destroy(&pool->mutex);
if (pool->pool_free)
@@ -309,6 +314,10 @@ void av_buffer_pool_uninit(AVBufferPool **ppool)
pool = *ppool;
*ppool = NULL;
+ ff_mutex_lock(&pool->mutex);
+ buffer_pool_flush(pool);
+ ff_mutex_unlock(&pool->mutex);
+
if (atomic_fetch_sub_explicit(&pool->refcount, 1, memory_order_acq_rel) == 1)
buffer_pool_free(pool);
}