From patchwork Sat Feb 20 13:21:47 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 25838 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 892B8448F74 for ; Sat, 20 Feb 2021 15:22:53 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 657A468A3B7; Sat, 20 Feb 2021 15:22:53 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qv1-f50.google.com (mail-qv1-f50.google.com [209.85.219.50]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1E1B9689E47 for ; Sat, 20 Feb 2021 15:22:46 +0200 (EET) Received: by mail-qv1-f50.google.com with SMTP id q9so128593qvo.8 for ; Sat, 20 Feb 2021 05:22:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=m7ZBH9sRcf9QUtwO81y0pOEe9JEkBFmn4a83c73wX24=; b=QRRG9nt/VIwXJEfueW/xOsPDJOSoNdYgNWZIrODRirzwBhdCoQWB9alOdE7wThOv7f c+7mDvsP4v8IuK21ZUBsffWUfED/h4KtbPiiFovxU5jBa6VZTMtNpG1xgrYwK6rkYGoI yg7yno/D8z3ONqaxtFI7C1jtVZ0AlIhYJa3UYI55g2NmM1VpeFTWta2JhbOTHOL/CIXF oKZYZs3pRwKuxUWT3vxE4BoLOcVc1HlmEJlqMHPkbRwk4OFaRgM+a7aQ1nyiFgUpb9Up hXiggpGcvi2lNXbE+cEFty0j+xDnxAqI7kdkP0xs85KDKfBmbQ43n1iyVlZbi07YigX0 PrMg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=m7ZBH9sRcf9QUtwO81y0pOEe9JEkBFmn4a83c73wX24=; b=HUmSrPiyajvXjpTMvbh3iutb7vyDaPXqb7z+JOSw4doqL8Ogtsh447sv/73+gGD3qv nJ0GEoZ5HYLwnmJ/O4jhDqgUEEr0kMxwAx16jRxWRDcuvIBmqFcbmqoVF2Fm1m3N+OT1 IYyrW4RU8PZl+QSAF2gG56amXea2lFSoHtiyuLhIt2ZMCPPx1gZhEbqC8QrfVFGfEBT7 ow+BWGO1fKP3R9goFoRnsJfOUznafY9fR1n6emIV2LQIiOvqnri56IZGwre+PC6v/z64 8Kkhi2By8FZwzWnP5t9pHc0W66q9ek66SK9Sj3p6DGt43zfwQo7s+ArI3Olc06zUNMXK dZrg== X-Gm-Message-State: AOAM533xYb1HXZNls70lmjo+zPQhijVqXVS8BF8A8wZyEmLNX/JR/nl8 NQEi0r+SxZ8pNBMlvVSoa4rqu4/2to4= X-Google-Smtp-Source: ABdhPJzKBvF5Ziwx2+E+trgdMZxF0KjhGW9TSeL7CswHG6Q+vtd8K89/xvJburP5xTfbwf0/PF34cg== X-Received: by 2002:a05:6214:184c:: with SMTP id d12mr5661756qvy.43.1613827364449; Sat, 20 Feb 2021 05:22:44 -0800 (PST) Received: from localhost.localdomain ([181.23.89.132]) by smtp.gmail.com with ESMTPSA id v19sm5603770qto.28.2021.02.20.05.22.43 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Feb 2021 05:22:43 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Sat, 20 Feb 2021 10:21:47 -0300 Message-Id: <20210220132147.772-1-jamrial@gmail.com> X-Mailer: git-send-email 2.30.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] avutil/buffer: free all pooled buffers immediately after uninitializing the pool X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" 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. Signed-off-by: James Almer --- libavutil/buffer.c | 19 ++++++++++++++----- 1 file 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); }